From 536ebb2742d8cdf815227beedcb6260c1e6bd7e7 Mon Sep 17 00:00:00 2001 From: Christian Peel Date: Sun, 26 Aug 2018 16:05:10 -0700 Subject: [PATCH] Updates for Julia 1.0 * Fixes bug (see #5) in hard_sphere which was not returning the right indices. * Added more explicit description of the arguments to hard_sphere * Updated benchmarks, README to match recent changes. Added .toml files --- .travis.yml | 1 + Manifest.toml | 164 ++++++++++++++++++++++++++++++++ Project.toml | 14 +++ README.md | 17 ++-- REQUIRE | 2 +- benchmark/lrtest.jl | 12 +-- benchmark/perfVsDataTypeN16.png | Bin 24661 -> 26998 bytes benchmark/perfVsNfloat32.png | Bin 28461 -> 29875 bytes benchmark/perftest.jl | 17 +--- src/hard_sphere.jl | 41 ++++---- src/seysen.jl | 2 +- test/runtests.jl | 7 +- 12 files changed, 229 insertions(+), 48 deletions(-) create mode 100644 Manifest.toml create mode 100644 Project.toml diff --git a/.travis.yml b/.travis.yml index 4738da1..27ec2d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ sudo: required language: julia julia: - 0.7 + - 1.0 - nightly notifications: email: false diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 0000000..881221c --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,164 @@ +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[BenchmarkTools]] +deps = ["JSON", "Pkg", "Printf", "Statistics", "Test"] +git-tree-sha1 = "623941d5eb10e440eb12c97183f96f2f0191d0ca" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "0.4.0" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random", "Test"] +git-tree-sha1 = "0e3209ba7418aed732e5c3818076b4400ee36c08" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.7.4" + +[[Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "InteractiveUtils", "Pkg", "Printf", "Reexport", "Test"] +git-tree-sha1 = "26f24e97782dd19d52cf97073c316897ac4d0e30" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.9.3" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "277d3807440d9793421354b6680911fc95d91a84" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "1.0.1" + +[[Conda]] +deps = ["Compat", "JSON", "VersionParsing"] +git-tree-sha1 = "a47f9a2c7b80095e6a935536795635522fe27f5d" +uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d" +version = "1.0.1" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["LinearAlgebra", "Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[FixedPointNumbers]] +deps = ["Pkg", "Test"] +git-tree-sha1 = "31cbf24d537a217475b37274df05de09882b53f1" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.5.2" + +[[InteractiveUtils]] +deps = ["LinearAlgebra", "Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[JSON]] +deps = ["Dates", "Distributed", "Mmap", "Pkg", "Sockets", "Test", "Unicode"] +git-tree-sha1 = "fec8e4d433072731466d37ed0061b3ba7f70eeb9" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.19.0" + +[[LaTeXStrings]] +deps = ["Compat"] +git-tree-sha1 = "7ab9b8788cfab2bdde22adf9004bda7ad9954b6c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.0.2" + +[[LibGit2]] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Compat"] +git-tree-sha1 = "c443e1c8d58a4e9f61b708ad0a88286c7042145b" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.4.4" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[Pkg]] +deps = ["Dates", "LibGit2", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[PyCall]] +deps = ["Compat", "Conda", "MacroTools", "Statistics", "VersionParsing"] +git-tree-sha1 = "993d80a2cfd0fc4b2acc698370a4f9761b27cd9e" +uuid = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" +version = "1.18.2" + +[[PyPlot]] +deps = ["Base64", "Colors", "Compat", "LaTeXStrings", "PyCall", "VersionParsing"] +git-tree-sha1 = "1cc673ec375f6fa0e3652e23ba435195f8175387" +uuid = "d330b81b-6aea-500a-939a-2ce795aea3ee" +version = "2.6.1" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[Reexport]] +deps = ["Pkg"] +git-tree-sha1 = "7b1d07f411bc8ddb7977ec7f377b97b158514fe0" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "0.2.0" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[Test]] +deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[UUIDs]] +deps = ["Random"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[VersionParsing]] +deps = ["Compat"] +git-tree-sha1 = "c9d5aa108588b978bd859554660c8a5c4f2f7669" +uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" +version = "1.1.2" diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..e45a58c --- /dev/null +++ b/Project.toml @@ -0,0 +1,14 @@ +name = "LLLplus" +uuid = "debe38fc-a976-11e8-3c3c-550d720deef8" +keywords = ["lattice reduction", "LLL", "Seysen", "closest vector problem"] +authors = ["Christian Peel "] +version = "0.7.0" + +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/README.md b/README.md index 45d88c0..b7f6457 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # LLLplus [![Build Status](https://travis-ci.org/christianpeel/LLLplus.jl.svg?branch=master)](https://travis-ci.org/christianpeel/LLLplus.jl) -[![LLLplus](http://pkg.julialang.org/badges/LLLplus_release.svg)](http://pkg.julialang.org/?pkg=LLLplus&ver=0.6) +[![LLLplus](http://pkg.julialang.org/badges/LLLplus_release.svg)](http://pkg.julialang.org/?pkg=LLLplus&ver=0.7) Lattice reduction and related lattice tools are used in wireless communication, cryptography, and mathematics. This package provides @@ -9,7 +9,7 @@ the following tools: Lenstra-Lenstra-Lovacsz (LLL) lattice reduction, Seysen lattice reduction, a sphere decoder, and VBLAST matrix decomposition. This package was created as a way to explore the Julia language, and is not intended to be a cannonical tool for lattice -reduction; use at your own risk! :-) +reduction; *use at your own risk!* :-) [LLL](https://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm) [1] lattice reduction is a powerful tool in computer science that is used @@ -57,11 +57,10 @@ M = 200; println("Testing VBLAST on $(M)x$(M) chunk of same matrix...") @time (W,P,B) = vblast(H[1:M,1:M]); -# Time LLL, Seysen decompositions of a 100x100 Int128 matrix with +# Time LLL, Seysen decompositions of a 100x100 Int64 matrix with # rand entries distributed uniformly between -100:100 N = 100; -H = zeros(Int64, N,N); -rand!(-100:100, H); +H = rand(-100:100,N,N); println("Testing LLL on $(N)x$(N) real matrix...") @time (B,T,Q,R) = lll(H); println("Testing Seysen on same $(N)x$(N) matrix...") @@ -70,8 +69,8 @@ println("Testing Seysen on same $(N)x$(N) matrix...") ### Execution Time results -On this page we give a few performance results from tests run on -Travis-CI during normal CI tests: +On this page we give a few performance results obtained from the +following command in the top-level LLLplus directory: `julia -e 'include("benchmark/perftest.jl")'` In the tests we time execution of the lattice-reduction functions, average the results over multiple random matrices, and show results as @@ -90,7 +89,7 @@ Though the focus of the package is on floating-point, all the modules can handle a variety of data types. In the next figure we show execution time for several datatypes (Int32, Int64, Int128, Float64, BitInt, and BigFloat) which are used to -generate 10 4x4 matrices, over which execution time for the lattice +generate 100 4x4 matrices, over which execution time for the lattice reduction techniques is averaged. The vertical axis is a logarithmic representation of execution time as in the previous figure. ![Time vs data type](benchmark/perfVsDataTypeN16.png) @@ -98,6 +97,8 @@ figure. ![Time vs data type](benchmark/perfVsDataTypeN16.png) ### Future Possible improvements include: +* Change from "LLLplus" to "LLLtoy" or some such to emphasize + the nature of this package. * Add Block-Korkin-Zolotarev lattice redution, with improvements as in [4], and Brun lattice reduction * The [SVP](http://www.latticechallenge.org/svp-challenge/) Challenge diff --git a/REQUIRE b/REQUIRE index cdbb2dc..859ad46 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1 +1 @@ -julia 0.7-alpha +julia 0.7 diff --git a/benchmark/lrtest.jl b/benchmark/lrtest.jl index 9f9a983..3228899 100644 --- a/benchmark/lrtest.jl +++ b/benchmark/lrtest.jl @@ -77,7 +77,7 @@ for a=1:length(out[1][2]) times[k] = out[k][1][a]; end plotfun(xval,times,pColor[pIdx],label=out[1][2][a]); - pIdx = pIdx==length(pColor)? 1: pIdx + 1; + pIdx = pIdx==length(pColor) ? 1 : pIdx + 1; end xlabel(xlab); @@ -109,18 +109,17 @@ times = ones(Nalgs,Ns)*Inf; hermitef = ones(Nalgs,Ns)*Inf; orthf = ones(Nalgs,Ns)*Inf; #algNames = cell(Nalgs) -algNames = Array{Any}(Nalgs) - -data = Array{dataType}(N,N); +algNames = Array{Any,1}(undef,Nalgs) +data = Array{dataType,2}(undef,N,N); for ix = 1:Ns cnum = Inf; - while cnum>1e5 # With Ints need to check for singular matrices + while cnum > 1e5 # With Ints need to check for singular matrices data = randf!(data); if !(dataType<:BigInt || dataType<:BigFloat) cnum = cond(data) else - cnum = 0 + cnum = 0.0 end end @@ -159,6 +158,7 @@ end outtimes = zeros(Nalgs,1); outHF = zeros(Nalgs,1); outOF = zeros(Nalgs,1); +mean(x) = sum(x)/length(x) for ax = 1:Nalgs # stimes = sort(vec(times[ax,:])); # outtimes[ax] = mean(stimes[1:floor(Ns*2/3)]); diff --git a/benchmark/perfVsDataTypeN16.png b/benchmark/perfVsDataTypeN16.png index c23fd7c8e6cbd6dbb397d031652450d385e221a8..db2611d30be565ef2eae8a8ee4fd3f302bfdd961 100644 GIT binary patch literal 26998 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

sjM8g+<_Fbqk1l$UWEYc`le8I zRuM<}OV#WjFc1qz?Q}gkc^EwS<}enHiC<}_Wp79ero_g^(p@y;?-=9=mY!*hox&Y7 z0k(?V^FFZTP{v*;bWX9oBIofk`vVsCD)NTYw8aw`PNNGaYb#>nT@pBQSA_Qb z5wawj0>sWKi75mzs>4N8@AYTHp9v|+$(PU$0I6Ug!~4Cme#nq#7HU>D0#gf5PEHQ( zcvmW}c~M*PfoJ+of_e4o52%LB!Oh+O`m_Cnf3P{DeRDBN4stnA5Gc$-PL{K1u@~yc z*0#1HJht{zt*6q1vdU;lOV)n^;odd;_OEDO3@* z?Wqc2>m)foNw&El0Om;@KGD$U&sTcO-I)kvany~+yta?(nB;+;QE1n=20@e!S`>9R zx9z+#rXhI3E+0&*-#?6AaTWSo)bwcfwnxODw10HwKAFhQOc~{WP@)m+%eMo*sK>KsS zm+Bl!;aFifVQ#Q^u?UCZGE9{d-Yp zVd{|DhCY5|K7aoF*-833DCuq}1?Z=zkj$_r$ys|qJD1mD@f ziCB>8rU5d9G?Z@=z+l5;Vq$zhUOU`?L>z9A)9rf6nfBF08^x;J+?LdJK@H}t6yT)| z@cW8D{WmZ$U@Lzh3|c6!f}$rr_zw{OkRIqCjH*S%h?JCIP1 zYTa)2`SWM0uW!YhD!&rqjvw*h(X?l7G>yh*RCCqa%c}vYXA9n1=5c_qdUNsPth2Nd zw|>Q;@o}6Rd}@z6tE1V*yZqnH_`iDj3|`8C1H$0%$@|CyYvn;3-#sDzKV4T{FZ6?|@tKO* znVI7C8&acMnBNTT#t`YiLZ3H3JdQ`_(|^xNp>{v9_-!QB55Y7`T9E5nUE!f?Q8FD! zBXVGgktY#>9oTJ;`ERm20$z&-_0yZ8%|Hs{5)zn*iVMFK;fu>o;BbYBYu?!FDMk!p z$MD13iIksnaBz_Bkfa)$fxs*VO2TgKM~@x>IO$3S%})VELk!;z=fqQ3Gu2x#j&L4u*o__}AC6}P!8te*zdl{LT)GtNiV!3O9S`_a^$D{(fHe&q@ zm{$~7nL|F8I)cPR^7ToEx;-4LD$Y%%N(#))%+x`9&Ojh9?nJvvIw%tp%xAH)ah60$ zJs5@qS45Nqw8a^y%Ypzc(j9by@h+*B%WW?`Y;n|JS`(Y71z`U2XM8YpeJ%48qu znOGy`0_jJ!N;R!Rd}o%{oTk5BXQ3u$19o48CKmk@JdN{y)T}HY%>N}RF3u_>B=nb_^n}bV zu4~FgV>xx|6xjMqL~(KPME`jb zWH>v{hzNOhy022T*J%E8NhdxM`}@Gzb;KZ`2{i`?aYTa5GV7jin7oLf6?^&T!R)Lo zJ7ftDFRxeHh_skVfzfyQE1S_6Ku)vCQ(@yrCe9+G^D zIA?6X(cS&a>g0&1`<3L-S%Zz0H6%86oen&MY;0@@l?xY?k+`{dc_UYTjvZ`iZ*N3F zxmHwEl&A%Vtn@p|{7?xVdfhbC-Ku46&3XYi}3FAQhABoH2t0m0r zZ;^E^tfE&FA3uH^tXcWB1E>!Jfv4CA+yf7wGA&j6>zg6!5Z;svayuD+fLU2jBo zwiKRNq0`F@$;26s;2%t&*M&94@Y$2>zlPG>nqO1y9-f||sG)hcTe4yW;3mpI;Cnz6 z*!krM5($Ak0@>bk{FQ|8!3)A9Z8@P8s3uR71li+O zRO}_c4CB+=5-C{vTLDrzOBm*2DUgaxB19Cu(0Do#$)=!Efg z2s?fK{1hq=P^rf#mzUgrP{cA01)#(rN2WKG0*qaL1L~2(mlc4vUyGbZy|-D+nSZwu zo`61JN)pon9G24FKy{cQqkHCIIALf&euQS=>R5X4KzAcW%$b*b0STk#{r_Oq@fC)B XBHLot@A?KTfgm(Bbf^Vtwio{k+I5Eb literal 24661 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 diff --git a/benchmark/perfVsNfloat32.png b/benchmark/perfVsNfloat32.png index 5ef3dc5b56bd6d0ac2edc24feb08ad4cd90db2b7..53219ee769aba7e84baaacfd2c9e2c6ff8388285 100644 GIT binary patch literal 29875 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 idzT~OC&qKL3Zlym_#>w#` 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

MR_pi&FcH6-3`iY@VBKk|gK@yT=EDmLQD? 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

=@ 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 bwKFLvFAD5)XNyOJQ8GChCF#_2w_X1S8*NBT literal 28461 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

%_cC$y0>|Q17+;;Bx;h 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 diff --git a/benchmark/perftest.jl b/benchmark/perftest.jl index 65fcd67..c00bea9 100644 --- a/benchmark/perftest.jl +++ b/benchmark/perftest.jl @@ -1,21 +1,14 @@ -if VERSION<=v"0.6.3" - include("../src/LLLplus.jl") -else - using Pkg -end - -Pkg.add("PyPlot") -Pkg.add("BenchmarkTools") -Pkg.add("Docile") - using PyPlot using BenchmarkTools using LLLplus +using Printf +using Random +using LinearAlgebra include("lrtest.jl") -lrtest(5,2.^[2],[100],[Int32,Int64,Int128,Float64,BigInt,BigFloat],"rand") +lrtest(5,2 .^[2],[100],[Int32,Int64,Int128,Float64,BigInt,BigFloat],"rand") savefig("benchmark/perfVsDataTypeN16.png") # run from root directory -lrtest(5,2.^[0:5;],[1],[Float64],"randn") +lrtest(5,2 .^[0:5;],[1],[Float64],"randn") savefig("benchmark/perfVsNfloat32.png") # run from root directory diff --git a/src/hard_sphere.jl b/src/hard_sphere.jl index d723783..7739976 100644 --- a/src/hard_sphere.jl +++ b/src/hard_sphere.jl @@ -1,32 +1,41 @@ # @doc """ -# x=hard_sphere(y,H,Nc) -# Solve the problem argmin_x ||y-Hx||, where the elements of x are -# integers. The input vector y is of dimension N, with H of dimension N -# by M, and the returned vector x of dimension M and comes from the -# integers 0:Nc-1. -# X=hard_sphere(Y,H,Nc) -# The input may be a matrix Y of dimension N by Ns, in which case -# the problem is solved for each column of Y, with the solutions in -# the columns of X. +#x=hard_sphere(y,H,Nc) +# Solve the problem argmin_x ||y-Hx||. The input vector y is of +# length N, with H of dimension N by M, and the returned vector x of +# length M. If Nc is even the elements of x are integers from +# [0:Nc-1]*2-(Nc-1); odd Nc is not yet supported. For Nc=2, we're +# searching the 2PAM constellation of [-1,1], and for nInt=4 we're +# searching [-3,-1,1,3]. +#X=hard_sphere(Y,H,Nc) +# The input may be a matrix Y of dimension N by Ns, in which case the +# problem is solved for each column of Y, with the solutions in the +# columns of X. # # Examples: # X = hard_sphere([1 2]', [1 2; 3 4],2) # X = hard_sphere(rand(0:20,2,15), [1 2; 3 4],2) # """ -> -function hard_sphere(Y::Array{Td,2},H::Array{Td,2},Nc) where {Td} +function hard_sphere(Y::AbstractArray{Td,2},H::AbstractArray{Td,2},Nc::Integer) where {Td} (N,M) = size(H); - if length(Nc)==1; - Nc = ones(M,1)*Nc; + Qc = ones(M)*Nc; + if iseven(Nc) + xoffset = Qc.-1 + xmult = 2 + else + @error("Odd Nc is not yet supported.") + # To find a failing case, remove @error above, and compare w full + # search. The fix is likely minor (once it is found). + xoffset = floor.(Qc/2) + xmult = 1 end (Q,R) = qr(H); (N,Ns) = size(Y); Xh = zeros(Int,M,Ns); for ns = 1:Ns - yp = (Q'*Y[:,ns] + R*ones(M,1).*(Nc.-1))/2; - xp = algII_smart(yp,R,Nc); - # Xh[:,ns] = xp*2 -(Nc-1); - Xh[:,ns] = xp + yp = (Q'*Y[:,ns] + R*ones(M,1).*xoffset)/xmult; + xp = algII_smart(yp,R,Qc); + Xh[:,ns] = xp*xmult - xoffset; end return Xh diff --git a/src/seysen.jl b/src/seysen.jl index 73e70e2..997f25f 100644 --- a/src/seysen.jl +++ b/src/seysen.jl @@ -1,5 +1,5 @@ function seysen(H::Array{Td,2}) where {Td} -# [B,T,B_dual,num_it] = seysen{Td}(H::Array{Td,2}) +# [B,T,B_dual,num_it] = seysen(H::Array{Td,2}) where Td # # Do greedy Seysen lattice reduction on the matrix H (real or # complex-valued), returning T a unimodular matrix that reduces H; diff --git a/test/runtests.jl b/test/runtests.jl index c911ea5..3cf1e5d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -73,10 +73,9 @@ C = [-1,1]; Z = rand(1:2,N,Ns); X = C[Z]; Y = H*X+NN; -@time Zt = hard_sphere(Y,H,2); -@time Zt = hard_sphere(Y,H,2); -Zh = Zt.+1; -errRate = sum(abs.(Z.-Zh))/Ns; +@time Xt = hard_sphere(Y,H,2); +@time Xt = hard_sphere(Y,H,2); +errRate = sum(abs.(X-Xt))/Ns; println("Error Rate is $(errRate). It should be zero or very small.\n") # --------------