diff --git a/.JuliaFormatter.toml b/.JuliaFormatter.toml new file mode 100644 index 0000000..a700a07 --- /dev/null +++ b/.JuliaFormatter.toml @@ -0,0 +1,8 @@ +# Configuration file for JuliaFormatter.jl +# For more information, see: https://domluna.github.io/JuliaFormatter.jl/stable/config/ + +always_for_in = true +always_use_return = true +margin = 80 +remove_extra_newlines = true +short_to_long_function_def = true diff --git a/.github/workflows/CompatHelper.yml b/.github/workflows/CompatHelper.yml new file mode 100644 index 0000000..dd821e6 --- /dev/null +++ b/.github/workflows/CompatHelper.yml @@ -0,0 +1,19 @@ +name: CompatHelper + +on: + schedule: + - cron: '00 00 * * *' + +jobs: + CompatHelper: + runs-on: ubuntu-latest + steps: + - uses: julia-actions/setup-julia@latest + with: + version: 1.3 + - name: Pkg.add("CompatHelper") + run: julia -e 'using Pkg; Pkg.add("CompatHelper")' + - name: CompatHelper.main() + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: julia -e 'using CompatHelper; CompatHelper.main()' diff --git a/.github/workflows/TagBot.yml b/.github/workflows/TagBot.yml new file mode 100644 index 0000000..d77d3a0 --- /dev/null +++ b/.github/workflows/TagBot.yml @@ -0,0 +1,11 @@ +name: TagBot +on: + schedule: + - cron: 0 * * * * +jobs: + TagBot: + runs-on: ubuntu-latest + steps: + - uses: JuliaRegistries/TagBot@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..beb8d28 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,43 @@ +name: CI +on: + push: + branches: [master] + pull_request: + types: [opened, synchronize, reopened] +jobs: + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: ['1.6', '1'] # Test against LTS + os: [ubuntu-latest, macOS-latest, windows-latest] + arch: [x64] + include: + # Also test against 32-bit Linux on LTS. + - version: '1.6' + os: ubuntu-latest + arch: x86 + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v1 + with: + file: lcov.info diff --git a/.github/workflows/format_check.yml b/.github/workflows/format_check.yml new file mode 100644 index 0000000..b242237 --- /dev/null +++ b/.github/workflows/format_check.yml @@ -0,0 +1,30 @@ +name: format-check +on: + push: + branches: + - master + - release-* + pull_request: + types: [opened, synchronize, reopened] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: julia-actions/setup-julia@latest + with: + version: '1' + - uses: actions/checkout@v1 + - name: Format check + shell: julia --color=yes {0} + run: | + using Pkg + Pkg.add(PackageSpec(name="JuliaFormatter", version="0.22.4")) + using JuliaFormatter + format(".", verbose=true) + out = String(read(Cmd(`git diff`))) + if isempty(out) + exit(0) + end + @error "Some files have not been formatted !!!" + write(stdout, out) + exit(1) diff --git a/.gitignore b/.gitignore index 8c960ec..3f02ca7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.jl.cov *.jl.*.cov *.jl.mem +Manifest.toml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8be7a3d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,40 +0,0 @@ -## Documentation: http://docs.travis-ci.com/user/languages/julia/ -language: julia -os: - - linux - - osx -julia: - - 0.6 - - nightly -notifications: - email: false -git: - depth: 99999999 - -## uncomment the following lines to allow failures on nightly julia -## (tests will run but not make your overall status red) -#matrix: -# allow_failures: -# - julia: nightly - -## uncomment and modify the following lines to manually install system packages -#addons: -# apt: # apt-get for linux -# packages: -# - gfortran -#before_script: # homebrew for mac -# - if [ $TRAVIS_OS_NAME = osx ]; then brew install gcc; fi - -## uncomment the following lines to override the default test script -#script: -# - julia -e 'Pkg.clone(pwd()); Pkg.build("SDPLR"); Pkg.test("SDPLR"; coverage=true)' -addons: - apt_packages: - - gfortran - - liblapack-dev - - libopenblas-dev -after_success: - # push coverage results to Coveralls - - julia -e 'cd(Pkg.dir("SDPLR")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' - # push coverage results to Codecov - - julia -e 'cd(Pkg.dir("SDPLR")); Pkg.add("Coverage"); using Coverage; Codecov.submit(Codecov.process_folder())' diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..a6a0ced --- /dev/null +++ b/Project.toml @@ -0,0 +1,10 @@ +name = "SDPLR" +uuid = "56161740-ea4e-4253-9d15-43c62ff94d95" +authors = ["BenoƮt Legat "] +version = "0.1.0" + +[deps] +SDPLR_jll = "3a057b76-36a0-51f0-a66f-6d580b8e8efd" + +[compat] +julia = "1.6" diff --git a/REQUIRE b/REQUIRE deleted file mode 100644 index 90229f6..0000000 --- a/REQUIRE +++ /dev/null @@ -1,2 +0,0 @@ -julia 0.6 -BinDeps diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 3b9ecd6..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,50 +0,0 @@ -image: unstable - -environment: - matrix: - - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x86/0.6/julia-0.6-latest-win32.exe" - - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x64/0.6/julia-0.6-latest-win64.exe" - - JULIA_URL: "https://julialangnightlies-s3.julialang.org/bin/winnt/x86/julia-latest-win32.exe" - - JULIA_URL: "https://julialangnightlies-s3.julialang.org/bin/winnt/x64/julia-latest-win64.exe" - -## uncomment the following lines to allow failures on nightly julia -## (tests will run but not make your overall status red) -#matrix: -# allow_failures: -# - JULIA_URL: "https://julialangnightlies-s3.julialang.org/bin/winnt/x86/julia-latest-win32.exe" -# - JULIA_URL: "https://julialangnightlies-s3.julialang.org/bin/winnt/x64/julia-latest-win64.exe" - -branches: - only: - - master - - /release-.*/ - -notifications: - - provider: Email - on_build_success: false - on_build_failure: false - on_build_status_changed: false - -install: - - ps: "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12" -# If there's a newer build queued for the same PR, cancel this one - - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod ` - https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | ` - Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { ` - throw "There are newer queued builds for this pull request, failing early." } -# Download most recent Julia Windows binary - - ps: (new-object net.webclient).DownloadFile( - $env:JULIA_URL, - "C:\projects\julia-binary.exe") -# Run installer silently, output to C:\projects\julia - - C:\projects\julia-binary.exe /S /D=C:\projects\julia - - set PATH=C:\MinGW\bin;%PATH% - -build_script: -# Need to convert from shallow to complete for Pkg.clone to work - - IF EXIST .git\shallow (git fetch --unshallow) - - C:\projects\julia\bin\julia -e "versioninfo(); - Pkg.clone(pwd(), \"SDPLR\"); cd(Pkg.dir(\"SDPLR\", \"deps\")); include(\"build.jl\")" - -test_script: - - C:\projects\julia\bin\julia -e "Pkg.test(\"SDPLR\")" diff --git a/deps/.gitignore b/deps/.gitignore deleted file mode 100644 index 6ab95a0..0000000 --- a/deps/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -downloads -src -usr diff --git a/deps/blas_lapack_mingw.patch b/deps/blas_lapack_mingw.patch deleted file mode 100644 index c4a6753..0000000 --- a/deps/blas_lapack_mingw.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- Makefile.inc.mingw -+++ Makefile.inc.mingw -@@ -7,9 +7,6 @@ - # If a relative path is given next, it should be relative from the - # source/ subdirectory. - --LAPACK_LIB_DIR=../libmingw --LAPACK_LIB= -llapack -- - ############################## - # BLAS directory and library # - ############################## -@@ -17,14 +14,10 @@ LAPACK_LIB= -llapack - # If a relative path is given next, it should be relative from the - # source/ subdirectory. - --BLAS_LIB_DIR=../libmingw --BLAS_LIB= -lblas -- - #################### - # Main definitions # - #################### - - CC = gcc - CFLAGS = -O3 -static --LIB_DIRS = -L$(LAPACK_LIB_DIR) -L$(BLAS_LIB_DIR) - LIBS = -lgsl $(LAPACK_LIB) $(BLAS_LIB) -lgfortran -lm diff --git a/deps/build.jl b/deps/build.jl deleted file mode 100644 index 8ae867f..0000000 --- a/deps/build.jl +++ /dev/null @@ -1,69 +0,0 @@ -SDPLRname = "SDPLR-1.03-beta" - -uri = "http://sburer.github.io/files/$SDPLRname.zip" - -pkgdir = Pkg.dir("SDPLR") -rootdir = joinpath(pkgdir, "deps") -dwndir = joinpath(rootdir, "downloads") -zipfile = joinpath(dwndir, "$SDPLRname.zip") -dirsrc = joinpath(rootdir, "src") -_srcdir = joinpath(dirsrc, SDPLRname) -_bindir = joinpath(rootdir, "usr", "bin") - -osname = "linux" -@static if is_apple() - osname = "mac" -elseif is_windows() - osname = "mingw" -end - -# Taken from SDPA.jl at deps/blaslapack.jl -function ldflags(; libpath=Libdl.dlpath(libname), libname=first(split(basename(libpath), '.', limit=2))) - libdir = dirname(libpath) - # I use [4:end] to drop the "lib" at the beginning - linkname = libname[4:end] - info("Using $libname at $libpath : -L$libpath -L$libdir -l$libname -l$linkname") - "-L$libpath -L$libdir", "-l$libname -l$linkname -l$libpath -l$libname.DLL -l$libname.dll -l$linkname.DLL -l$linkname.dll" -end - -function blas_lib() - ldflags(libname=LinAlg.BLAS.libblas) -end - -function lapack_lib() - ldflags(libname=LinAlg.LAPACK.liblapack) -end - -const BLAS_L, BLAS_l = blas_lib() -const LAPACK_L, LAPACK_l = lapack_lib() - -using BinDeps - -BinDeps.run(@build_steps begin - CreateDirectory(dwndir) - `curl -f -o $zipfile -L $uri` - CreateDirectory(dirsrc) - `unzip -x $zipfile -d $dirsrc` - CreateDirectory(_bindir) - @build_steps begin - ChangeDirectory(_srcdir) - @static if is_windows() - @build_steps begin - pipeline(`patch -N -p0`, stdin="$rootdir/blas_lapack_mingw.patch") - pipeline(`julia -e "println(raw\"LIBS += $BLAS_l $LAPACK_l\")"`, stdout="Makefile.inc.$osname", append=true) - pipeline(`julia -e "println(raw\"LIB_DIRS = $BLAS_L $LAPACK_L\")"`, stdout="Makefile.inc.$osname", append=true) - end - end - `cp Makefile.inc.$osname Makefile.inc` - pipeline(`patch -N -p0`, stdin="$rootdir/main_argc.patch") - @static if is_windows() - @build_steps begin - pipeline(`patch -N -p0`, stdin="$rootdir/windows.patch") - `mingw32-make mingw` - end - else - `make` - end - `mv $_srcdir/sdplr $_bindir/sdplr` - end - end) diff --git a/deps/main_argc.patch b/deps/main_argc.patch deleted file mode 100644 index c754a70..0000000 --- a/deps/main_argc.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- source/main.c -+++ source/main.c -@@ -7,7 +7,7 @@ - #define RANDOM 0 - // #define DATABLOCKIND(DATA,BLOCK,NUMBLOCK) ((DATA+1)-1)*NUMBLOCK + BLOCK - 1 - --int main(size_t argc, char *argv[]) -+int main(int argc, char *argv[]) - { - size_t h, k, ret, n, nr, *maxranks, *ranks; - double *R, *lambda, pieces[8]; -diff --git a/source/proto.h b/source/proto.h -index fe47b8a..843db2b 100644 ---- source/proto.h -+++ source/proto.h -@@ -27,7 +27,7 @@ size_t updatelbfgs2(problemdata *data, lbfgsvec *vecs, double *dir, double *grad - /* linesearch.c */ - double linesearch(problemdata *data, double *R, double *D, double max, double *funcval, size_t update); - /* main.c */ --int main(size_t argc, char *argv[]); -+int main(int argc, char *argv[]); - size_t getstorage(size_t m, size_t numblk, size_t *blksz, char *blktype, size_t *CAinfo_entptr, size_t *passedn, size_t *passednr, size_t *maxranks); - size_t readin(size_t m, size_t numblk, size_t *blksz, char *blktype, double *R, double *lambda, size_t *maxranks, size_t *ranks, double *pieces, FILE *fid); - size_t writeout(size_t m, size_t numblk, size_t *blksz, char *blktype, double *R, double *lambda, size_t *maxranks, size_t *ranks, double *pieces, FILE *fid); diff --git a/deps/windows.patch b/deps/windows.patch deleted file mode 100644 index bae4eb5..0000000 --- a/deps/windows.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- Makefile -+++ Makefile -@@ -19,10 +19,10 @@ cleanall: clean - mingw: mingw_gsl mingw_sdplr - - mingw_gsl: -- cd gsl-1.5\poly & mingw32-make -+ cd gsl-1.5; cd poly; mingw32-make - - mingw_sdplr: -- cd source & mingw32-make -+ cd source; mingw32-make - - mingw_clean: - cd gsl-1.5\poly & mingw32-make mingw_clean diff --git a/src/SDPLR.jl b/src/SDPLR.jl index 2c384d8..125406a 100644 --- a/src/SDPLR.jl +++ b/src/SDPLR.jl @@ -1,9 +1,9 @@ module SDPLR -const BIN = "../deps/usr/bin/sdplr" +using SDPLR_jll -function solvesdpafile(file) - run(`$BIN $file`) +function solve_sdpa_file(file) + return run(`$(SDPLR_jll.sdplr()) $file`) end end # module diff --git a/test/Project.toml b/test/Project.toml new file mode 100644 index 0000000..5024722 --- /dev/null +++ b/test/Project.toml @@ -0,0 +1,3 @@ +[deps] +SDPLR = "56161740-ea4e-4253-9d15-43c62ff94d95" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/runtests.jl b/test/runtests.jl index cc58425..2057a1d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,3 @@ using SDPLR -using Base.Test -SDPLR.solvesdpafile("../deps/src/SDPLR-1.03-beta/data/vibra1.dat-s") +SDPLR.solve_sdpa_file("vibra1.dat-s") diff --git a/test/vibra1.dat-s b/test/vibra1.dat-s new file mode 100644 index 0000000..057b768 --- /dev/null +++ b/test/vibra1.dat-s @@ -0,0 +1,454 @@ + 36 + 3 + 24 25 -36 + 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 + 0 1 21 21 0.0100000000 + 0 1 22 22 0.0100000000 + 0 2 1 1 -0.5000000000 + 0 2 1 22 -1.0000000000 + 1 1 1 1 0.9975000000 + 1 1 2 2 -0.0025000000 + 1 2 2 2 1.0000000000 + 1 3 1 1 1.0000000000 + 2 1 3 3 0.6375000000 + 2 1 3 4 0.3200000000 + 2 1 4 4 0.1575000000 + 2 2 4 4 0.6400000000 + 2 2 4 5 0.3200000000 + 2 2 5 5 0.1600000000 + 2 3 2 2 1.0000000000 + 3 1 1 1 -0.0025000000 + 3 1 2 2 3.9975000000 + 3 1 3 3 -0.0025000000 + 3 1 2 4 -4.0000000000 + 3 1 4 4 3.9975000000 + 3 2 3 3 4.0000000000 + 3 2 3 5 -4.0000000000 + 3 2 5 5 4.0000000000 + 3 3 3 3 1.0000000000 + 4 1 1 1 0.6375000000 + 4 1 1 2 -0.3200000000 + 4 1 2 2 0.1575000000 + 4 2 2 2 0.6400000000 + 4 2 2 3 -0.3200000000 + 4 2 3 3 0.1600000000 + 4 3 4 4 1.0000000000 + 5 1 3 3 0.9975000000 + 5 1 4 4 -0.0025000000 + 5 2 4 4 1.0000000000 + 5 3 5 5 1.0000000000 + 6 1 5 5 0.6375000000 + 6 1 5 6 0.3200000000 + 6 1 6 6 0.1575000000 + 6 2 6 6 0.6400000000 + 6 2 6 7 0.3200000000 + 6 2 7 7 0.1600000000 + 6 3 6 6 1.0000000000 + 7 1 3 3 -0.0025000000 + 7 1 4 4 3.9975000000 + 7 1 5 5 -0.0025000000 + 7 1 4 6 -4.0000000000 + 7 1 6 6 3.9975000000 + 7 2 5 5 4.0000000000 + 7 2 5 7 -4.0000000000 + 7 2 7 7 4.0000000000 + 7 3 7 7 1.0000000000 + 8 1 3 3 0.6375000000 + 8 1 3 4 -0.3200000000 + 8 1 4 4 0.1575000000 + 8 2 4 4 0.6400000000 + 8 2 4 5 -0.3200000000 + 8 2 5 5 0.1600000000 + 8 3 8 8 1.0000000000 + 9 1 1 1 0.9975000000 + 9 1 2 2 -0.0025000000 + 9 1 1 7 -1.0000000000 + 9 1 7 7 0.9975000000 + 9 1 8 8 -0.0025000000 + 9 2 2 2 1.0000000000 + 9 2 2 8 -1.0000000000 + 9 2 8 8 1.0000000000 + 9 3 9 9 1.0000000000 + 10 1 1 1 0.6375000000 + 10 1 1 2 0.3200000000 + 10 1 2 2 0.1575000000 + 10 1 1 9 -0.6400000000 + 10 1 2 9 -0.3200000000 + 10 1 9 9 0.6375000000 + 10 1 1 10 -0.3200000000 + 10 1 2 10 -0.1600000000 + 10 1 9 10 0.3200000000 + 10 1 10 10 0.1575000000 + 10 2 2 2 0.6400000000 + 10 2 2 3 0.3200000000 + 10 2 3 3 0.1600000000 + 10 2 2 10 -0.6400000000 + 10 2 3 10 -0.3200000000 + 10 2 10 10 0.6400000000 + 10 2 2 11 -0.3200000000 + 10 2 3 11 -0.1600000000 + 10 2 10 11 0.3200000000 + 10 2 11 11 0.1600000000 + 10 3 10 10 1.0000000000 + 11 1 7 7 -0.0025000000 + 11 1 8 8 3.9975000000 + 11 1 9 9 -0.0025000000 + 11 1 8 10 -4.0000000000 + 11 1 10 10 3.9975000000 + 11 2 9 9 4.0000000000 + 11 2 9 11 -4.0000000000 + 11 2 11 11 4.0000000000 + 11 3 11 11 1.0000000000 + 12 1 3 3 0.6375000000 + 12 1 3 4 -0.3200000000 + 12 1 4 4 0.1575000000 + 12 1 3 7 -0.6400000000 + 12 1 4 7 0.3200000000 + 12 1 7 7 0.6375000000 + 12 1 3 8 0.3200000000 + 12 1 4 8 -0.1600000000 + 12 1 7 8 -0.3200000000 + 12 1 8 8 0.1575000000 + 12 2 4 4 0.6400000000 + 12 2 4 5 -0.3200000000 + 12 2 5 5 0.1600000000 + 12 2 4 8 -0.6400000000 + 12 2 5 8 0.3200000000 + 12 2 8 8 0.6400000000 + 12 2 4 9 0.3200000000 + 12 2 5 9 -0.1600000000 + 12 2 8 9 -0.3200000000 + 12 2 9 9 0.1600000000 + 12 3 12 12 1.0000000000 + 13 1 3 3 0.9975000000 + 13 1 4 4 -0.0025000000 + 13 1 3 9 -1.0000000000 + 13 1 9 9 0.9975000000 + 13 1 10 10 -0.0025000000 + 13 2 4 4 1.0000000000 + 13 2 4 10 -1.0000000000 + 13 2 10 10 1.0000000000 + 13 3 13 13 1.0000000000 + 14 1 3 3 0.6375000000 + 14 1 3 4 0.3200000000 + 14 1 4 4 0.1575000000 + 14 1 3 11 -0.6400000000 + 14 1 4 11 -0.3200000000 + 14 1 11 11 0.6375000000 + 14 1 3 12 -0.3200000000 + 14 1 4 12 -0.1600000000 + 14 1 11 12 0.3200000000 + 14 1 12 12 0.1575000000 + 14 2 4 4 0.6400000000 + 14 2 4 5 0.3200000000 + 14 2 5 5 0.1600000000 + 14 2 4 12 -0.6400000000 + 14 2 5 12 -0.3200000000 + 14 2 12 12 0.6400000000 + 14 2 4 13 -0.3200000000 + 14 2 5 13 -0.1600000000 + 14 2 12 13 0.3200000000 + 14 2 13 13 0.1600000000 + 14 3 14 14 1.0000000000 + 15 1 9 9 -0.0025000000 + 15 1 10 10 3.9975000000 + 15 1 11 11 -0.0025000000 + 15 1 10 12 -4.0000000000 + 15 1 12 12 3.9975000000 + 15 2 11 11 4.0000000000 + 15 2 11 13 -4.0000000000 + 15 2 13 13 4.0000000000 + 15 3 15 15 1.0000000000 + 16 1 5 5 0.6375000000 + 16 1 5 6 -0.3200000000 + 16 1 6 6 0.1575000000 + 16 1 5 9 -0.6400000000 + 16 1 6 9 0.3200000000 + 16 1 9 9 0.6375000000 + 16 1 5 10 0.3200000000 + 16 1 6 10 -0.1600000000 + 16 1 9 10 -0.3200000000 + 16 1 10 10 0.1575000000 + 16 2 6 6 0.6400000000 + 16 2 6 7 -0.3200000000 + 16 2 7 7 0.1600000000 + 16 2 6 10 -0.6400000000 + 16 2 7 10 0.3200000000 + 16 2 10 10 0.6400000000 + 16 2 6 11 0.3200000000 + 16 2 7 11 -0.1600000000 + 16 2 10 11 -0.3200000000 + 16 2 11 11 0.1600000000 + 16 3 16 16 1.0000000000 + 17 1 7 7 0.9975000000 + 17 1 8 8 -0.0025000000 + 17 1 7 13 -1.0000000000 + 17 1 13 13 0.9975000000 + 17 1 14 14 -0.0025000000 + 17 2 8 8 1.0000000000 + 17 2 8 14 -1.0000000000 + 17 2 14 14 1.0000000000 + 17 3 17 17 1.0000000000 + 18 1 7 7 0.6375000000 + 18 1 7 8 0.3200000000 + 18 1 8 8 0.1575000000 + 18 1 7 15 -0.6400000000 + 18 1 8 15 -0.3200000000 + 18 1 15 15 0.6375000000 + 18 1 7 16 -0.3200000000 + 18 1 8 16 -0.1600000000 + 18 1 15 16 0.3200000000 + 18 1 16 16 0.1575000000 + 18 2 8 8 0.6400000000 + 18 2 8 9 0.3200000000 + 18 2 9 9 0.1600000000 + 18 2 8 16 -0.6400000000 + 18 2 9 16 -0.3200000000 + 18 2 16 16 0.6400000000 + 18 2 8 17 -0.3200000000 + 18 2 9 17 -0.1600000000 + 18 2 16 17 0.3200000000 + 18 2 17 17 0.1600000000 + 18 3 18 18 1.0000000000 + 19 1 13 13 -0.0025000000 + 19 1 14 14 3.9975000000 + 19 1 15 15 -0.0025000000 + 19 1 14 16 -4.0000000000 + 19 1 16 16 3.9975000000 + 19 2 15 15 4.0000000000 + 19 2 15 17 -4.0000000000 + 19 2 17 17 4.0000000000 + 19 3 19 19 1.0000000000 + 20 1 9 9 0.6375000000 + 20 1 9 10 -0.3200000000 + 20 1 10 10 0.1575000000 + 20 1 9 13 -0.6400000000 + 20 1 10 13 0.3200000000 + 20 1 13 13 0.6375000000 + 20 1 9 14 0.3200000000 + 20 1 10 14 -0.1600000000 + 20 1 13 14 -0.3200000000 + 20 1 14 14 0.1575000000 + 20 2 10 10 0.6400000000 + 20 2 10 11 -0.3200000000 + 20 2 11 11 0.1600000000 + 20 2 10 14 -0.6400000000 + 20 2 11 14 0.3200000000 + 20 2 14 14 0.6400000000 + 20 2 10 15 0.3200000000 + 20 2 11 15 -0.1600000000 + 20 2 14 15 -0.3200000000 + 20 2 15 15 0.1600000000 + 20 3 20 20 1.0000000000 + 21 1 9 9 0.9975000000 + 21 1 10 10 -0.0025000000 + 21 1 9 15 -1.0000000000 + 21 1 15 15 0.9975000000 + 21 1 16 16 -0.0025000000 + 21 2 10 10 1.0000000000 + 21 2 10 16 -1.0000000000 + 21 2 16 16 1.0000000000 + 21 3 21 21 1.0000000000 + 22 1 9 9 0.6375000000 + 22 1 9 10 0.3200000000 + 22 1 10 10 0.1575000000 + 22 1 9 17 -0.6400000000 + 22 1 10 17 -0.3200000000 + 22 1 17 17 0.6375000000 + 22 1 9 18 -0.3200000000 + 22 1 10 18 -0.1600000000 + 22 1 17 18 0.3200000000 + 22 1 18 18 0.1575000000 + 22 2 10 10 0.6400000000 + 22 2 10 11 0.3200000000 + 22 2 11 11 0.1600000000 + 22 2 10 18 -0.6400000000 + 22 2 11 18 -0.3200000000 + 22 2 18 18 0.6400000000 + 22 2 10 19 -0.3200000000 + 22 2 11 19 -0.1600000000 + 22 2 18 19 0.3200000000 + 22 2 19 19 0.1600000000 + 22 3 22 22 1.0000000000 + 23 1 15 15 -0.0025000000 + 23 1 16 16 3.9975000000 + 23 1 17 17 -0.0025000000 + 23 1 16 18 -4.0000000000 + 23 1 18 18 3.9975000000 + 23 2 17 17 4.0000000000 + 23 2 17 19 -4.0000000000 + 23 2 19 19 4.0000000000 + 23 3 23 23 1.0000000000 + 24 1 11 11 0.6375000000 + 24 1 11 12 -0.3200000000 + 24 1 12 12 0.1575000000 + 24 1 11 15 -0.6400000000 + 24 1 12 15 0.3200000000 + 24 1 15 15 0.6375000000 + 24 1 11 16 0.3200000000 + 24 1 12 16 -0.1600000000 + 24 1 15 16 -0.3200000000 + 24 1 16 16 0.1575000000 + 24 2 12 12 0.6400000000 + 24 2 12 13 -0.3200000000 + 24 2 13 13 0.1600000000 + 24 2 12 16 -0.6400000000 + 24 2 13 16 0.3200000000 + 24 2 16 16 0.6400000000 + 24 2 12 17 0.3200000000 + 24 2 13 17 -0.1600000000 + 24 2 16 17 -0.3200000000 + 24 2 17 17 0.1600000000 + 24 3 24 24 1.0000000000 + 25 1 13 13 0.9975000000 + 25 1 14 14 -0.0025000000 + 25 1 13 19 -1.0000000000 + 25 1 19 19 0.9975000000 + 25 1 20 20 -0.0025000000 + 25 2 14 14 1.0000000000 + 25 2 14 20 -1.0000000000 + 25 2 20 20 1.0000000000 + 25 3 25 25 1.0000000000 + 26 1 13 13 0.6375000000 + 26 1 13 14 0.3200000000 + 26 1 14 14 0.1575000000 + 26 1 13 21 -0.6400000000 + 26 1 14 21 -0.3200000000 + 26 1 21 21 0.6375000000 + 26 1 13 22 -0.3200000000 + 26 1 14 22 -0.1600000000 + 26 1 21 22 0.3200000000 + 26 1 22 22 0.1575000000 + 26 2 14 14 0.6400000000 + 26 2 14 15 0.3200000000 + 26 2 15 15 0.1600000000 + 26 2 14 22 -0.6400000000 + 26 2 15 22 -0.3200000000 + 26 2 22 22 0.6400000000 + 26 2 14 23 -0.3200000000 + 26 2 15 23 -0.1600000000 + 26 2 22 23 0.3200000000 + 26 2 23 23 0.1600000000 + 26 3 26 26 1.0000000000 + 27 1 19 19 -0.0025000000 + 27 1 20 20 3.9975000000 + 27 1 21 21 -0.0025000000 + 27 1 20 22 -4.0000000000 + 27 1 22 22 3.9975000000 + 27 2 21 21 4.0000000000 + 27 2 21 23 -4.0000000000 + 27 2 23 23 4.0000000000 + 27 3 27 27 1.0000000000 + 28 1 15 15 0.6375000000 + 28 1 15 16 -0.3200000000 + 28 1 16 16 0.1575000000 + 28 1 15 19 -0.6400000000 + 28 1 16 19 0.3200000000 + 28 1 19 19 0.6375000000 + 28 1 15 20 0.3200000000 + 28 1 16 20 -0.1600000000 + 28 1 19 20 -0.3200000000 + 28 1 20 20 0.1575000000 + 28 2 16 16 0.6400000000 + 28 2 16 17 -0.3200000000 + 28 2 17 17 0.1600000000 + 28 2 16 20 -0.6400000000 + 28 2 17 20 0.3200000000 + 28 2 20 20 0.6400000000 + 28 2 16 21 0.3200000000 + 28 2 17 21 -0.1600000000 + 28 2 20 21 -0.3200000000 + 28 2 21 21 0.1600000000 + 28 3 28 28 1.0000000000 + 29 1 15 15 0.9975000000 + 29 1 16 16 -0.0025000000 + 29 1 15 21 -1.0000000000 + 29 1 21 21 0.9975000000 + 29 1 22 22 -0.0025000000 + 29 2 16 16 1.0000000000 + 29 2 16 22 -1.0000000000 + 29 2 22 22 1.0000000000 + 29 3 29 29 1.0000000000 + 30 1 15 15 0.6375000000 + 30 1 15 16 0.3200000000 + 30 1 16 16 0.1575000000 + 30 1 15 23 -0.6400000000 + 30 1 16 23 -0.3200000000 + 30 1 23 23 0.6375000000 + 30 1 15 24 -0.3200000000 + 30 1 16 24 -0.1600000000 + 30 1 23 24 0.3200000000 + 30 1 24 24 0.1575000000 + 30 2 16 16 0.6400000000 + 30 2 16 17 0.3200000000 + 30 2 17 17 0.1600000000 + 30 2 16 24 -0.6400000000 + 30 2 17 24 -0.3200000000 + 30 2 24 24 0.6400000000 + 30 2 16 25 -0.3200000000 + 30 2 17 25 -0.1600000000 + 30 2 24 25 0.3200000000 + 30 2 25 25 0.1600000000 + 30 3 30 30 1.0000000000 + 31 1 21 21 -0.0025000000 + 31 1 22 22 3.9975000000 + 31 1 23 23 -0.0025000000 + 31 1 22 24 -4.0000000000 + 31 1 24 24 3.9975000000 + 31 2 23 23 4.0000000000 + 31 2 23 25 -4.0000000000 + 31 2 25 25 4.0000000000 + 31 3 31 31 1.0000000000 + 32 1 17 17 0.6375000000 + 32 1 17 18 -0.3200000000 + 32 1 18 18 0.1575000000 + 32 1 17 21 -0.6400000000 + 32 1 18 21 0.3200000000 + 32 1 21 21 0.6375000000 + 32 1 17 22 0.3200000000 + 32 1 18 22 -0.1600000000 + 32 1 21 22 -0.3200000000 + 32 1 22 22 0.1575000000 + 32 2 18 18 0.6400000000 + 32 2 18 19 -0.3200000000 + 32 2 19 19 0.1600000000 + 32 2 18 22 -0.6400000000 + 32 2 19 22 0.3200000000 + 32 2 22 22 0.6400000000 + 32 2 18 23 0.3200000000 + 32 2 19 23 -0.1600000000 + 32 2 22 23 -0.3200000000 + 32 2 23 23 0.1600000000 + 32 3 32 32 1.0000000000 + 33 1 5 5 0.9975000000 + 33 1 6 6 -0.0025000000 + 33 2 6 6 1.0000000000 + 33 3 33 33 1.0000000000 + 34 1 5 5 0.9975000000 + 34 1 6 6 -0.0025000000 + 34 1 5 11 -1.0000000000 + 34 1 11 11 0.9975000000 + 34 1 12 12 -0.0025000000 + 34 2 6 6 1.0000000000 + 34 2 6 12 -1.0000000000 + 34 2 12 12 1.0000000000 + 34 3 34 34 1.0000000000 + 35 1 11 11 0.9975000000 + 35 1 12 12 -0.0025000000 + 35 1 11 17 -1.0000000000 + 35 1 17 17 0.9975000000 + 35 1 18 18 -0.0025000000 + 35 2 12 12 1.0000000000 + 35 2 12 18 -1.0000000000 + 35 2 18 18 1.0000000000 + 35 3 35 35 1.0000000000 + 36 1 17 17 0.9975000000 + 36 1 18 18 -0.0025000000 + 36 1 17 23 -1.0000000000 + 36 1 23 23 0.9975000000 + 36 1 24 24 -0.0025000000 + 36 2 18 18 1.0000000000 + 36 2 18 24 -1.0000000000 + 36 2 24 24 1.0000000000 + 36 3 36 36 1.0000000000 +