From 6e2c58b190e755cfdbb943090feb5326d9089c01 Mon Sep 17 00:00:00 2001 From: odow Date: Tue, 22 Feb 2022 16:51:10 +1300 Subject: [PATCH] Add JuliaFormatter --- .JuliaFormatter.toml | 8 + .github/workflows/format_check.yml | 30 + deps/build.jl | 30 +- deps/build_CSDP.v6.2.0.jl | 90 +- deps/build_CompilerSupportLibraries.v0.3.3.jl | 250 ++- deps/build_OpenBLAS32.v0.3.9.jl | 372 +++- examples/example.jl | 62 +- src/CSDP.jl | 2 +- src/MOI_wrapper.jl | 220 ++- src/blockdiag.jl | 8 +- src/blockmat.h.jl | 36 +- src/blockmat.jl | 115 +- src/debug-mat.jl | 45 +- src/declarations.h.jl | 1628 ++++++++++++++--- src/declarations.jl | 355 +++- src/options.jl | 22 +- test/MOI_wrapper.jl | 83 +- test/bug.jl | 4 +- test/check_blas.jl | 41 +- test/jl_ref.jl | 14 +- test/runtests.jl | 58 +- test/triu.jl | 7 +- test/writesol.jl | 46 +- 23 files changed, 2762 insertions(+), 764 deletions(-) create mode 100644 .JuliaFormatter.toml create mode 100644 .github/workflows/format_check.yml 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/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/deps/build.jl b/deps/build.jl index 6b04804..d0d4739 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -4,22 +4,24 @@ module Anon2 end module Anon3 end @static if VERSION < v"1.3.0" + using BinaryProvider # requires BinaryProvider 0.3.0 or later -using BinaryProvider # requires BinaryProvider 0.3.0 or later + # Parse some basic command-line arguments + const verbose = "--verbose" in ARGS + const prefix = Prefix( + get( + [a for a in ARGS if a != "--verbose"], + 1, + joinpath(@__DIR__, "usr"), + ), + ) -# Parse some basic command-line arguments -const verbose = "--verbose" in ARGS -const prefix = Prefix(get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr"))) + products = [LibraryProduct(prefix, ["libcsdp"], :libcsdp)] -products = [ - LibraryProduct(prefix, ["libcsdp"], :libcsdp) -] - -Anon1.include("build_CompilerSupportLibraries.v0.3.3.jl") -Anon2.include("build_OpenBLAS32.v0.3.9.jl") -Anon3.include("build_CSDP.v6.2.0.jl") - -# Finally, write out a deps.jl file -write_deps_file(joinpath(@__DIR__, "deps.jl"), products, verbose=true) + Anon1.include("build_CompilerSupportLibraries.v0.3.3.jl") + Anon2.include("build_OpenBLAS32.v0.3.9.jl") + Anon3.include("build_CSDP.v6.2.0.jl") + # Finally, write out a deps.jl file + write_deps_file(joinpath(@__DIR__, "deps.jl"), products, verbose = true) end # VERSION diff --git a/deps/build_CSDP.v6.2.0.jl b/deps/build_CSDP.v6.2.0.jl index 5fd4954..d8fd45c 100644 --- a/deps/build_CSDP.v6.2.0.jl +++ b/deps/build_CSDP.v6.2.0.jl @@ -7,46 +7,94 @@ using BinaryProvider # requires BinaryProvider 0.3.0 or later # Parse some basic command-line arguments const verbose = "--verbose" in ARGS -const prefix = Prefix(get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr"))) -products = [ - LibraryProduct(prefix, ["libcsdp"], :libcsdp) -] +const prefix = Prefix( + get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr")), +) +products = [LibraryProduct(prefix, ["libcsdp"], :libcsdp)] # Download binaries from hosted location bin_prefix = "https://github.com/JuliaBinaryWrappers/CSDP_jll.jl/releases/download/CSDP-v6.2.0+4" # Listing of files generated by BinaryBuilder: download_info = Dict( - Linux(:aarch64, libc=:glibc) => ("$bin_prefix/CSDP.v6.2.0.aarch64-linux-gnu.tar.gz", "446a2d5c60a9270a345d2aab12093c76accab967c175ff96de7f684e48c2f482"), - Linux(:aarch64, libc=:musl) => ("$bin_prefix/CSDP.v6.2.0.aarch64-linux-musl.tar.gz", "1e0c1e5c89e6b70538ff9b4e705bda3d267721ae4d58ee600152bc5f6101bf46"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf) => ("$bin_prefix/CSDP.v6.2.0.armv7l-linux-gnueabihf.tar.gz", "88532fc19eb7a33b72bad0b7e01d61b1bd29b6069b4a883d468d6e12f00cf711"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf) => ("$bin_prefix/CSDP.v6.2.0.armv7l-linux-musleabihf.tar.gz", "f1dd8bba6a91b4c94394ad421487b99249c8abd592dfbb2256d0dee704ea2a82"), - Linux(:i686, libc=:glibc) => ("$bin_prefix/CSDP.v6.2.0.i686-linux-gnu.tar.gz", "80e2a2b2263ca378efb23cd565814bd66f5e120cdb955e9bdf548ab32b43b75d"), - Linux(:i686, libc=:musl) => ("$bin_prefix/CSDP.v6.2.0.i686-linux-musl.tar.gz", "df0608d84f7b4c511ef002271f0f6a9481a81da3e3c751d36392d6fc89540cf2"), - Windows(:i686) => ("$bin_prefix/CSDP.v6.2.0.i686-w64-mingw32.tar.gz", "33f83f94bcec13087f9fa9276345ec296722b14b6a28c3790bb494e419bf41ea"), - Linux(:powerpc64le, libc=:glibc) => ("$bin_prefix/CSDP.v6.2.0.powerpc64le-linux-gnu.tar.gz", "461214a00369395ccd544ec40e7c89d787fcc2a869aeb73a832f79ff06c16b97"), - MacOS(:x86_64) => ("$bin_prefix/CSDP.v6.2.0.x86_64-apple-darwin14.tar.gz", "af4cbf6d324b32f26e3700d50ed2950eebbd3bdc6cc13eae8c1d15ba25c70de6"), - Linux(:x86_64, libc=:glibc) => ("$bin_prefix/CSDP.v6.2.0.x86_64-linux-gnu.tar.gz", "7ddaafbe0079f6852b60c3479bbed050b367931da3c231ba26ef20c2b71c698f"), - Linux(:x86_64, libc=:musl) => ("$bin_prefix/CSDP.v6.2.0.x86_64-linux-musl.tar.gz", "337e68f51132e080d8bb5cdf79197326df9637ede69ed9258c67626a99edc7b5"), - FreeBSD(:x86_64) => ("$bin_prefix/CSDP.v6.2.0.x86_64-unknown-freebsd11.1.tar.gz", "d7affbc5d639bff71fce4848d77d368dbca49dd8125cf849a416c4c059668201"), - Windows(:x86_64) => ("$bin_prefix/CSDP.v6.2.0.x86_64-w64-mingw32.tar.gz", "181520ca04efb32323a369ecee7d067937d9a59d5f45ed4b78d3669f8a52769d"), + Linux(:aarch64, libc = :glibc) => ( + "$bin_prefix/CSDP.v6.2.0.aarch64-linux-gnu.tar.gz", + "446a2d5c60a9270a345d2aab12093c76accab967c175ff96de7f684e48c2f482", + ), + Linux(:aarch64, libc = :musl) => ( + "$bin_prefix/CSDP.v6.2.0.aarch64-linux-musl.tar.gz", + "1e0c1e5c89e6b70538ff9b4e705bda3d267721ae4d58ee600152bc5f6101bf46", + ), + Linux(:armv7l, libc = :glibc, call_abi = :eabihf) => ( + "$bin_prefix/CSDP.v6.2.0.armv7l-linux-gnueabihf.tar.gz", + "88532fc19eb7a33b72bad0b7e01d61b1bd29b6069b4a883d468d6e12f00cf711", + ), + Linux(:armv7l, libc = :musl, call_abi = :eabihf) => ( + "$bin_prefix/CSDP.v6.2.0.armv7l-linux-musleabihf.tar.gz", + "f1dd8bba6a91b4c94394ad421487b99249c8abd592dfbb2256d0dee704ea2a82", + ), + Linux(:i686, libc = :glibc) => ( + "$bin_prefix/CSDP.v6.2.0.i686-linux-gnu.tar.gz", + "80e2a2b2263ca378efb23cd565814bd66f5e120cdb955e9bdf548ab32b43b75d", + ), + Linux(:i686, libc = :musl) => ( + "$bin_prefix/CSDP.v6.2.0.i686-linux-musl.tar.gz", + "df0608d84f7b4c511ef002271f0f6a9481a81da3e3c751d36392d6fc89540cf2", + ), + Windows(:i686) => ( + "$bin_prefix/CSDP.v6.2.0.i686-w64-mingw32.tar.gz", + "33f83f94bcec13087f9fa9276345ec296722b14b6a28c3790bb494e419bf41ea", + ), + Linux(:powerpc64le, libc = :glibc) => ( + "$bin_prefix/CSDP.v6.2.0.powerpc64le-linux-gnu.tar.gz", + "461214a00369395ccd544ec40e7c89d787fcc2a869aeb73a832f79ff06c16b97", + ), + MacOS(:x86_64) => ( + "$bin_prefix/CSDP.v6.2.0.x86_64-apple-darwin14.tar.gz", + "af4cbf6d324b32f26e3700d50ed2950eebbd3bdc6cc13eae8c1d15ba25c70de6", + ), + Linux(:x86_64, libc = :glibc) => ( + "$bin_prefix/CSDP.v6.2.0.x86_64-linux-gnu.tar.gz", + "7ddaafbe0079f6852b60c3479bbed050b367931da3c231ba26ef20c2b71c698f", + ), + Linux(:x86_64, libc = :musl) => ( + "$bin_prefix/CSDP.v6.2.0.x86_64-linux-musl.tar.gz", + "337e68f51132e080d8bb5cdf79197326df9637ede69ed9258c67626a99edc7b5", + ), + FreeBSD(:x86_64) => ( + "$bin_prefix/CSDP.v6.2.0.x86_64-unknown-freebsd11.1.tar.gz", + "d7affbc5d639bff71fce4848d77d368dbca49dd8125cf849a416c4c059668201", + ), + Windows(:x86_64) => ( + "$bin_prefix/CSDP.v6.2.0.x86_64-w64-mingw32.tar.gz", + "181520ca04efb32323a369ecee7d067937d9a59d5f45ed4b78d3669f8a52769d", + ), ) # Install unsatisfied or updated dependencies: # We added `, isolate=true` as otherwise, it would segfault when closing `OpenBLAS32`, # probably because it is conflicting with Julia openblas. -unsatisfied = any(!satisfied(p; verbose=verbose, isolate=true) for p in products) +unsatisfied = + any(!satisfied(p; verbose = verbose, isolate = true) for p in products) dl_info = choose_download(download_info, platform_key_abi()) if dl_info === nothing && unsatisfied # If we don't have a compatible .tar.gz to download, complain. # Alternatively, you could attempt to install from a separate provider, # build from source or something even more ambitious here. - error("Your platform (\"$(Sys.MACHINE)\", parsed as \"$(triplet(platform_key_abi()))\") is not supported by this package!") + error( + "Your platform (\"$(Sys.MACHINE)\", parsed as \"$(triplet(platform_key_abi()))\") is not supported by this package!", + ) end # If we have a download, and we are unsatisfied (or the version we're # trying to install is not itself installed) then load it up! -if unsatisfied || !isinstalled(dl_info...; prefix=prefix) +if unsatisfied || !isinstalled(dl_info...; prefix = prefix) # Download and install binaries - install(dl_info...; prefix=prefix, force=true, verbose=verbose, ignore_platform=true) + install( + dl_info...; + prefix = prefix, + force = true, + verbose = verbose, + ignore_platform = true, + ) end diff --git a/deps/build_CompilerSupportLibraries.v0.3.3.jl b/deps/build_CompilerSupportLibraries.v0.3.3.jl index e9e4916..1aa3bbf 100644 --- a/deps/build_CompilerSupportLibraries.v0.3.3.jl +++ b/deps/build_CompilerSupportLibraries.v0.3.3.jl @@ -7,9 +7,15 @@ using BinaryProvider # requires BinaryProvider 0.3.0 or later # Parse some basic command-line arguments const verbose = "--verbose" in ARGS -const prefix = Prefix(get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr"))) +const prefix = Prefix( + get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr")), +) products = [ - LibraryProduct(prefix, ["libgcc_s", "libgcc_s_sjlj", "libgcc_s_seh"], :libgcc_s), + LibraryProduct( + prefix, + ["libgcc_s", "libgcc_s_sjlj", "libgcc_s_seh"], + :libgcc_s, + ), LibraryProduct(prefix, ["libstdc++"], :libstdcxx), LibraryProduct(prefix, ["libgfortran"], :libgfortran), LibraryProduct(prefix, ["libgomp"], :libgomp), @@ -20,63 +26,215 @@ bin_prefix = "https://github.com/JuliaBinaryWrappers/CompilerSupportLibraries_jl # Listing of files generated by BinaryBuilder: download_info = Dict( - Linux(:aarch64, libc=:glibc, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-gnu-libgfortran3.tar.gz", "17132bd0c2f2c6d8426a601b57de2c4e670da64076ab7ab0f311dc3c39ed421c"), - Linux(:aarch64, libc=:glibc, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-gnu-libgfortran4.tar.gz", "c6fa95bb0873c23084bfb7e154ef546b21488777e2d352e5acf38d8e9800c14d"), - Linux(:aarch64, libc=:glibc, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-gnu-libgfortran5.tar.gz", "a3b98e7b24c580f5120ac2344d19c4884c93b17271fb296fa0b97fc562de7f2d"), - Linux(:aarch64, libc=:musl, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-musl-libgfortran3.tar.gz", "ee0b1e57302709cf159573ec23017fec797af6b0dae7dbd2ea0904e67b4e0343"), - Linux(:aarch64, libc=:musl, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-musl-libgfortran4.tar.gz", "b5fb9e89ed28eb3aa31397a165e583d6e860e54e24bd9af7474670335e2b2d57"), - Linux(:aarch64, libc=:musl, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-musl-libgfortran5.tar.gz", "85cd3c8ad611c8949f7cd0fd01444650358144f576e69fa20d58e9f29f781695"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-gnueabihf-libgfortran3.tar.gz", "6964b730d3764a82252fe6144d0e9103d0d9a409027c44de224afc8f05782733"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-gnueabihf-libgfortran4.tar.gz", "6b76ac45d465413bf6bc6b45cda8f1f528ce212979d94887b80d9b975e116696"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-gnueabihf-libgfortran5.tar.gz", "e5c9854d8191f2fabe81ef1fb7974ce4c4e9261c790ec21e225fbdc57ccf3bf0"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-musleabihf-libgfortran3.tar.gz", "ead80d5f2f8ed45598fd8331da07dc3e430e42b8129d982e1209c6dc392c4595"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-musleabihf-libgfortran4.tar.gz", "713f7de6f6b79869c4818b861d9877d008ef0f9bc287a88fb6c80c5757a5f80d"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-musleabihf-libgfortran5.tar.gz", "7fcd1b6a46cf1bb89602b3ad64dc546c251ca628197a9ab3d23d2ef460f39709"), - Linux(:i686, libc=:glibc, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-gnu-libgfortran3.tar.gz", "39f8673f0fb61a1d2c9bb3e847a0e7275bf56ad3a9f41e2c85063c1d9c4c9d5e"), - Linux(:i686, libc=:glibc, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-gnu-libgfortran4.tar.gz", "aafe4c28b74eb3fe57e861a814bec3bf7d5d0d1ec252f558a34fd95ea3fedac8"), - Linux(:i686, libc=:glibc, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-gnu-libgfortran5.tar.gz", "55abe3b785c179e86430616ad6309c0bde47d32517f468f064c5c69a1b506e74"), - Linux(:i686, libc=:musl, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-musl-libgfortran3.tar.gz", "2846df4b60cbabfc86b990c87bec8d7e58431c4ad1b250036993a899fdb29172"), - Linux(:i686, libc=:musl, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-musl-libgfortran4.tar.gz", "73ba40c10b825b0a5abc4fd6bd1edd9d270ff4dd37c652a6380e38da5aeab864"), - Linux(:i686, libc=:musl, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-musl-libgfortran5.tar.gz", "80f8df63b1137a061b30a11bc2b0a985fbde56c665601bb30ff7762e3fbace72"), - Windows(:i686, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-w64-mingw32-libgfortran3.tar.gz", "e53493d881c2a36d697e6abbeaeec8181488868e479bf06ea7db959d9a016763"), - Windows(:i686, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-w64-mingw32-libgfortran4.tar.gz", "58c25e695e7dace12db66d19575914922183a8083c353b691e16b1bf86ab9a3a"), - Windows(:i686, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-w64-mingw32-libgfortran5.tar.gz", "c9bc14ed49945c57353fffa7d7e374fbb146218bc0345d43bbbf8182f142ca77"), - Linux(:powerpc64le, libc=:glibc, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.powerpc64le-linux-gnu-libgfortran3.tar.gz", "c2a29d7f514acca1f9a8f0b723098d1340f3002ab689010546afcb0f9fa5d315"), - Linux(:powerpc64le, libc=:glibc, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.powerpc64le-linux-gnu-libgfortran4.tar.gz", "facbe1ae766e774c9ca2782dcb5dc6544b1c025ec1cc091bae15b3f57e6b5513"), - Linux(:powerpc64le, libc=:glibc, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.powerpc64le-linux-gnu-libgfortran5.tar.gz", "c11ab7865a3812446c2f1b32c78d89e3af2ddd31c9c32b472706e8f20368d6ed"), - MacOS(:x86_64, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-apple-darwin14-libgfortran3.tar.gz", "2739fe9184b065bf32cd1246ee12c1fd6507a9932a921dbf1bf268a3819164a0"), - MacOS(:x86_64, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-apple-darwin14-libgfortran4.tar.gz", "cb2825f0eae2cf4e5b6bc7075f3ee70afb8a31711fd5220bfd85827b87625a43"), - MacOS(:x86_64, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-apple-darwin14-libgfortran5.tar.gz", "e308cbb8e0b2b50635f98cf700b24743a2eb9d5c7726a99375ef31e096371642"), - Linux(:x86_64, libc=:glibc, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-gnu-libgfortran3.tar.gz", "9d0223f3562e0b609595904ecab0fd55650f068da367353a38146394d8329f69"), - Linux(:x86_64, libc=:glibc, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-gnu-libgfortran4.tar.gz", "adcc8519411cf0518c472d3ce47d8ac93492934a05c0276afe76eda6d91c4f4d"), - Linux(:x86_64, libc=:glibc, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-gnu-libgfortran5.tar.gz", "23771ec6d2fa014db480b5cfe8e1b6f34b2d29e8bbea8cdce1edd5f1e15cb6e0"), - Linux(:x86_64, libc=:musl, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-musl-libgfortran3.tar.gz", "a04abda3002d81567e415d17b6d72c010ef6e202d47e6d8bac32c034321ddd48"), - Linux(:x86_64, libc=:musl, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-musl-libgfortran4.tar.gz", "b6911e4ece0432d74c24d47d12000179fb00912e587ddae08e0ab1b7eda4bcf5"), - Linux(:x86_64, libc=:musl, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-musl-libgfortran5.tar.gz", "269279af71f2b64c30162cfb0d2168d518fa913aade7564fa28c8928497b3e64"), - FreeBSD(:x86_64, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-unknown-freebsd11.1-libgfortran3.tar.gz", "aeda35832c30df2d24f06cd061b21f573b1167c76ff57f3f20f1b5dfbe249adc"), - FreeBSD(:x86_64, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-unknown-freebsd11.1-libgfortran4.tar.gz", "3476688c80d8032685c57ced39a810447fc3da1b3f3275fe3af37509ccc1252e"), - FreeBSD(:x86_64, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-unknown-freebsd11.1-libgfortran5.tar.gz", "19a779b6e539b0050432684d952342b18c28587b0c27a399cb0a00da2773c381"), - Windows(:x86_64, compiler_abi=CompilerABI(:gcc4)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-w64-mingw32-libgfortran3.tar.gz", "bec6c38ec12b26b1fd3c99944af81e463a29daf52152b53f49ca15fbf633b528"), - Windows(:x86_64, compiler_abi=CompilerABI(:gcc7)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-w64-mingw32-libgfortran4.tar.gz", "aec25acb618447247e3ad5ee9aec88725cd26d7abb9b6c29ac45e7aea601331e"), - Windows(:x86_64, compiler_abi=CompilerABI(:gcc8)) => ("$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-w64-mingw32-libgfortran5.tar.gz", "69957fdd4eb5d6cfd1073c3b63b63a3ff3e2db909b4f4834b102d8a96944f66c"), + Linux(:aarch64, libc = :glibc, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-gnu-libgfortran3.tar.gz", + "17132bd0c2f2c6d8426a601b57de2c4e670da64076ab7ab0f311dc3c39ed421c", + ), + Linux(:aarch64, libc = :glibc, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-gnu-libgfortran4.tar.gz", + "c6fa95bb0873c23084bfb7e154ef546b21488777e2d352e5acf38d8e9800c14d", + ), + Linux(:aarch64, libc = :glibc, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-gnu-libgfortran5.tar.gz", + "a3b98e7b24c580f5120ac2344d19c4884c93b17271fb296fa0b97fc562de7f2d", + ), + Linux(:aarch64, libc = :musl, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-musl-libgfortran3.tar.gz", + "ee0b1e57302709cf159573ec23017fec797af6b0dae7dbd2ea0904e67b4e0343", + ), + Linux(:aarch64, libc = :musl, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-musl-libgfortran4.tar.gz", + "b5fb9e89ed28eb3aa31397a165e583d6e860e54e24bd9af7474670335e2b2d57", + ), + Linux(:aarch64, libc = :musl, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.aarch64-linux-musl-libgfortran5.tar.gz", + "85cd3c8ad611c8949f7cd0fd01444650358144f576e69fa20d58e9f29f781695", + ), + Linux( + :armv7l, + libc = :glibc, + call_abi = :eabihf, + compiler_abi = CompilerABI(:gcc4), + ) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-gnueabihf-libgfortran3.tar.gz", + "6964b730d3764a82252fe6144d0e9103d0d9a409027c44de224afc8f05782733", + ), + Linux( + :armv7l, + libc = :glibc, + call_abi = :eabihf, + compiler_abi = CompilerABI(:gcc7), + ) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-gnueabihf-libgfortran4.tar.gz", + "6b76ac45d465413bf6bc6b45cda8f1f528ce212979d94887b80d9b975e116696", + ), + Linux( + :armv7l, + libc = :glibc, + call_abi = :eabihf, + compiler_abi = CompilerABI(:gcc8), + ) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-gnueabihf-libgfortran5.tar.gz", + "e5c9854d8191f2fabe81ef1fb7974ce4c4e9261c790ec21e225fbdc57ccf3bf0", + ), + Linux( + :armv7l, + libc = :musl, + call_abi = :eabihf, + compiler_abi = CompilerABI(:gcc4), + ) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-musleabihf-libgfortran3.tar.gz", + "ead80d5f2f8ed45598fd8331da07dc3e430e42b8129d982e1209c6dc392c4595", + ), + Linux( + :armv7l, + libc = :musl, + call_abi = :eabihf, + compiler_abi = CompilerABI(:gcc7), + ) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-musleabihf-libgfortran4.tar.gz", + "713f7de6f6b79869c4818b861d9877d008ef0f9bc287a88fb6c80c5757a5f80d", + ), + Linux( + :armv7l, + libc = :musl, + call_abi = :eabihf, + compiler_abi = CompilerABI(:gcc8), + ) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.armv7l-linux-musleabihf-libgfortran5.tar.gz", + "7fcd1b6a46cf1bb89602b3ad64dc546c251ca628197a9ab3d23d2ef460f39709", + ), + Linux(:i686, libc = :glibc, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-gnu-libgfortran3.tar.gz", + "39f8673f0fb61a1d2c9bb3e847a0e7275bf56ad3a9f41e2c85063c1d9c4c9d5e", + ), + Linux(:i686, libc = :glibc, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-gnu-libgfortran4.tar.gz", + "aafe4c28b74eb3fe57e861a814bec3bf7d5d0d1ec252f558a34fd95ea3fedac8", + ), + Linux(:i686, libc = :glibc, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-gnu-libgfortran5.tar.gz", + "55abe3b785c179e86430616ad6309c0bde47d32517f468f064c5c69a1b506e74", + ), + Linux(:i686, libc = :musl, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-musl-libgfortran3.tar.gz", + "2846df4b60cbabfc86b990c87bec8d7e58431c4ad1b250036993a899fdb29172", + ), + Linux(:i686, libc = :musl, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-musl-libgfortran4.tar.gz", + "73ba40c10b825b0a5abc4fd6bd1edd9d270ff4dd37c652a6380e38da5aeab864", + ), + Linux(:i686, libc = :musl, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-linux-musl-libgfortran5.tar.gz", + "80f8df63b1137a061b30a11bc2b0a985fbde56c665601bb30ff7762e3fbace72", + ), + Windows(:i686, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-w64-mingw32-libgfortran3.tar.gz", + "e53493d881c2a36d697e6abbeaeec8181488868e479bf06ea7db959d9a016763", + ), + Windows(:i686, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-w64-mingw32-libgfortran4.tar.gz", + "58c25e695e7dace12db66d19575914922183a8083c353b691e16b1bf86ab9a3a", + ), + Windows(:i686, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.i686-w64-mingw32-libgfortran5.tar.gz", + "c9bc14ed49945c57353fffa7d7e374fbb146218bc0345d43bbbf8182f142ca77", + ), + Linux(:powerpc64le, libc = :glibc, compiler_abi = CompilerABI(:gcc4)) => + ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.powerpc64le-linux-gnu-libgfortran3.tar.gz", + "c2a29d7f514acca1f9a8f0b723098d1340f3002ab689010546afcb0f9fa5d315", + ), + Linux(:powerpc64le, libc = :glibc, compiler_abi = CompilerABI(:gcc7)) => + ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.powerpc64le-linux-gnu-libgfortran4.tar.gz", + "facbe1ae766e774c9ca2782dcb5dc6544b1c025ec1cc091bae15b3f57e6b5513", + ), + Linux(:powerpc64le, libc = :glibc, compiler_abi = CompilerABI(:gcc8)) => + ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.powerpc64le-linux-gnu-libgfortran5.tar.gz", + "c11ab7865a3812446c2f1b32c78d89e3af2ddd31c9c32b472706e8f20368d6ed", + ), + MacOS(:x86_64, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-apple-darwin14-libgfortran3.tar.gz", + "2739fe9184b065bf32cd1246ee12c1fd6507a9932a921dbf1bf268a3819164a0", + ), + MacOS(:x86_64, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-apple-darwin14-libgfortran4.tar.gz", + "cb2825f0eae2cf4e5b6bc7075f3ee70afb8a31711fd5220bfd85827b87625a43", + ), + MacOS(:x86_64, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-apple-darwin14-libgfortran5.tar.gz", + "e308cbb8e0b2b50635f98cf700b24743a2eb9d5c7726a99375ef31e096371642", + ), + Linux(:x86_64, libc = :glibc, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-gnu-libgfortran3.tar.gz", + "9d0223f3562e0b609595904ecab0fd55650f068da367353a38146394d8329f69", + ), + Linux(:x86_64, libc = :glibc, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-gnu-libgfortran4.tar.gz", + "adcc8519411cf0518c472d3ce47d8ac93492934a05c0276afe76eda6d91c4f4d", + ), + Linux(:x86_64, libc = :glibc, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-gnu-libgfortran5.tar.gz", + "23771ec6d2fa014db480b5cfe8e1b6f34b2d29e8bbea8cdce1edd5f1e15cb6e0", + ), + Linux(:x86_64, libc = :musl, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-musl-libgfortran3.tar.gz", + "a04abda3002d81567e415d17b6d72c010ef6e202d47e6d8bac32c034321ddd48", + ), + Linux(:x86_64, libc = :musl, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-musl-libgfortran4.tar.gz", + "b6911e4ece0432d74c24d47d12000179fb00912e587ddae08e0ab1b7eda4bcf5", + ), + Linux(:x86_64, libc = :musl, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-linux-musl-libgfortran5.tar.gz", + "269279af71f2b64c30162cfb0d2168d518fa913aade7564fa28c8928497b3e64", + ), + FreeBSD(:x86_64, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-unknown-freebsd11.1-libgfortran3.tar.gz", + "aeda35832c30df2d24f06cd061b21f573b1167c76ff57f3f20f1b5dfbe249adc", + ), + FreeBSD(:x86_64, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-unknown-freebsd11.1-libgfortran4.tar.gz", + "3476688c80d8032685c57ced39a810447fc3da1b3f3275fe3af37509ccc1252e", + ), + FreeBSD(:x86_64, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-unknown-freebsd11.1-libgfortran5.tar.gz", + "19a779b6e539b0050432684d952342b18c28587b0c27a399cb0a00da2773c381", + ), + Windows(:x86_64, compiler_abi = CompilerABI(:gcc4)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-w64-mingw32-libgfortran3.tar.gz", + "bec6c38ec12b26b1fd3c99944af81e463a29daf52152b53f49ca15fbf633b528", + ), + Windows(:x86_64, compiler_abi = CompilerABI(:gcc7)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-w64-mingw32-libgfortran4.tar.gz", + "aec25acb618447247e3ad5ee9aec88725cd26d7abb9b6c29ac45e7aea601331e", + ), + Windows(:x86_64, compiler_abi = CompilerABI(:gcc8)) => ( + "$bin_prefix/CompilerSupportLibraries.v0.3.3.x86_64-w64-mingw32-libgfortran5.tar.gz", + "69957fdd4eb5d6cfd1073c3b63b63a3ff3e2db909b4f4834b102d8a96944f66c", + ), ) # Install unsatisfied or updated dependencies: -unsatisfied = any(!satisfied(p; verbose=verbose) for p in products) +unsatisfied = any(!satisfied(p; verbose = verbose) for p in products) dl_info = choose_download(download_info, platform_key_abi()) if dl_info === nothing && unsatisfied # If we don't have a compatible .tar.gz to download, complain. # Alternatively, you could attempt to install from a separate provider, # build from source or something even more ambitious here. - error("Your platform (\"$(Sys.MACHINE)\", parsed as \"$(triplet(platform_key_abi()))\") is not supported by this package!") + error( + "Your platform (\"$(Sys.MACHINE)\", parsed as \"$(triplet(platform_key_abi()))\") is not supported by this package!", + ) end # If we have a download, and we are unsatisfied (or the version we're # trying to install is not itself installed) then load it up! -if unsatisfied || !isinstalled(dl_info...; prefix=prefix) +if unsatisfied || !isinstalled(dl_info...; prefix = prefix) # Download and install binaries - install(dl_info...; prefix=prefix, force=true, verbose=verbose) + install(dl_info...; prefix = prefix, force = true, verbose = verbose) end # Write out a deps.jl file that will contain mappings for our products -write_deps_file(joinpath(@__DIR__, "deps.jl"), products, verbose=verbose) +write_deps_file(joinpath(@__DIR__, "deps.jl"), products, verbose = verbose) diff --git a/deps/build_OpenBLAS32.v0.3.9.jl b/deps/build_OpenBLAS32.v0.3.9.jl index afcc2a7..131d7fd 100644 --- a/deps/build_OpenBLAS32.v0.3.9.jl +++ b/deps/build_OpenBLAS32.v0.3.9.jl @@ -4,7 +4,7 @@ # by first replacing the `include` by its content, see https://github.com/JuliaPackaging/Yggdrasil/issues/858 # We also added `prefix, ` after `LibraryProduct(`. # Renamed `CompilerABI` into `_CompilerABI` and added this as this method was not defined. -function _CompilerABI(; libgfortran_version=nothing) +function _CompilerABI(; libgfortran_version = nothing) # See https://github.com/JuliaPackaging/BinaryProvider.jl/blob/332b58c898486c6cdf3c963164b1f66f9850d64b/src/PlatformNames.jl#L560-L564 if libgfortran_version == v"3.0.0" gcc = :gcc4 @@ -22,72 +22,348 @@ using BinaryProvider # requires BinaryProvider 0.3.0 or later # Parse some basic command-line arguments const verbose = "--verbose" in ARGS -const prefix = Prefix(get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr"))) -products = [ - LibraryProduct(prefix, ["libopenblas"], :libopenblas), -] +const prefix = Prefix( + get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr")), +) +products = [LibraryProduct(prefix, ["libopenblas"], :libopenblas)] # Download binaries from hosted location bin_prefix = "https://github.com/JuliaBinaryWrappers/OpenBLAS32_jll.jl/releases/download/OpenBLAS32-v0.3.9+2" # Listing of files generated by BinaryBuilder: download_info = Dict( - Linux(:aarch64, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-gnu-libgfortran3.tar.gz", "70c72d420d3358c885f00ab57b48acbd1af76b3d575fd77071e36fbbaa00892e"), - Linux(:aarch64, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-gnu-libgfortran4.tar.gz", "5046fbf88664004298b5033782365ec2481b012c08e501d81aa88f341b00d6d7"), - Linux(:aarch64, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-gnu-libgfortran5.tar.gz", "ee396e4681f2582bb1af846399946bc877771e7703b51ded58d943eddac5efc6"), - Linux(:aarch64, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-musl-libgfortran3.tar.gz", "b79b8c5b473885c7e4988d1a62b52e90d9f5034c8000b39e1b831a10ba753a5c"), - Linux(:aarch64, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-musl-libgfortran4.tar.gz", "9931954d062b0dd603c6b4bb049672404726bdbd4969b22068400accbbd233a4"), - Linux(:aarch64, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-musl-libgfortran5.tar.gz", "376f594def5d788f2d235b02f6f54fe7e9956e893ff3a0a42e12abb0ac1cff15"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-gnueabihf-libgfortran3.tar.gz", "edd34511fe5876f47883eaec62bc2e7b220d9396c32c924e5496a6cbfb86a0ff"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-gnueabihf-libgfortran4.tar.gz", "ad10a79218b8bc8ccdb442d640bc392d8c1d41a89d49de116819f022525d6cc5"), - Linux(:armv7l, libc=:glibc, call_abi=:eabihf, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-gnueabihf-libgfortran5.tar.gz", "04c5b704ae04c209d7c0f9506c29bf870760272096a7f106b4161a803fbbfcf6"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-musleabihf-libgfortran3.tar.gz", "668f70e1b4b76feee0ee9d51f2b256dfd2d9a05f3c7936d6ed5e3bb16c6f91f6"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-musleabihf-libgfortran4.tar.gz", "03b70ad1cb44c8530c66fbab8adfd6d1ca0b7c66f34a6b4cfe8c93c264c5f881"), - Linux(:armv7l, libc=:musl, call_abi=:eabihf, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-musleabihf-libgfortran5.tar.gz", "24d3be8016ca46467d8a207334609c761bc6b7d3a07634ca81ddd2be52625a1b"), - Linux(:i686, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-gnu-libgfortran3.tar.gz", "41ce6b10e963824d2cbbbbf31e02ba5edc4784d9ce8adf4edfd611042753b472"), - Linux(:i686, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-gnu-libgfortran4.tar.gz", "4ba05d858cde46d35120295e2b0f549d666327b25f15892520dda94af3ce29b9"), - Linux(:i686, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-gnu-libgfortran5.tar.gz", "1bd5dd9c01cb418d3c1b30b0d02826c7f193883e5a493b38728b81db52f318cb"), - Linux(:i686, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-musl-libgfortran3.tar.gz", "fa5ee765cea55afb5de007c4c9fe28db10c75f426a895f39f57363da3e248a71"), - Linux(:i686, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-musl-libgfortran4.tar.gz", "50db036850af08df7b241ab25f5e7f668fc0dbb7ac779b899693f386af21fac8"), - Linux(:i686, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-musl-libgfortran5.tar.gz", "e38be09ffa8a48010e395a8cf57d0e2348d8147a4724054962baf2750fabe6c9"), - Windows(:i686, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-w64-mingw32-libgfortran3.tar.gz", "7673c3c0eed1e48d0bb3771d73a9b192e95af78b134b68cb40cd69e533849a53"), - Windows(:i686, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-w64-mingw32-libgfortran4.tar.gz", "eb21686bbc2e880c5c0fe59da595816b427a023422810c2866ed826626763fa7"), - Windows(:i686, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.i686-w64-mingw32-libgfortran5.tar.gz", "433ec40a8496efce9680bc6297efa510374f7e9038ef0eaacd314fd7133fa278"), - Linux(:powerpc64le, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.powerpc64le-linux-gnu-libgfortran3.tar.gz", "772480f50a235b311a2d8e767339cca46665d0ee4aa39abf24f3ec4d4c261f5c"), - Linux(:powerpc64le, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.powerpc64le-linux-gnu-libgfortran4.tar.gz", "ae3596cb668b02e7c82302c8e7b3e445260a32252b5d85fdc6bd7cddfc7783a0"), - Linux(:powerpc64le, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.powerpc64le-linux-gnu-libgfortran5.tar.gz", "c94e277724c5ef483775cceac9f16b778c8c4a9a823353dbd4bfaffd137d7a58"), - MacOS(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-apple-darwin14-libgfortran3.tar.gz", "bb41f81ec7aae04a773c188fe9683bc6ad47af211e87f3ede1195ab83961f951"), - MacOS(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-apple-darwin14-libgfortran4.tar.gz", "99d88d0a7dc55bafe071c61a231fe36279f89317fef196954dbea80c566be96d"), - MacOS(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-apple-darwin14-libgfortran5.tar.gz", "56ee6d750897c91f29d701ead5b2f44a2a12a72d5c1eb9b09dc2c0eb3b65d1d1"), - Linux(:x86_64, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-gnu-libgfortran3.tar.gz", "13861d28a1832ce0d5f1b8ecb84de2f19d7970ab9188d07da6da209ac4c4e5d0"), - Linux(:x86_64, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-gnu-libgfortran4.tar.gz", "e2786ab3c111e3cb33f4e4eda50de5ea536aea99edcc952e7d6a87c82b802c36"), - Linux(:x86_64, libc=:glibc, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-gnu-libgfortran5.tar.gz", "639b8f40d0c8f9177574b413b9e475eb9045abe2e82078c5a4dde4efbfe39a07"), - Linux(:x86_64, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-musl-libgfortran3.tar.gz", "0bba4279e2e524a6504c16b7cc4266621ba09f62880b6847e291955c90ec5c6c"), - Linux(:x86_64, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-musl-libgfortran4.tar.gz", "cfcc99aa3a9124e54225e01299e86e8b7599b0de75835db12d88e643cd1ef83a"), - Linux(:x86_64, libc=:musl, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-musl-libgfortran5.tar.gz", "a9dd680a5bcefad112d03993a35d6de434baafc055a71e2f4961d5f8177b983b"), - FreeBSD(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-unknown-freebsd11.1-libgfortran3.tar.gz", "9c877be5d99c2fb5d479e72c5945d076994b720431e11bfc1426ff69c9147183"), - FreeBSD(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-unknown-freebsd11.1-libgfortran4.tar.gz", "90bb169c6fc582243eabf6f2849d3fb53b0b7e17a3e39f4693c004a4f3249f4c"), - FreeBSD(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-unknown-freebsd11.1-libgfortran5.tar.gz", "0e7c2f8125cda30d1e6cae556caea06a7db3b98479119b361826f5973316632f"), - Windows(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"3.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-w64-mingw32-libgfortran3.tar.gz", "21949a80fde51fda975a423c893843c7b94557f9286bb73ba079792e33be3c8d"), - Windows(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"4.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-w64-mingw32-libgfortran4.tar.gz", "417fe312177ed42a6a95cf4b5bfd39aa202199ca1e210d9a5bd25b622f511944"), - Windows(:x86_64, compiler_abi=_CompilerABI(libgfortran_version=v"5.0.0")) => ("$bin_prefix/OpenBLAS32.v0.3.9.x86_64-w64-mingw32-libgfortran5.tar.gz", "b945a95923389da1ec7efd76bbfa1337ac525a37581053dc6aed0cf113c5a1d7"), + Linux( + :aarch64, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-gnu-libgfortran3.tar.gz", + "70c72d420d3358c885f00ab57b48acbd1af76b3d575fd77071e36fbbaa00892e", + ), + Linux( + :aarch64, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-gnu-libgfortran4.tar.gz", + "5046fbf88664004298b5033782365ec2481b012c08e501d81aa88f341b00d6d7", + ), + Linux( + :aarch64, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-gnu-libgfortran5.tar.gz", + "ee396e4681f2582bb1af846399946bc877771e7703b51ded58d943eddac5efc6", + ), + Linux( + :aarch64, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-musl-libgfortran3.tar.gz", + "b79b8c5b473885c7e4988d1a62b52e90d9f5034c8000b39e1b831a10ba753a5c", + ), + Linux( + :aarch64, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-musl-libgfortran4.tar.gz", + "9931954d062b0dd603c6b4bb049672404726bdbd4969b22068400accbbd233a4", + ), + Linux( + :aarch64, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.aarch64-linux-musl-libgfortran5.tar.gz", + "376f594def5d788f2d235b02f6f54fe7e9956e893ff3a0a42e12abb0ac1cff15", + ), + Linux( + :armv7l, + libc = :glibc, + call_abi = :eabihf, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-gnueabihf-libgfortran3.tar.gz", + "edd34511fe5876f47883eaec62bc2e7b220d9396c32c924e5496a6cbfb86a0ff", + ), + Linux( + :armv7l, + libc = :glibc, + call_abi = :eabihf, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-gnueabihf-libgfortran4.tar.gz", + "ad10a79218b8bc8ccdb442d640bc392d8c1d41a89d49de116819f022525d6cc5", + ), + Linux( + :armv7l, + libc = :glibc, + call_abi = :eabihf, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-gnueabihf-libgfortran5.tar.gz", + "04c5b704ae04c209d7c0f9506c29bf870760272096a7f106b4161a803fbbfcf6", + ), + Linux( + :armv7l, + libc = :musl, + call_abi = :eabihf, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-musleabihf-libgfortran3.tar.gz", + "668f70e1b4b76feee0ee9d51f2b256dfd2d9a05f3c7936d6ed5e3bb16c6f91f6", + ), + Linux( + :armv7l, + libc = :musl, + call_abi = :eabihf, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-musleabihf-libgfortran4.tar.gz", + "03b70ad1cb44c8530c66fbab8adfd6d1ca0b7c66f34a6b4cfe8c93c264c5f881", + ), + Linux( + :armv7l, + libc = :musl, + call_abi = :eabihf, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.armv7l-linux-musleabihf-libgfortran5.tar.gz", + "24d3be8016ca46467d8a207334609c761bc6b7d3a07634ca81ddd2be52625a1b", + ), + Linux( + :i686, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-gnu-libgfortran3.tar.gz", + "41ce6b10e963824d2cbbbbf31e02ba5edc4784d9ce8adf4edfd611042753b472", + ), + Linux( + :i686, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-gnu-libgfortran4.tar.gz", + "4ba05d858cde46d35120295e2b0f549d666327b25f15892520dda94af3ce29b9", + ), + Linux( + :i686, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-gnu-libgfortran5.tar.gz", + "1bd5dd9c01cb418d3c1b30b0d02826c7f193883e5a493b38728b81db52f318cb", + ), + Linux( + :i686, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-musl-libgfortran3.tar.gz", + "fa5ee765cea55afb5de007c4c9fe28db10c75f426a895f39f57363da3e248a71", + ), + Linux( + :i686, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-musl-libgfortran4.tar.gz", + "50db036850af08df7b241ab25f5e7f668fc0dbb7ac779b899693f386af21fac8", + ), + Linux( + :i686, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-linux-musl-libgfortran5.tar.gz", + "e38be09ffa8a48010e395a8cf57d0e2348d8147a4724054962baf2750fabe6c9", + ), + Windows( + :i686, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-w64-mingw32-libgfortran3.tar.gz", + "7673c3c0eed1e48d0bb3771d73a9b192e95af78b134b68cb40cd69e533849a53", + ), + Windows( + :i686, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-w64-mingw32-libgfortran4.tar.gz", + "eb21686bbc2e880c5c0fe59da595816b427a023422810c2866ed826626763fa7", + ), + Windows( + :i686, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.i686-w64-mingw32-libgfortran5.tar.gz", + "433ec40a8496efce9680bc6297efa510374f7e9038ef0eaacd314fd7133fa278", + ), + Linux( + :powerpc64le, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.powerpc64le-linux-gnu-libgfortran3.tar.gz", + "772480f50a235b311a2d8e767339cca46665d0ee4aa39abf24f3ec4d4c261f5c", + ), + Linux( + :powerpc64le, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.powerpc64le-linux-gnu-libgfortran4.tar.gz", + "ae3596cb668b02e7c82302c8e7b3e445260a32252b5d85fdc6bd7cddfc7783a0", + ), + Linux( + :powerpc64le, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.powerpc64le-linux-gnu-libgfortran5.tar.gz", + "c94e277724c5ef483775cceac9f16b778c8c4a9a823353dbd4bfaffd137d7a58", + ), + MacOS( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-apple-darwin14-libgfortran3.tar.gz", + "bb41f81ec7aae04a773c188fe9683bc6ad47af211e87f3ede1195ab83961f951", + ), + MacOS( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-apple-darwin14-libgfortran4.tar.gz", + "99d88d0a7dc55bafe071c61a231fe36279f89317fef196954dbea80c566be96d", + ), + MacOS( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-apple-darwin14-libgfortran5.tar.gz", + "56ee6d750897c91f29d701ead5b2f44a2a12a72d5c1eb9b09dc2c0eb3b65d1d1", + ), + Linux( + :x86_64, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-gnu-libgfortran3.tar.gz", + "13861d28a1832ce0d5f1b8ecb84de2f19d7970ab9188d07da6da209ac4c4e5d0", + ), + Linux( + :x86_64, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-gnu-libgfortran4.tar.gz", + "e2786ab3c111e3cb33f4e4eda50de5ea536aea99edcc952e7d6a87c82b802c36", + ), + Linux( + :x86_64, + libc = :glibc, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-gnu-libgfortran5.tar.gz", + "639b8f40d0c8f9177574b413b9e475eb9045abe2e82078c5a4dde4efbfe39a07", + ), + Linux( + :x86_64, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-musl-libgfortran3.tar.gz", + "0bba4279e2e524a6504c16b7cc4266621ba09f62880b6847e291955c90ec5c6c", + ), + Linux( + :x86_64, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-musl-libgfortran4.tar.gz", + "cfcc99aa3a9124e54225e01299e86e8b7599b0de75835db12d88e643cd1ef83a", + ), + Linux( + :x86_64, + libc = :musl, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-linux-musl-libgfortran5.tar.gz", + "a9dd680a5bcefad112d03993a35d6de434baafc055a71e2f4961d5f8177b983b", + ), + FreeBSD( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-unknown-freebsd11.1-libgfortran3.tar.gz", + "9c877be5d99c2fb5d479e72c5945d076994b720431e11bfc1426ff69c9147183", + ), + FreeBSD( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-unknown-freebsd11.1-libgfortran4.tar.gz", + "90bb169c6fc582243eabf6f2849d3fb53b0b7e17a3e39f4693c004a4f3249f4c", + ), + FreeBSD( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-unknown-freebsd11.1-libgfortran5.tar.gz", + "0e7c2f8125cda30d1e6cae556caea06a7db3b98479119b361826f5973316632f", + ), + Windows( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"3.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-w64-mingw32-libgfortran3.tar.gz", + "21949a80fde51fda975a423c893843c7b94557f9286bb73ba079792e33be3c8d", + ), + Windows( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"4.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-w64-mingw32-libgfortran4.tar.gz", + "417fe312177ed42a6a95cf4b5bfd39aa202199ca1e210d9a5bd25b622f511944", + ), + Windows( + :x86_64, + compiler_abi = _CompilerABI(libgfortran_version = v"5.0.0"), + ) => ( + "$bin_prefix/OpenBLAS32.v0.3.9.x86_64-w64-mingw32-libgfortran5.tar.gz", + "b945a95923389da1ec7efd76bbfa1337ac525a37581053dc6aed0cf113c5a1d7", + ), ) # Install unsatisfied or updated dependencies: # We added `, isolate=true` as otherwise, it would segfault when closing `OpenBLAS32`, # probably because it is conflicting with Julia openblas. -unsatisfied = any(!satisfied(p; verbose=verbose, isolate=true) for p in products) +unsatisfied = + any(!satisfied(p; verbose = verbose, isolate = true) for p in products) dl_info = choose_download(download_info, platform_key_abi()) if dl_info === nothing && unsatisfied # If we don't have a compatible .tar.gz to download, complain. # Alternatively, you could attempt to install from a separate provider, # build from source or something even more ambitious here. - error("Your platform (\"$(Sys.MACHINE)\", parsed as \"$(triplet(platform_key_abi()))\") is not supported by this package!") + error( + "Your platform (\"$(Sys.MACHINE)\", parsed as \"$(triplet(platform_key_abi()))\") is not supported by this package!", + ) end # If we have a download, and we are unsatisfied (or the version we're # trying to install is not itself installed) then load it up! -if unsatisfied || !isinstalled(dl_info...; prefix=prefix) +if unsatisfied || !isinstalled(dl_info...; prefix = prefix) # Download and install binaries - install(dl_info...; prefix=prefix, force=true, verbose=verbose, ignore_platform=true) + install( + dl_info...; + prefix = prefix, + force = true, + verbose = verbose, + ignore_platform = true, + ) end diff --git a/examples/example.jl b/examples/example.jl index 3c72eac..ed02d63 100644 --- a/examples/example.jl +++ b/examples/example.jl @@ -43,33 +43,47 @@ using CSDP =# C = BlockMatrix( - [2 1 - 1 2], - [3 0 1 - 0 2 0 - 1 0 3], - Diagonal([0, - 0])) + [ + 2 1 + 1 2 + ], + [ + 3 0 1 + 0 2 0 + 1 0 3 + ], + Diagonal([0, 0]), +) b = [1.0, 2.0] -A1 = ConstraintMatrix(1, - [3 1 - 1 3], - [0 0 0 - 0 0 0 - 0 0 0], - Diagonal([1, - 0])) - -A2 = ConstraintMatrix(2, - [0 0 - 0 0], - [3 0 1 - 0 4 0 - 1 0 5], - Diagonal([0, - 1])) +A1 = ConstraintMatrix( + 1, + [ + 3 1 + 1 3 + ], + [ + 0 0 0 + 0 0 0 + 0 0 0 + ], + Diagonal([1, 0]), +) + +A2 = ConstraintMatrix( + 2, + [ + 0 0 + 0 0 + ], + [ + 3 0 1 + 0 4 0 + 1 0 5 + ], + Diagonal([0, 1]), +) constraints = [A.csdp for A in [A1, A2]] diff --git a/src/CSDP.jl b/src/CSDP.jl index f57aa29..b5a8884 100644 --- a/src/CSDP.jl +++ b/src/CSDP.jl @@ -4,7 +4,7 @@ using LinearAlgebra # For Diagonal using SparseArrays # For SparseMatrixCSC if VERSION < v"1.3" - if isfile(joinpath(dirname(@__FILE__),"..","deps","deps.jl")) + if isfile(joinpath(dirname(@__FILE__), "..", "deps", "deps.jl")) include("../deps/deps.jl") else error("CSDP not properly installed. Please run Pkg.build(\"CSDP\")") diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index de2979f..e3be0ce 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -8,26 +8,40 @@ mutable struct Optimizer <: MOI.AbstractOptimizer objective_constant::Cdouble objective_sign::Int blockdims::Vector{CSDP_INT} - varmap::Vector{Tuple{Int, Int, Int}} # Variable Index vi -> blk, i, j - num_entries::Dict{Tuple{Int, Int}, Int} + varmap::Vector{Tuple{Int,Int,Int}} # Variable Index vi -> blk, i, j + num_entries::Dict{Tuple{Int,Int},Int} b::Vector{Cdouble} C::blockmatrix - problem::Union{Nothing, LoadingProblem} + problem::Union{Nothing,LoadingProblem} X::blockmatrix - y::Union{Nothing, Vector{Cdouble}} + y::Union{Nothing,Vector{Cdouble}} Z::blockmatrix status::CSDP_INT pobj::Cdouble dobj::Cdouble solve_time::Float64 silent::Bool - options::Dict{Symbol, Any} + options::Dict{Symbol,Any} function Optimizer(; kwargs...) optimizer = new( - zero(Cdouble), 1, CSDP_INT[], Tuple{Int, Int, Int}[], - Dict{Tuple{Int, Int}, Int}(), Cdouble[], - blockmatrix(), nothing, blockmatrix(), nothing, blockmatrix(), - -1, NaN, NaN, NaN, false, Dict{Symbol, Any}()) + zero(Cdouble), + 1, + CSDP_INT[], + Tuple{Int,Int,Int}[], + Dict{Tuple{Int,Int},Int}(), + Cdouble[], + blockmatrix(), + nothing, + blockmatrix(), + nothing, + blockmatrix(), + -1, + NaN, + NaN, + NaN, + false, + Dict{Symbol,Any}(), + ) for (key, value) in kwargs MOI.set(optimizer, MOI.RawOptimizerAttribute(String(key)), value) end @@ -47,13 +61,13 @@ function MOI.set(optimizer::Optimizer, param::MOI.RawOptimizerAttribute, value) Base.depwarn( "passing `$(param.name)` to `MOI.RawOptimizerAttribute` as type " * "`$(typeof(param.name))` is deprecated. Use a string instead.", - Symbol("MOI.set") + Symbol("MOI.set"), ) end if !MOI.supports(optimizer, param) throw(MOI.UnsupportedAttribute(param)) end - optimizer.options[Symbol(param.name)] = value + return optimizer.options[Symbol(param.name)] = value end function MOI.get(optimizer::Optimizer, param::MOI.RawOptimizerAttribute) # TODO: This gives a poor error message if the name of the parameter is invalid. @@ -61,7 +75,7 @@ function MOI.get(optimizer::Optimizer, param::MOI.RawOptimizerAttribute) Base.depwarn( "passing `$(param.name)` to `MOI.RawOptimizerAttribute` as type " * "`$(typeof(param.name))` is deprecated. Use a string instead.", - Symbol("MOI.set") + Symbol("MOI.set"), ) end return optimizer.options[Symbol(param.name)] @@ -69,7 +83,7 @@ end MOI.supports(::Optimizer, ::MOI.Silent) = true function MOI.set(optimizer::Optimizer, ::MOI.Silent, value::Bool) - optimizer.silent = value + return optimizer.silent = value end MOI.get(optimizer::Optimizer, ::MOI.Silent) = optimizer.silent @@ -86,10 +100,11 @@ const RAW_STATUS = [ "Lack of progress.", "X, Z, or O is singular.", "NaN or Inf values encountered.", - "Program stopped by signal (SIXCPU, SIGTERM, etc.)"] + "Program stopped by signal (SIXCPU, SIGTERM, etc.)", +] function MOI.get(optimizer::Optimizer, ::MOI.RawStatusString) - return RAW_STATUS[optimizer.status + 1] + return RAW_STATUS[optimizer.status+1] end function MOI.get(optimizer::Optimizer, ::MOI.SolveTimeSec) return optimizer.solve_time @@ -97,14 +112,14 @@ end function MOI.is_empty(optimizer::Optimizer) return iszero(optimizer.objective_constant) && - isone(optimizer.objective_sign) && - isempty(optimizer.blockdims) && - isempty(optimizer.varmap) && - isempty(optimizer.num_entries) && - isempty(optimizer.b) && - iszero(optimizer.C.nblocks) && - optimizer.C.blocks == C_NULL && - optimizer.problem === nothing + isone(optimizer.objective_sign) && + isempty(optimizer.blockdims) && + isempty(optimizer.varmap) && + isempty(optimizer.num_entries) && + isempty(optimizer.b) && + iszero(optimizer.C.nblocks) && + optimizer.C.blocks == C_NULL && + optimizer.problem === nothing end function MOI.empty!(optimizer::Optimizer) @@ -116,7 +131,12 @@ function MOI.empty!(optimizer::Optimizer) empty!(optimizer.b) if optimizer.problem !== nothing if optimizer.y !== nothing - free_loaded_prob(optimizer.problem, optimizer.X, optimizer.y, optimizer.Z) + free_loaded_prob( + optimizer.problem, + optimizer.X, + optimizer.y, + optimizer.Z, + ) end free_loading_prob(optimizer.problem) end @@ -130,20 +150,26 @@ function MOI.empty!(optimizer::Optimizer) optimizer.Z.blocks = C_NULL optimizer.status = -1 optimizer.pobj = 0.0 - optimizer.dobj = 0.0 + return optimizer.dobj = 0.0 end function MOI.supports( optimizer::Optimizer, - ::Union{MOI.ObjectiveSense, - MOI.ObjectiveFunction{AFF}}) + ::Union{MOI.ObjectiveSense,MOI.ObjectiveFunction{AFF}}, +) return true end MOI.supports_add_constrained_variables(::Optimizer, ::Type{MOI.Reals}) = false -const SupportedSets = Union{MOI.Nonnegatives, MOI.PositiveSemidefiniteConeTriangle} -MOI.supports_add_constrained_variables(::Optimizer, ::Type{<:SupportedSets}) = true +const SupportedSets = + Union{MOI.Nonnegatives,MOI.PositiveSemidefiniteConeTriangle} +function MOI.supports_add_constrained_variables( + ::Optimizer, + ::Type{<:SupportedSets}, +) + return true +end function MOI.supports_constraint(::Optimizer, ::Type{AFF}, ::Type{EQ}) return true end @@ -156,7 +182,10 @@ function _new_block(optimizer::Optimizer, set::MOI.Nonnegatives) end end -function _new_block(optimizer::Optimizer, set::MOI.PositiveSemidefiniteConeTriangle) +function _new_block( + optimizer::Optimizer, + set::MOI.PositiveSemidefiniteConeTriangle, +) push!(optimizer.blockdims, set.side_dimension) blk = length(optimizer.blockdims) for i in 1:set.side_dimension @@ -169,12 +198,16 @@ end function _add_constrained_variables(optimizer::Optimizer, set::SupportedSets) offset = length(optimizer.varmap) _new_block(optimizer, set) - ci = MOI.ConstraintIndex{MOI.VectorOfVariables, typeof(set)}(offset + 1) + ci = MOI.ConstraintIndex{MOI.VectorOfVariables,typeof(set)}(offset + 1) return [MOI.VariableIndex(i) for i in offset .+ (1:MOI.dimension(set))], ci end function _error(start, stop) - error(start, ". Use `MOI.instantiate(CSDP.Optimizer, with_bridge_type = Float64)` ", stop) + return error( + start, + ". Use `MOI.instantiate(CSDP.Optimizer, with_bridge_type = Float64)` ", + stop, + ) end function constrain_variables_on_creation( @@ -187,11 +220,15 @@ function constrain_variables_on_creation( MOI.get(src, MOI.ListOfConstraintIndices{MOI.VectorOfVariables,S}()) f_src = MOI.get(src, MOI.ConstraintFunction(), ci_src) if !allunique(f_src.variables) - _error("Cannot copy constraint `$(ci_src)` as variables constrained on creation because there are duplicate variables in the function `$(f_src)`", - "to bridge this by creating slack variables.") + _error( + "Cannot copy constraint `$(ci_src)` as variables constrained on creation because there are duplicate variables in the function `$(f_src)`", + "to bridge this by creating slack variables.", + ) elseif any(vi -> haskey(index_map, vi), f_src.variables) - _error("Cannot copy constraint `$(ci_src)` as variables constrained on creation because some variables of the function `$(f_src)` are in another constraint as well.", - "to bridge constraints having the same variables by creating slack variables.") + _error( + "Cannot copy constraint `$(ci_src)` as variables constrained on creation because some variables of the function `$(f_src)` are in another constraint as well.", + "to bridge constraints having the same variables by creating slack variables.", + ) else set = MOI.get(src, MOI.ConstraintSet(), ci_src)::S vis_dest, ci_dest = _add_constrained_variables(dest, set) @@ -205,7 +242,7 @@ end function count_entry(optimizer::Optimizer, con_idx::Integer, blk::Integer) key = (con_idx, blk) - optimizer.num_entries[key] = get(optimizer.num_entries, key, 0) + 1 + return optimizer.num_entries[key] = get(optimizer.num_entries, key, 0) + 1 end # Loads objective coefficient α * vi @@ -216,7 +253,7 @@ function load_objective_term!(optimizer::Optimizer, α, vi::MOI.VariableIndex) if i != j coef /= 2 end - addentry(optimizer.problem, 0, blk, i, j, coef, true) + return addentry(optimizer.problem, 0, blk, i, j, coef, true) end function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) @@ -224,12 +261,7 @@ function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) index_map = MOI.Utilities.IndexMap() # Step 1) Compute the dimensions of what needs to be allocated - constrain_variables_on_creation( - dest, - src, - index_map, - MOI.Nonnegatives, - ) + constrain_variables_on_creation(dest, src, index_map, MOI.Nonnegatives) constrain_variables_on_creation( dest, src, @@ -238,8 +270,10 @@ function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) ) vis_src = MOI.get(src, MOI.ListOfVariableIndices()) if length(vis_src) < length(index_map.var_map) - _error("Free variables are not supported by CSDP", - "to bridge free variables into `x - y` where `x` and `y` are nonnegative.") + _error( + "Free variables are not supported by CSDP", + "to bridge free variables into `x - y` where `x` and `y` are nonnegative.", + ) end cis_src = MOI.get(src, MOI.ListOfConstraintIndices{AFF,EQ}()) dest.b = Vector{Cdouble}(undef, length(cis_src)) @@ -248,12 +282,18 @@ function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) funcs[k] = MOI.get(src, MOI.CanonicalConstraintFunction(), ci_src) set = MOI.get(src, MOI.ConstraintSet(), ci_src) if isempty(funcs[k].terms) - throw(ArgumentError("Empty constraint $cis_src: $(funcs[k])-in-$set. Not supported by CSDP.")) + throw( + ArgumentError( + "Empty constraint $cis_src: $(funcs[k])-in-$set. Not supported by CSDP.", + ), + ) end if !iszero(MOI.constant(funcs[k])) - throw(MOI.ScalarFunctionConstantNotZero{ - Cdouble, AFF, EQ}( - MOI.constant(funcs[k]))) + throw( + MOI.ScalarFunctionConstantNotZero{Cdouble,AFF,EQ}( + MOI.constant(funcs[k]), + ), + ) end for t in funcs[k].terms if !iszero(t.coefficient) @@ -278,10 +318,17 @@ function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) for (key, value) in dest.num_entries num_entries[key...] = value end - dest.problem = allocate_loading_prob(Ref(dest.C), dest.blockdims, length(dest.b), num_entries, 3) + dest.problem = allocate_loading_prob( + Ref(dest.C), + dest.blockdims, + length(dest.b), + num_entries, + 3, + ) if dummy # See https://github.com/coin-or/Csdp/issues/2 - duplicate = addentry(dest.problem, 1, length(dest.blockdims), 1, 1, 1.0, true) + duplicate = + addentry(dest.problem, 1, length(dest.blockdims), 1, 1, 1.0, true) @assert !duplicate end @@ -324,7 +371,11 @@ function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike) dest.objective_constant = obj.constant for term in obj.terms if !iszero(term.coefficient) - load_objective_term!(dest, term.coefficient, index_map[term.variable]) + load_objective_term!( + dest, + term.coefficient, + index_map[term.variable], + ) end end end @@ -335,7 +386,12 @@ function MOI.optimize!(optimizer::Optimizer) write_prob(optimizer) start_time = time() - optimizer.y = loaded_initsoln(optimizer.problem, length(optimizer.b), Ref(optimizer.X), Ref(optimizer.Z)) + optimizer.y = loaded_initsoln( + optimizer.problem, + length(optimizer.b), + Ref(optimizer.X), + Ref(optimizer.Z), + ) options = optimizer.options if optimizer.silent @@ -344,8 +400,12 @@ function MOI.optimize!(optimizer::Optimizer) end optimizer.status, optimizer.pobj, optimizer.dobj = loaded_sdp( - optimizer.problem, optimizer.objective_sign * optimizer.objective_constant, - Ref(optimizer.X), optimizer.y, Ref(optimizer.Z), options, + optimizer.problem, + optimizer.objective_sign * optimizer.objective_constant, + Ref(optimizer.X), + optimizer.y, + Ref(optimizer.Z), + options, ) optimizer.solve_time = time() - start_time return @@ -435,10 +495,16 @@ struct DualSlackMatrix <: MOI.AbstractModelAttribute end MOI.is_set_by_optimize(::DualSlackMatrix) = true MOI.get(optimizer::Optimizer, ::DualSlackMatrix) = optimizer.Z -function block(optimizer::Optimizer, ci::MOI.ConstraintIndex{MOI.VectorOfVariables}) +function block( + optimizer::Optimizer, + ci::MOI.ConstraintIndex{MOI.VectorOfVariables}, +) return optimizer.varmap[ci.value][1] end -function dimension(optimizer::Optimizer, ci::MOI.ConstraintIndex{MOI.VectorOfVariables}) +function dimension( + optimizer::Optimizer, + ci::MOI.ConstraintIndex{MOI.VectorOfVariables}, +) blockdim = optimizer.blockdims[block(optimizer, ci)] if blockdim < 0 return -blockdim @@ -449,7 +515,11 @@ end function vectorize_block(M, blk::Integer, s::Type{MOI.Nonnegatives}) return diag(block(M, blk)) end -function vectorize_block(M::AbstractMatrix{Cdouble}, blk::Integer, s::Type{MOI.PositiveSemidefiniteConeTriangle}) where T +function vectorize_block( + M::AbstractMatrix{Cdouble}, + blk::Integer, + s::Type{MOI.PositiveSemidefiniteConeTriangle}, +) where {T} B = block(M, blk) d = LinearAlgebra.checksquare(B) n = MOI.dimension(MOI.PositiveSemidefiniteConeTriangle(d)) @@ -465,26 +535,44 @@ function vectorize_block(M::AbstractMatrix{Cdouble}, blk::Integer, s::Type{MOI.P return v end -function MOI.get(optimizer::Optimizer, attr::MOI.VariablePrimal, vi::MOI.VariableIndex) +function MOI.get( + optimizer::Optimizer, + attr::MOI.VariablePrimal, + vi::MOI.VariableIndex, +) MOI.check_result_index_bounds(optimizer, attr) blk, i, j = varmap(optimizer, vi) return block(MOI.get(optimizer, PrimalSolutionMatrix()), blk)[i, j] end -function MOI.get(optimizer::Optimizer, attr::MOI.ConstraintPrimal, - ci::MOI.ConstraintIndex{MOI.VectorOfVariables, S}) where S<:SupportedSets +function MOI.get( + optimizer::Optimizer, + attr::MOI.ConstraintPrimal, + ci::MOI.ConstraintIndex{MOI.VectorOfVariables,S}, +) where {S<:SupportedSets} MOI.check_result_index_bounds(optimizer, attr) - return vectorize_block(MOI.get(optimizer, PrimalSolutionMatrix()), block(optimizer, ci), S) + return vectorize_block( + MOI.get(optimizer, PrimalSolutionMatrix()), + block(optimizer, ci), + S, + ) end function MOI.get(optimizer::Optimizer, attr::MOI.ConstraintPrimal, ci::AFFEQ) MOI.check_result_index_bounds(optimizer, attr) return optimizer.b[ci.value] end -function MOI.get(optimizer::Optimizer, attr::MOI.ConstraintDual, - ci::MOI.ConstraintIndex{MOI.VectorOfVariables, S}) where S<:SupportedSets +function MOI.get( + optimizer::Optimizer, + attr::MOI.ConstraintDual, + ci::MOI.ConstraintIndex{MOI.VectorOfVariables,S}, +) where {S<:SupportedSets} MOI.check_result_index_bounds(optimizer, attr) - return vectorize_block(MOI.get(optimizer, DualSlackMatrix()), block(optimizer, ci), S) + return vectorize_block( + MOI.get(optimizer, DualSlackMatrix()), + block(optimizer, ci), + S, + ) end function MOI.get(optimizer::Optimizer, attr::MOI.ConstraintDual, ci::AFFEQ) MOI.check_result_index_bounds(optimizer, attr) diff --git a/src/blockdiag.jl b/src/blockdiag.jl index 95c8cfc..6d814a5 100644 --- a/src/blockdiag.jl +++ b/src/blockdiag.jl @@ -4,8 +4,12 @@ function nblocks end function block end function Base.size(bm::AbstractBlockMatrix) - n = mapreduce(blk -> LinearAlgebra.checksquare(block(bm, blk)), - +, 1:nblocks(bm), init=0) + n = mapreduce( + blk -> LinearAlgebra.checksquare(block(bm, blk)), + +, + 1:nblocks(bm), + init = 0, + ) return (n, n) end function Base.getindex(bm::AbstractBlockMatrix, i::Integer, j::Integer) diff --git a/src/blockmat.h.jl b/src/blockmat.h.jl index df57c19..f78b9cd 100644 --- a/src/blockmat.h.jl +++ b/src/blockmat.h.jl @@ -5,7 +5,7 @@ # compiled with NOSHORTS we are screwed with the following code... @static if Sys.iswindows() const csdpshort = Cushort - else +else const csdpshort = CSDP_INT end @@ -48,7 +48,7 @@ function sparseblock(next, jblock, blocknum, constr) # See easysdp.c blocksize = jblock.n numentries = length(jblock.i) - issparse = numentries <= blocksize / 4 || numentries <= 15 # FIXME also if category (which is in C...) is DIAG + return issparse = numentries <= blocksize / 4 || numentries <= 15 # FIXME also if category (which is in C...) is DIAG end # If I add mutable here I get : ReadOnlyMemoryError() in initsoln (I know it is counter-intuitive) @@ -80,19 +80,21 @@ mutable struct paramstruc end function paramstruc(options::Dict) - paramstruc(get(options, :axtol , 1.0e-8), - get(options, :atytol , 1.0e-8), - get(options, :objtol , 1.0e-8), - get(options, :pinftol , 1.0e8), - get(options, :dinftol , 1.0e8), - get(options, :maxiter , 100), - get(options, :minstepfrac, 0.90), - get(options, :maxstepfrac, 0.97), - get(options, :minstepp , 1.0e-8), - get(options, :minstepd , 1.0e-8), - get(options, :usexzgap , 1), - get(options, :tweakgap , 0), - get(options, :affine , 0), - get(options, :perturbobj , 1), - get(options, :fastmode , 0)) + return paramstruc( + get(options, :axtol, 1.0e-8), + get(options, :atytol, 1.0e-8), + get(options, :objtol, 1.0e-8), + get(options, :pinftol, 1.0e8), + get(options, :dinftol, 1.0e8), + get(options, :maxiter, 100), + get(options, :minstepfrac, 0.90), + get(options, :maxstepfrac, 0.97), + get(options, :minstepp, 1.0e-8), + get(options, :minstepd, 1.0e-8), + get(options, :usexzgap, 1), + get(options, :tweakgap, 0), + get(options, :affine, 0), + get(options, :perturbobj, 1), + get(options, :fastmode, 0), + ) end diff --git a/src/blockmat.jl b/src/blockmat.jl index d3799f2..6d6d8cc 100644 --- a/src/blockmat.jl +++ b/src/blockmat.jl @@ -4,34 +4,33 @@ # Utils -function fptr(x::Vector{T}) where T +function fptr(x::Vector{T}) where {T} # CSDP starts indexing at 1 so we need to do "- sizeof(T)" - pointer(x) - sizeof(T) + return pointer(x) - sizeof(T) end -function ptr(x::X) where X - Base.reinterpret(Base.Ptr{X}, Base.pointer_from_objref(x)) +function ptr(x::X) where {X} + return Base.reinterpret(Base.Ptr{X}, Base.pointer_from_objref(x)) end export fptr, ptr function mywrap(X::blockmatrix) - BlockMatrix(X) + return BlockMatrix(X) end function _unsafe_wrap(A, x, n, own::Bool) - Base.unsafe_wrap(A, x, n, own=own) + return Base.unsafe_wrap(A, x, n, own = own) end -function mywrap(x::Ptr{T}, len) where T +function mywrap(x::Ptr{T}, len) where {T} # I give false to unsafe_wrap to specify that Julia do not own the array so it should not free it # because the pointer it has has an offset y = _unsafe_wrap(Array, x + sizeof(T), len, false) # fptr takes care of this offset #finalizer(s -> Libc.free(fptr(s)), y) - y + return y end - # The problem is # max ⟨C, X⟩ # ⟨A_i, X⟩ = b_i ∀ i @@ -68,7 +67,7 @@ function BlockRec(A::Matrix) end function BlockRec(A::Diagonal) a = Vector{Cdouble}(diag(A)) - BlockRec(a, -length(a)) + return BlockRec(a, -length(a)) end function blockreczeros(n) if n > 0 @@ -80,14 +79,14 @@ end function Base.size(A::blockrec) n = A.blocksize - (n, n) + return (n, n) end Base.size(A::BlockRec) = size(A.csdp) function Base.getindex(A::BlockRec, i, j) n = A.csdp.blocksize if A.csdp.blockcategory == MATRIX A._blockdatarec[i+(j-1)*n] - elseif A.csdp.blockcategory == DIAG + elseif A.csdp.blockcategory == DIAG if i == j A._blockdatarec[i] else @@ -102,7 +101,7 @@ function Base.setindex!(A::BlockRec, v, i, j) if A.csdp.blockcategory == MATRIX A._blockdatarec[i+(j-1)*n] = v A._blockdatarec[j+(i-1)*n] = v - elseif A.csdp.blockcategory == DIAG + elseif A.csdp.blockcategory == DIAG if i == j A._blockdatarec[i] = v else @@ -113,7 +112,6 @@ function Base.setindex!(A::BlockRec, v, i, j) end end - # blockmatrix mutable struct BlockMatrix <: AbstractBlockMatrix{Cdouble} jblocks::Vector{BlockRec} @@ -122,9 +120,9 @@ mutable struct BlockMatrix <: AbstractBlockMatrix{Cdouble} end function BlockMatrix(jblocks::AbstractVector{BlockRec}) - blocks = map(block->block.csdp, jblocks) + blocks = map(block -> block.csdp, jblocks) csdp = blockmatrix(length(blocks), fptr(blocks)) - BlockMatrix(jblocks, blocks, csdp) + return BlockMatrix(jblocks, blocks, csdp) end BlockMatrix(As::AbstractVector) = BlockMatrix(map(BlockRec, As)) BlockMatrix(As::AbstractMatrix...) = BlockMatrix(collect(As)) @@ -132,20 +130,22 @@ blockmatzeros(blkdims) = BlockMatrix(map(blockreczeros, blkdims)) function BlockMatrix(csdp::blockmatrix) # I give false so that Julia does not try to free it - blocks = _unsafe_wrap(Array, csdp.blocks + sizeof(blockrec), csdp.nblocks, false) + blocks = + _unsafe_wrap(Array, csdp.blocks + sizeof(blockrec), csdp.nblocks, false) jblocks = map(blocks) do csdp let n = csdp.blocksize, c = csdp.blockcategory, d = csdp.data._blockdatarec if c == MATRIX _blockdatarec = _unsafe_wrap(Array, d, n^2, false) elseif c == DIAG - _blockdatarec = _unsafe_wrap(Array, d + sizeof(Cdouble), n, false) + _blockdatarec = + _unsafe_wrap(Array, d + sizeof(Cdouble), n, false) else error("Unknown block category $(c)") end BlockRec(_blockdatarec, csdp) end end - BlockMatrix(jblocks, blocks, csdp) + return BlockMatrix(jblocks, blocks, csdp) end ## Old function for that... @@ -176,24 +176,37 @@ mutable struct SparseBlock <: AbstractMatrix{Cdouble} v::Vector{Cdouble} n::CSDP_INT csdp::sparseblock - function SparseBlock(i::Vector{csdpshort}, j::Vector{csdpshort}, v::Vector{Cdouble}, n::Integer, csdp) - new(i, j, v, n, csdp) + function SparseBlock( + i::Vector{csdpshort}, + j::Vector{csdpshort}, + v::Vector{Cdouble}, + n::Integer, + csdp, + ) + return new(i, j, v, n, csdp) end end -function SparseBlock(i::Vector{csdpshort}, j::Vector{csdpshort}, v::Vector{Cdouble}, n::Integer) +function SparseBlock( + i::Vector{csdpshort}, + j::Vector{csdpshort}, + v::Vector{Cdouble}, + n::Integer, +) @assert length(i) == length(j) == length(v) - block = sparseblock(C_NULL, # next - C_NULL, # nextbyblock - fptr(v), # entries - fptr(i), # iindices - fptr(j), # jindices - length(i), # numentries - 0, # blocknum - n, # blocksize - 0, # constraintnum - 1) # issparse - SparseBlock(i, j, v, n, block) + block = sparseblock( + C_NULL, # next + C_NULL, # nextbyblock + fptr(v), # entries + fptr(i), # iindices + fptr(j), # jindices + length(i), # numentries + 0, # blocknum + n, # blocksize + 0, # constraintnum + 1, + ) # issparse + return SparseBlock(i, j, v, n, block) end SparseBlock(A::SparseBlock) = A @@ -205,7 +218,7 @@ function SparseBlock(A::SparseMatrixCSC{Cdouble}) V = Cdouble[] vals = nonzeros(A) rows = rowvals(A) - for col = 1:n + for col in 1:n for j in nzrange(A, col) row = rows[j] if row <= col @@ -215,18 +228,20 @@ function SparseBlock(A::SparseMatrixCSC{Cdouble}) end end end - SparseBlock(I, J, V, n) + return SparseBlock(I, J, V, n) +end +function SparseBlock(A::AbstractMatrix{Cdouble}) + return SparseBlock(SparseMatrixCSC{Cdouble,CSDP_INT}(A)) end -SparseBlock(A::AbstractMatrix{Cdouble}) = SparseBlock(SparseMatrixCSC{Cdouble, CSDP_INT}(A)) SparseBlock(A::AbstractMatrix) = SparseBlock(map(Cdouble, A)) Base.convert(::Type{SparseBlock}, A::AbstractMatrix) = SparseBlock(A) function sparseblockzeros(n) - SparseBlock(csdpshort[], csdpshort[], Cdouble[], abs(n)) + return SparseBlock(csdpshort[], csdpshort[], Cdouble[], abs(n)) end function Base.size(A::SparseBlock) - (A.n, A.n) + return (A.n, A.n) end function findindices(A::SparseBlock, i, j) if i > A.n || j > A.n || i <= 0 || j <= 0 @@ -264,7 +279,6 @@ function Base.setindex!(A::SparseBlock, v, i, j) end end - mutable struct ConstraintMatrix <: AbstractBlockMatrix{Cdouble} jblocks::Vector{SparseBlock} csdp::constraintmatrix @@ -284,9 +298,11 @@ function ConstraintMatrix(constr, jblocks::AbstractVector{SparseBlock}) #next = Base.unsafe_convert(Ptr{sparseblock}, Ref(block)) end csdp = constraintmatrix(Ptr{sparseblock}(next)) - ConstraintMatrix(jblocks, csdp) + return ConstraintMatrix(jblocks, csdp) +end +function ConstraintMatrix(i, bs::AbstractMatrix...) + return ConstraintMatrix(i, SparseBlock[b for b in bs]) end -ConstraintMatrix(i, bs::AbstractMatrix...) = ConstraintMatrix(i, SparseBlock[b for b in bs]) constrmatzeros(i, blkdims) = ConstraintMatrix(i, map(sparseblockzeros, blkdims)) # I need sparseblock to be immutable for this function to work @@ -299,22 +315,25 @@ function ConstraintMatrix(csdp::constraintmatrix, k::Integer) i = mywrap(csdp.iindices, ne) j = mywrap(csdp.jindices, ne) v = mywrap(csdp.entries, ne) - SparseBlock(i, j, v, csdp.blocksize, csdp) + return SparseBlock(i, j, v, csdp.blocksize, csdp) end - ConstraintMatrix(jblocks, csdp) + return ConstraintMatrix(jblocks, csdp) end # Needed by MPB_wrapper -function Base.getindex(A::Union{blockmatrix, BlockMatrix, ConstraintMatrix}, i::Integer) - block(A, i) +function Base.getindex( + A::Union{blockmatrix,BlockMatrix,ConstraintMatrix}, + i::Integer, +) + return block(A, i) end block(A::blockmatrix, i::Integer) = getblockrec(A, i) -function block(A::Union{BlockMatrix, ConstraintMatrix}, i::Integer) - A.jblocks[i] +function block(A::Union{BlockMatrix,ConstraintMatrix}, i::Integer) + return A.jblocks[i] end nblocks(A::blockmatrix) = A.nblocks -nblocks(A::Union{BlockMatrix, ConstraintMatrix}) = length(A.jblocks) +nblocks(A::Union{BlockMatrix,ConstraintMatrix}) = length(A.jblocks) export BlockMatrix, ConstraintMatrix diff --git a/src/debug-mat.jl b/src/debug-mat.jl index 4254c40..b50aea8 100644 --- a/src/debug-mat.jl +++ b/src/debug-mat.jl @@ -1,39 +1,48 @@ function print_block(b::blockrec) - ccall((:printb, CSDP.libcsdp), Nothing, (blockrec,), b) + return ccall((:printb, CSDP.libcsdp), Nothing, (blockrec,), b) end function printm(A::blockmatrix) - ccall((:printm, CSDP.libcsdp), Nothing, (blockmatrix,), A) + return ccall((:printm, CSDP.libcsdp), Nothing, (blockmatrix,), A) end printm(A::BlockMatrix) = printm(A.csdp) export printm print_sparseblock(A::sparseblock) = print_sparseblock(pointer_from_objref(A)) function print_sparseblock(a::Ptr{sparseblock}) - ccall((:print_sparse_block, CSDP.libcsdp), Nothing, (Ptr{sparseblock},), a) + return ccall( + (:print_sparse_block, CSDP.libcsdp), + Nothing, + (Ptr{sparseblock},), + a, + ) end - function print_sizeof() - ccall((:print_sizeof, CSDP.libcsdp), Nothing, ()) + return ccall((:print_sizeof, CSDP.libcsdp), Nothing, ()) end function print_constraints(C::Vector{constraintmatrix}) - ccall((:print_constraints, CSDP.libcsdp), Nothing, (CSDP_INT, Ptr{constraintmatrix}), length(C), fptr(C)) + return ccall( + (:print_constraints, CSDP.libcsdp), + Nothing, + (CSDP_INT, Ptr{constraintmatrix}), + length(C), + fptr(C), + ) end - function Base.show(io::IO, b::sparseblock) println(io, "\nsparseblock(", pointer_from_objref(b)) - println(io, " next : ", b.next ) - println(io, " nextbyblock : ", b.nextbyblock ) - println(io, " entries : ", b.entries ) - println(io, " iindices : ", b.iindices ) - println(io, " jindices : ", b.jindices ) - println(io, " numentries : ", b.numentries ) - println(io, " blocknum : ", b.blocknum ) - println(io, " blocksize : ", b.blocksize ) - println(io, " constraintnum : ", b.constraintnum) - println(io, " issparse : ", b.issparse ) - println(io, ")") + println(io, " next : ", b.next) + println(io, " nextbyblock : ", b.nextbyblock) + println(io, " entries : ", b.entries) + println(io, " iindices : ", b.iindices) + println(io, " jindices : ", b.jindices) + println(io, " numentries : ", b.numentries) + println(io, " blocknum : ", b.blocknum) + println(io, " blocksize : ", b.blocksize) + println(io, " constraintnum : ", b.constraintnum) + println(io, " issparse : ", b.issparse) + return println(io, ")") end diff --git a/src/declarations.h.jl b/src/declarations.h.jl index 28d2697..6807f4a 100644 --- a/src/declarations.h.jl +++ b/src/declarations.h.jl @@ -4,233 +4,854 @@ export read_prob function triu(A::blockmatrix) - ccall((:triu,CSDP.libcsdp),Nothing,(blockmatrix,),A) + return ccall((:triu, CSDP.libcsdp), Nothing, (blockmatrix,), A) end -function store_packed(A::blockmatrix,B::blockmatrix) - ccall((:store_packed,CSDP.libcsdp),Nothing,(blockmatrix,blockmatrix),A,B) +function store_packed(A::blockmatrix, B::blockmatrix) + return ccall( + (:store_packed, CSDP.libcsdp), + Nothing, + (blockmatrix, blockmatrix), + A, + B, + ) end -function store_unpacked(A::blockmatrix,B::blockmatrix) - ccall((:store_unpacked,CSDP.libcsdp),Nothing,(blockmatrix,blockmatrix),A,B) +function store_unpacked(A::blockmatrix, B::blockmatrix) + return ccall( + (:store_unpacked, CSDP.libcsdp), + Nothing, + (blockmatrix, blockmatrix), + A, + B, + ) end -function alloc_mat_packed(A::blockmatrix,pB::Ref{blockmatrix}) - ccall((:alloc_mat_packed,CSDP.libcsdp),Nothing,(blockmatrix,Ref{blockmatrix}),A,pB) +function alloc_mat_packed(A::blockmatrix, pB::Ref{blockmatrix}) + return ccall( + (:alloc_mat_packed, CSDP.libcsdp), + Nothing, + (blockmatrix, Ref{blockmatrix}), + A, + pB, + ) end function free_mat_packed(A::blockmatrix) - ccall((:free_mat_packed,CSDP.libcsdp),Nothing,(blockmatrix,),A) -end - -function structnnz(n::CSDP_INT,k::CSDP_INT,C::blockmatrix,constraints::Ptr{constraintmatrix}) - ccall((:structnnz,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,blockmatrix,Ptr{constraintmatrix}),n,k,C,constraints) -end - -function actnnz(n::CSDP_INT,lda::CSDP_INT,A::Ptr{Cdouble}) - ccall((:actnnz,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,Ptr{Cdouble}),n,lda,A) -end - -function bandwidth(n::CSDP_INT,lda::CSDP_INT,A::Ptr{Cdouble}) - ccall((:bandwidth,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,Ptr{Cdouble}),n,lda,A) -end - -function qreig(n::CSDP_INT,maindiag::Ptr{Cdouble},offdiag::Ptr{Cdouble}) - ccall((:qreig,CSDP.libcsdp),Nothing,(CSDP_INT,Ptr{Cdouble},Ptr{Cdouble}),n,maindiag,offdiag) -end - -function sort_entries(k::CSDP_INT,C::blockmatrix,constraints::Ptr{constraintmatrix}) - ccall((:sort_entries,CSDP.libcsdp),Nothing,(CSDP_INT,blockmatrix,Ptr{constraintmatrix}),k,C,constraints) -end - -function norm2(n::CSDP_INT,x::Ptr{Cdouble}) - ccall((:norm2,CSDP.libcsdp),Cdouble,(CSDP_INT,Ptr{Cdouble}),n,x) -end - -function norm1(n::CSDP_INT,x::Ptr{Cdouble}) - ccall((:norm1,CSDP.libcsdp),Cdouble,(CSDP_INT,Ptr{Cdouble}),n,x) -end - -function norminf(n::CSDP_INT,x::Ptr{Cdouble}) - ccall((:norminf,CSDP.libcsdp),Cdouble,(CSDP_INT,Ptr{Cdouble}),n,x) + return ccall((:free_mat_packed, CSDP.libcsdp), Nothing, (blockmatrix,), A) +end + +function structnnz( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + constraints::Ptr{constraintmatrix}, +) + return ccall( + (:structnnz, CSDP.libcsdp), + CSDP_INT, + (CSDP_INT, CSDP_INT, blockmatrix, Ptr{constraintmatrix}), + n, + k, + C, + constraints, + ) +end + +function actnnz(n::CSDP_INT, lda::CSDP_INT, A::Ptr{Cdouble}) + return ccall( + (:actnnz, CSDP.libcsdp), + CSDP_INT, + (CSDP_INT, CSDP_INT, Ptr{Cdouble}), + n, + lda, + A, + ) +end + +function bandwidth(n::CSDP_INT, lda::CSDP_INT, A::Ptr{Cdouble}) + return ccall( + (:bandwidth, CSDP.libcsdp), + CSDP_INT, + (CSDP_INT, CSDP_INT, Ptr{Cdouble}), + n, + lda, + A, + ) +end + +function qreig(n::CSDP_INT, maindiag::Ptr{Cdouble}, offdiag::Ptr{Cdouble}) + return ccall( + (:qreig, CSDP.libcsdp), + Nothing, + (CSDP_INT, Ptr{Cdouble}, Ptr{Cdouble}), + n, + maindiag, + offdiag, + ) +end + +function sort_entries( + k::CSDP_INT, + C::blockmatrix, + constraints::Ptr{constraintmatrix}, +) + return ccall( + (:sort_entries, CSDP.libcsdp), + Nothing, + (CSDP_INT, blockmatrix, Ptr{constraintmatrix}), + k, + C, + constraints, + ) +end + +function norm2(n::CSDP_INT, x::Ptr{Cdouble}) + return ccall( + (:norm2, CSDP.libcsdp), + Cdouble, + (CSDP_INT, Ptr{Cdouble}), + n, + x, + ) +end + +function norm1(n::CSDP_INT, x::Ptr{Cdouble}) + return ccall( + (:norm1, CSDP.libcsdp), + Cdouble, + (CSDP_INT, Ptr{Cdouble}), + n, + x, + ) +end + +function norminf(n::CSDP_INT, x::Ptr{Cdouble}) + return ccall( + (:norminf, CSDP.libcsdp), + Cdouble, + (CSDP_INT, Ptr{Cdouble}), + n, + x, + ) end function Fnorm(A::blockmatrix) - ccall((:Fnorm,CSDP.libcsdp),Cdouble,(blockmatrix,),A) + return ccall((:Fnorm, CSDP.libcsdp), Cdouble, (blockmatrix,), A) end function Knorm(A::blockmatrix) - ccall((:Knorm,CSDP.libcsdp),Cdouble,(blockmatrix,),A) + return ccall((:Knorm, CSDP.libcsdp), Cdouble, (blockmatrix,), A) end function mat1norm(A::blockmatrix) - ccall((:mat1norm,CSDP.libcsdp),Cdouble,(blockmatrix,),A) + return ccall((:mat1norm, CSDP.libcsdp), Cdouble, (blockmatrix,), A) end function matinfnorm(A::blockmatrix) - ccall((:matinfnorm,CSDP.libcsdp),Cdouble,(blockmatrix,),A) -end - -function calc_pobj(C::blockmatrix,X::blockmatrix,constant_offset::Cdouble) - ccall((:calc_pobj,CSDP.libcsdp),Cdouble,(blockmatrix,blockmatrix,Cdouble),C,X,constant_offset) -end - -function calc_dobj(k::CSDP_INT,a::Ptr{Cdouble},y::Ptr{Cdouble},constant_offset::Cdouble) - ccall((:calc_dobj,CSDP.libcsdp),Cdouble,(CSDP_INT,Ptr{Cdouble},Ptr{Cdouble},Cdouble),k,a,y,constant_offset) -end - -function trace_prod(A::blockmatrix,B::blockmatrix) - ccall((:trace_prod,CSDP.libcsdp),Cdouble,(blockmatrix,blockmatrix),A,B) -end - -function linesearch(n::CSDP_INT,dX::blockmatrix,work1::blockmatrix,work2::blockmatrix,work3::blockmatrix,cholinv::blockmatrix,q::Ptr{Cdouble},z::Ptr{Cdouble},workvec::Ptr{Cdouble},stepfrac::Cdouble,start::Cdouble,printlevel::CSDP_INT) - ccall((:linesearch,CSDP.libcsdp),Cdouble,(CSDP_INT,blockmatrix,blockmatrix,blockmatrix,blockmatrix,blockmatrix,Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Cdouble,Cdouble,CSDP_INT),n,dX,work1,work2,work3,cholinv,q,z,workvec,stepfrac,start,printlevel) -end - -function pinfeas(k::CSDP_INT,constraints::Ptr{constraintmatrix},X::blockmatrix,a::Ptr{Cdouble},workvec::Ptr{Cdouble}) - ccall((:pinfeas,CSDP.libcsdp),Cdouble,(CSDP_INT,Ptr{constraintmatrix},blockmatrix,Ptr{Cdouble},Ptr{Cdouble}),k,constraints,X,a,workvec) -end - -function dinfeas(k::CSDP_INT,C::blockmatrix,constraints::Ptr{constraintmatrix},y::Ptr{Cdouble},Z::blockmatrix,work1::blockmatrix) - ccall((:dinfeas,CSDP.libcsdp),Cdouble,(CSDP_INT,blockmatrix,Ptr{constraintmatrix},Ptr{Cdouble},blockmatrix,blockmatrix),k,C,constraints,y,Z,work1) -end - -function dimacserr3(k::CSDP_INT,C::blockmatrix,constraints::Ptr{constraintmatrix},y::Ptr{Cdouble},Z::blockmatrix,work1::blockmatrix) - ccall((:dimacserr3,CSDP.libcsdp),Cdouble,(CSDP_INT,blockmatrix,Ptr{constraintmatrix},Ptr{Cdouble},blockmatrix,blockmatrix),k,C,constraints,y,Z,work1) -end - -function op_a(k::CSDP_INT,constraints::Ptr{constraintmatrix},X::blockmatrix,result::Ptr{Cdouble}) - ccall((:op_a,CSDP.libcsdp),Nothing,(CSDP_INT,Ptr{constraintmatrix},blockmatrix,Ptr{Cdouble}),k,constraints,X,result) -end - -function op_at(k::CSDP_INT,y::Ptr{Cdouble},constraints::Ptr{constraintmatrix},result::blockmatrix) - ccall((:op_at,CSDP.libcsdp),Nothing,(CSDP_INT,Ptr{Cdouble},Ptr{constraintmatrix},blockmatrix),k,y,constraints,result) -end - -function makefill(k::CSDP_INT,C::blockmatrix,constraints::Ptr{constraintmatrix},pfill::Ref{constraintmatrix},work1::blockmatrix,printlevel::CSDP_INT) - ccall((:makefill,CSDP.libcsdp),Nothing,(CSDP_INT,blockmatrix,Ptr{constraintmatrix},Ref{constraintmatrix},blockmatrix,CSDP_INT),k,C,constraints,pfill,work1,printlevel) -end - -function op_o(k::CSDP_INT,constraints::Ptr{constraintmatrix},byblocks::Ptr{Ptr{sparseblock}},Zi::blockmatrix,X::blockmatrix,O::Ptr{Cdouble},work1::blockmatrix,work2::blockmatrix) - ccall((:op_o,CSDP.libcsdp),Nothing,(CSDP_INT,Ptr{constraintmatrix},Ptr{Ptr{sparseblock}},blockmatrix,blockmatrix,Ptr{Cdouble},blockmatrix,blockmatrix),k,constraints,byblocks,Zi,X,O,work1,work2) -end - -function addscaledmat(A::blockmatrix,scale::Cdouble,B::blockmatrix,C::blockmatrix) - ccall((:addscaledmat,CSDP.libcsdp),Nothing,(blockmatrix,Cdouble,blockmatrix,blockmatrix),A,scale,B,C) + return ccall((:matinfnorm, CSDP.libcsdp), Cdouble, (blockmatrix,), A) +end + +function calc_pobj(C::blockmatrix, X::blockmatrix, constant_offset::Cdouble) + return ccall( + (:calc_pobj, CSDP.libcsdp), + Cdouble, + (blockmatrix, blockmatrix, Cdouble), + C, + X, + constant_offset, + ) +end + +function calc_dobj( + k::CSDP_INT, + a::Ptr{Cdouble}, + y::Ptr{Cdouble}, + constant_offset::Cdouble, +) + return ccall( + (:calc_dobj, CSDP.libcsdp), + Cdouble, + (CSDP_INT, Ptr{Cdouble}, Ptr{Cdouble}, Cdouble), + k, + a, + y, + constant_offset, + ) +end + +function trace_prod(A::blockmatrix, B::blockmatrix) + return ccall( + (:trace_prod, CSDP.libcsdp), + Cdouble, + (blockmatrix, blockmatrix), + A, + B, + ) +end + +function linesearch( + n::CSDP_INT, + dX::blockmatrix, + work1::blockmatrix, + work2::blockmatrix, + work3::blockmatrix, + cholinv::blockmatrix, + q::Ptr{Cdouble}, + z::Ptr{Cdouble}, + workvec::Ptr{Cdouble}, + stepfrac::Cdouble, + start::Cdouble, + printlevel::CSDP_INT, +) + return ccall( + (:linesearch, CSDP.libcsdp), + Cdouble, + ( + CSDP_INT, + blockmatrix, + blockmatrix, + blockmatrix, + blockmatrix, + blockmatrix, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Cdouble, + Cdouble, + CSDP_INT, + ), + n, + dX, + work1, + work2, + work3, + cholinv, + q, + z, + workvec, + stepfrac, + start, + printlevel, + ) +end + +function pinfeas( + k::CSDP_INT, + constraints::Ptr{constraintmatrix}, + X::blockmatrix, + a::Ptr{Cdouble}, + workvec::Ptr{Cdouble}, +) + return ccall( + (:pinfeas, CSDP.libcsdp), + Cdouble, + ( + CSDP_INT, + Ptr{constraintmatrix}, + blockmatrix, + Ptr{Cdouble}, + Ptr{Cdouble}, + ), + k, + constraints, + X, + a, + workvec, + ) +end + +function dinfeas( + k::CSDP_INT, + C::blockmatrix, + constraints::Ptr{constraintmatrix}, + y::Ptr{Cdouble}, + Z::blockmatrix, + work1::blockmatrix, +) + return ccall( + (:dinfeas, CSDP.libcsdp), + Cdouble, + ( + CSDP_INT, + blockmatrix, + Ptr{constraintmatrix}, + Ptr{Cdouble}, + blockmatrix, + blockmatrix, + ), + k, + C, + constraints, + y, + Z, + work1, + ) +end + +function dimacserr3( + k::CSDP_INT, + C::blockmatrix, + constraints::Ptr{constraintmatrix}, + y::Ptr{Cdouble}, + Z::blockmatrix, + work1::blockmatrix, +) + return ccall( + (:dimacserr3, CSDP.libcsdp), + Cdouble, + ( + CSDP_INT, + blockmatrix, + Ptr{constraintmatrix}, + Ptr{Cdouble}, + blockmatrix, + blockmatrix, + ), + k, + C, + constraints, + y, + Z, + work1, + ) +end + +function op_a( + k::CSDP_INT, + constraints::Ptr{constraintmatrix}, + X::blockmatrix, + result::Ptr{Cdouble}, +) + return ccall( + (:op_a, CSDP.libcsdp), + Nothing, + (CSDP_INT, Ptr{constraintmatrix}, blockmatrix, Ptr{Cdouble}), + k, + constraints, + X, + result, + ) +end + +function op_at( + k::CSDP_INT, + y::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, + result::blockmatrix, +) + return ccall( + (:op_at, CSDP.libcsdp), + Nothing, + (CSDP_INT, Ptr{Cdouble}, Ptr{constraintmatrix}, blockmatrix), + k, + y, + constraints, + result, + ) +end + +function makefill( + k::CSDP_INT, + C::blockmatrix, + constraints::Ptr{constraintmatrix}, + pfill::Ref{constraintmatrix}, + work1::blockmatrix, + printlevel::CSDP_INT, +) + return ccall( + (:makefill, CSDP.libcsdp), + Nothing, + ( + CSDP_INT, + blockmatrix, + Ptr{constraintmatrix}, + Ref{constraintmatrix}, + blockmatrix, + CSDP_INT, + ), + k, + C, + constraints, + pfill, + work1, + printlevel, + ) +end + +function op_o( + k::CSDP_INT, + constraints::Ptr{constraintmatrix}, + byblocks::Ptr{Ptr{sparseblock}}, + Zi::blockmatrix, + X::blockmatrix, + O::Ptr{Cdouble}, + work1::blockmatrix, + work2::blockmatrix, +) + return ccall( + (:op_o, CSDP.libcsdp), + Nothing, + ( + CSDP_INT, + Ptr{constraintmatrix}, + Ptr{Ptr{sparseblock}}, + blockmatrix, + blockmatrix, + Ptr{Cdouble}, + blockmatrix, + blockmatrix, + ), + k, + constraints, + byblocks, + Zi, + X, + O, + work1, + work2, + ) +end + +function addscaledmat( + A::blockmatrix, + scale::Cdouble, + B::blockmatrix, + C::blockmatrix, +) + return ccall( + (:addscaledmat, CSDP.libcsdp), + Nothing, + (blockmatrix, Cdouble, blockmatrix, blockmatrix), + A, + scale, + B, + C, + ) end function zero_mat(A::blockmatrix) - ccall((:zero_mat,CSDP.libcsdp),Nothing,(blockmatrix,),A) + return ccall((:zero_mat, CSDP.libcsdp), Nothing, (blockmatrix,), A) end -function add_mat(A::blockmatrix,B::blockmatrix) - ccall((:add_mat,CSDP.libcsdp),Nothing,(blockmatrix,blockmatrix),A,B) +function add_mat(A::blockmatrix, B::blockmatrix) + return ccall( + (:add_mat, CSDP.libcsdp), + Nothing, + (blockmatrix, blockmatrix), + A, + B, + ) end function sym_mat(A::blockmatrix) - ccall((:sym_mat,CSDP.libcsdp),Nothing,(blockmatrix,),A) + return ccall((:sym_mat, CSDP.libcsdp), Nothing, (blockmatrix,), A) end function make_i(A::blockmatrix) - ccall((:make_i,CSDP.libcsdp),Nothing,(blockmatrix,),A) -end - -function copy_mat(A::blockmatrix,B::blockmatrix) - ccall((:copy_mat,CSDP.libcsdp),Nothing,(blockmatrix,blockmatrix),A,B) -end - -function mat_mult(scale1::Cdouble,scale2::Cdouble,A::blockmatrix,B::blockmatrix,C::blockmatrix) - ccall((:mat_mult,CSDP.libcsdp),Nothing,(Cdouble,Cdouble,blockmatrix,blockmatrix,blockmatrix),scale1,scale2,A,B,C) -end - -function mat_multspa(scale1::Cdouble,scale2::Cdouble,A::blockmatrix,B::blockmatrix,C::blockmatrix,fill::constraintmatrix) - ccall((:mat_multspa,CSDP.libcsdp),Nothing,(Cdouble,Cdouble,blockmatrix,blockmatrix,blockmatrix,constraintmatrix),scale1,scale2,A,B,C,fill) -end - -function mat_multspb(scale1::Cdouble,scale2::Cdouble,A::blockmatrix,B::blockmatrix,C::blockmatrix,fill::constraintmatrix) - ccall((:mat_multspb,CSDP.libcsdp),Nothing,(Cdouble,Cdouble,blockmatrix,blockmatrix,blockmatrix,constraintmatrix),scale1,scale2,A,B,C,fill) -end - -function mat_multspc(scale1::Cdouble,scale2::Cdouble,A::blockmatrix,B::blockmatrix,C::blockmatrix,fill::constraintmatrix) - ccall((:mat_multspc,CSDP.libcsdp),Nothing,(Cdouble,Cdouble,blockmatrix,blockmatrix,blockmatrix,constraintmatrix),scale1,scale2,A,B,C,fill) -end - -function mat_mult_raw(n::CSDP_INT,scale1::Cdouble,scale2::Cdouble,ap::Ptr{Cdouble},bp::Ptr{Cdouble},cp::Ptr{Cdouble}) - ccall((:mat_mult_raw,CSDP.libcsdp),Nothing,(CSDP_INT,Cdouble,Cdouble,Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble}),n,scale1,scale2,ap,bp,cp) -end - -function mat_mult_rawatlas(n::CSDP_INT,scale1::Cdouble,scale2::Cdouble,ap::Ptr{Cdouble},bp::Ptr{Cdouble},cp::Ptr{Cdouble}) - ccall((:mat_mult_rawatlas,CSDP.libcsdp),Nothing,(CSDP_INT,Cdouble,Cdouble,Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble}),n,scale1,scale2,ap,bp,cp) -end - -function matvec(A::blockmatrix,x::Ptr{Cdouble},y::Ptr{Cdouble}) - ccall((:matvec,CSDP.libcsdp),Nothing,(blockmatrix,Ptr{Cdouble},Ptr{Cdouble}),A,x,y) -end - -function alloc_mat(A::blockmatrix,pB::Ref{blockmatrix}) - ccall((:alloc_mat,CSDP.libcsdp),Nothing,(blockmatrix,Ref{blockmatrix}),A,pB) + return ccall((:make_i, CSDP.libcsdp), Nothing, (blockmatrix,), A) +end + +function copy_mat(A::blockmatrix, B::blockmatrix) + return ccall( + (:copy_mat, CSDP.libcsdp), + Nothing, + (blockmatrix, blockmatrix), + A, + B, + ) +end + +function mat_mult( + scale1::Cdouble, + scale2::Cdouble, + A::blockmatrix, + B::blockmatrix, + C::blockmatrix, +) + return ccall( + (:mat_mult, CSDP.libcsdp), + Nothing, + (Cdouble, Cdouble, blockmatrix, blockmatrix, blockmatrix), + scale1, + scale2, + A, + B, + C, + ) +end + +function mat_multspa( + scale1::Cdouble, + scale2::Cdouble, + A::blockmatrix, + B::blockmatrix, + C::blockmatrix, + fill::constraintmatrix, +) + return ccall( + (:mat_multspa, CSDP.libcsdp), + Nothing, + ( + Cdouble, + Cdouble, + blockmatrix, + blockmatrix, + blockmatrix, + constraintmatrix, + ), + scale1, + scale2, + A, + B, + C, + fill, + ) +end + +function mat_multspb( + scale1::Cdouble, + scale2::Cdouble, + A::blockmatrix, + B::blockmatrix, + C::blockmatrix, + fill::constraintmatrix, +) + return ccall( + (:mat_multspb, CSDP.libcsdp), + Nothing, + ( + Cdouble, + Cdouble, + blockmatrix, + blockmatrix, + blockmatrix, + constraintmatrix, + ), + scale1, + scale2, + A, + B, + C, + fill, + ) +end + +function mat_multspc( + scale1::Cdouble, + scale2::Cdouble, + A::blockmatrix, + B::blockmatrix, + C::blockmatrix, + fill::constraintmatrix, +) + return ccall( + (:mat_multspc, CSDP.libcsdp), + Nothing, + ( + Cdouble, + Cdouble, + blockmatrix, + blockmatrix, + blockmatrix, + constraintmatrix, + ), + scale1, + scale2, + A, + B, + C, + fill, + ) +end + +function mat_mult_raw( + n::CSDP_INT, + scale1::Cdouble, + scale2::Cdouble, + ap::Ptr{Cdouble}, + bp::Ptr{Cdouble}, + cp::Ptr{Cdouble}, +) + return ccall( + (:mat_mult_raw, CSDP.libcsdp), + Nothing, + (CSDP_INT, Cdouble, Cdouble, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}), + n, + scale1, + scale2, + ap, + bp, + cp, + ) +end + +function mat_mult_rawatlas( + n::CSDP_INT, + scale1::Cdouble, + scale2::Cdouble, + ap::Ptr{Cdouble}, + bp::Ptr{Cdouble}, + cp::Ptr{Cdouble}, +) + return ccall( + (:mat_mult_rawatlas, CSDP.libcsdp), + Nothing, + (CSDP_INT, Cdouble, Cdouble, Ptr{Cdouble}, Ptr{Cdouble}, Ptr{Cdouble}), + n, + scale1, + scale2, + ap, + bp, + cp, + ) +end + +function matvec(A::blockmatrix, x::Ptr{Cdouble}, y::Ptr{Cdouble}) + return ccall( + (:matvec, CSDP.libcsdp), + Nothing, + (blockmatrix, Ptr{Cdouble}, Ptr{Cdouble}), + A, + x, + y, + ) +end + +function alloc_mat(A::blockmatrix, pB::Ref{blockmatrix}) + return ccall( + (:alloc_mat, CSDP.libcsdp), + Nothing, + (blockmatrix, Ref{blockmatrix}), + A, + pB, + ) end function free_mat(A::blockmatrix) - ccall((:free_mat,CSDP.libcsdp),Nothing,(blockmatrix,),A) + return ccall((:free_mat, CSDP.libcsdp), Nothing, (blockmatrix,), A) end -function initparams(params::Ptr{paramstruc},pprintlevel::Ptr{CSDP_INT}) - ccall((:initparams,CSDP.libcsdp),Nothing,(Ptr{paramstruc},Ptr{CSDP_INT}),params,pprintlevel) +function initparams(params::Ptr{paramstruc}, pprintlevel::Ptr{CSDP_INT}) + return ccall( + (:initparams, CSDP.libcsdp), + Nothing, + (Ptr{paramstruc}, Ptr{CSDP_INT}), + params, + pprintlevel, + ) end -function loaded_initsoln(problem::Ptr{Cvoid}, X::Ref{blockmatrix}, Z::Ref{blockmatrix}) +function loaded_initsoln( + problem::Ptr{Cvoid}, + X::Ref{blockmatrix}, + Z::Ref{blockmatrix}, +) y = Ref{Ptr{Cdouble}}(C_NULL) - ccall((:loaded_initsoln,CSDP.libcsdp),Nothing,(Ptr{Cvoid},Ref{blockmatrix},Ref{Ptr{Cdouble}},Ref{blockmatrix}),problem,X,y,Z) + ccall( + (:loaded_initsoln, CSDP.libcsdp), + Nothing, + (Ptr{Cvoid}, Ref{blockmatrix}, Ref{Ptr{Cdouble}}, Ref{blockmatrix}), + problem, + X, + y, + Z, + ) return y[] end -function initsoln(n::CSDP_INT,k::CSDP_INT,C::blockmatrix,a::Ptr{Cdouble},constraints::Ptr{constraintmatrix}) +function initsoln( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, +) X = Ref{blockmatrix}(blockmatrix(0, C_NULL)) y = Ref{Ptr{Cdouble}}(C_NULL) Z = Ref{blockmatrix}(blockmatrix(0, C_NULL)) - ccall((:initsoln,CSDP.libcsdp),Nothing,(CSDP_INT,CSDP_INT,blockmatrix,Ptr{Cdouble},Ptr{constraintmatrix},Ref{blockmatrix},Ref{Ptr{Cdouble}},Ref{blockmatrix}),n,k,C,a,constraints,X,y,Z) - X[], y[], Z[] + ccall( + (:initsoln, CSDP.libcsdp), + Nothing, + ( + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + Ptr{constraintmatrix}, + Ref{blockmatrix}, + Ref{Ptr{Cdouble}}, + Ref{blockmatrix}, + ), + n, + k, + C, + a, + constraints, + X, + y, + Z, + ) + return X[], y[], Z[] end function trans(A::blockmatrix) - ccall((:trans,CSDP.libcsdp),Nothing,(blockmatrix,),A) + return ccall((:trans, CSDP.libcsdp), Nothing, (blockmatrix,), A) end -function chol_inv(A::blockmatrix,B::blockmatrix) - ccall((:chol_inv,CSDP.libcsdp),Nothing,(blockmatrix,blockmatrix),A,B) +function chol_inv(A::blockmatrix, B::blockmatrix) + return ccall( + (:chol_inv, CSDP.libcsdp), + Nothing, + (blockmatrix, blockmatrix), + A, + B, + ) end function chol(A::blockmatrix) - ccall((:chol,CSDP.libcsdp),CSDP_INT,(blockmatrix,),A) -end - -function solvesys(m::CSDP_INT,ldam::CSDP_INT,A::Ptr{Cdouble},rhs::Ptr{Cdouble}) - ccall((:solvesys,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,Ptr{Cdouble},Ptr{Cdouble}),m,ldam,A,rhs) -end - -function user_exit(n::CSDP_INT,k::CSDP_INT,C::blockmatrix,a::Ptr{Cdouble},dobj::Cdouble,pobj::Cdouble,constant_offset::Cdouble,constraints::Ptr{constraintmatrix},X::blockmatrix,y::Ptr{Cdouble},Z::blockmatrix,params::paramstruc) - ccall((:user_exit,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,blockmatrix,Ptr{Cdouble},Cdouble,Cdouble,Cdouble,Ptr{constraintmatrix},blockmatrix,Ptr{Cdouble},blockmatrix,paramstruc),n,k,C,a,dobj,pobj,constant_offset,constraints,X,y,Z,params) -end - -function read_sol(fname::Ptr{UInt8},n::CSDP_INT,k::CSDP_INT,C::blockmatrix,pX::Ptr{blockmatrix},py::Ptr{Ptr{Cdouble}},pZ::Ptr{blockmatrix}) - ccall((:read_sol,CSDP.libcsdp),CSDP_INT,(Ptr{UInt8},CSDP_INT,CSDP_INT,blockmatrix,Ptr{blockmatrix},Ptr{Ptr{Cdouble}},Ptr{blockmatrix}),fname,n,k,C,pX,py,pZ) -end - -function load_prob_from_file(fname::String,C::Ref{blockmatrix},printlevel::Integer=1) + return ccall((:chol, CSDP.libcsdp), CSDP_INT, (blockmatrix,), A) +end + +function solvesys( + m::CSDP_INT, + ldam::CSDP_INT, + A::Ptr{Cdouble}, + rhs::Ptr{Cdouble}, +) + return ccall( + (:solvesys, CSDP.libcsdp), + CSDP_INT, + (CSDP_INT, CSDP_INT, Ptr{Cdouble}, Ptr{Cdouble}), + m, + ldam, + A, + rhs, + ) +end + +function user_exit( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + dobj::Cdouble, + pobj::Cdouble, + constant_offset::Cdouble, + constraints::Ptr{constraintmatrix}, + X::blockmatrix, + y::Ptr{Cdouble}, + Z::blockmatrix, + params::paramstruc, +) + return ccall( + (:user_exit, CSDP.libcsdp), + CSDP_INT, + ( + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + Cdouble, + Cdouble, + Cdouble, + Ptr{constraintmatrix}, + blockmatrix, + Ptr{Cdouble}, + blockmatrix, + paramstruc, + ), + n, + k, + C, + a, + dobj, + pobj, + constant_offset, + constraints, + X, + y, + Z, + params, + ) +end + +function read_sol( + fname::Ptr{UInt8}, + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + pX::Ptr{blockmatrix}, + py::Ptr{Ptr{Cdouble}}, + pZ::Ptr{blockmatrix}, +) + return ccall( + (:read_sol, CSDP.libcsdp), + CSDP_INT, + ( + Ptr{UInt8}, + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{blockmatrix}, + Ptr{Ptr{Cdouble}}, + Ptr{blockmatrix}, + ), + fname, + n, + k, + C, + pX, + py, + pZ, + ) +end + +function load_prob_from_file( + fname::String, + C::Ref{blockmatrix}, + printlevel::Integer = 1, +) problem = Ref{Ptr{Cvoid}}(C_NULL) - ret = ccall((:load_prob_from_file,CSDP.libcsdp),CSDP_INT,(Ptr{UInt8},Ref{blockmatrix},Ref{Ptr{Cvoid}},CSDP_INT),fname,C,problem,printlevel) + ret = ccall( + (:load_prob_from_file, CSDP.libcsdp), + CSDP_INT, + (Ptr{UInt8}, Ref{blockmatrix}, Ref{Ptr{Cvoid}}, CSDP_INT), + fname, + C, + problem, + printlevel, + ) if !iszero(ret) error("`CSDP.load_prob_from_file` failed.") end return LoadingProblem(problem[]) end -function read_prob(fname::String,printlevel::Integer=1) +function read_prob(fname::String, printlevel::Integer = 1) n = Ref{CSDP_INT}(0) k = Ref{CSDP_INT}(0) C = Ref{blockmatrix}(blockmatrix(0, C_NULL)) a = Ref{Ptr{Cdouble}}(C_NULL) constraints = Ref{Ptr{constraintmatrix}}(C_NULL) - ccall((:read_prob,CSDP.libcsdp),CSDP_INT,(Ptr{UInt8},Ref{CSDP_INT},Ref{CSDP_INT},Ref{blockmatrix},Ref{Ptr{Cdouble}},Ref{Ptr{constraintmatrix}},CSDP_INT),fname,n,k,C,a,constraints,printlevel) + ccall( + (:read_prob, CSDP.libcsdp), + CSDP_INT, + ( + Ptr{UInt8}, + Ref{CSDP_INT}, + Ref{CSDP_INT}, + Ref{blockmatrix}, + Ref{Ptr{Cdouble}}, + Ref{Ptr{constraintmatrix}}, + CSDP_INT, + ), + fname, + n, + k, + C, + a, + constraints, + printlevel, + ) C = mywrap(C[]) a = mywrap(a[], k[]) constraints = mywrap(constraints[], k[]) @@ -239,38 +860,97 @@ function read_prob(fname::String,printlevel::Integer=1) # the array of blocks, .. inside should be free'd though #constraints = map(c->ConstraintMatrix(c, k[]), constraints) @assert n[] == size(C, 1) - C, a, constraints -end - -function write_prob(fname::String, - n::CSDP_INT, - k::CSDP_INT, - C::blockmatrix, - a::Ptr{Cdouble}, - constraints::Ptr{constraintmatrix}) - ccall((:write_prob,CSDP.libcsdp),CSDP_INT,(Ptr{UInt8},CSDP_INT,CSDP_INT,blockmatrix,Ptr{Cdouble},Ptr{constraintmatrix}), - fname,n,k,C,a,constraints) -end - -function write_sol(fname::String, - n::CSDP_INT, - k::CSDP_INT, - X::blockmatrix, - y::Ptr{Cdouble}, - Z::blockmatrix) - ccall((:write_sol,CSDP.libcsdp), - CSDP_INT, - (Ptr{UInt8}, - CSDP_INT, - CSDP_INT, - blockmatrix, - Ptr{Cdouble}, - blockmatrix), - fname,n,k,X,y,Z) -end - -function free_prob(n::CSDP_INT,k::CSDP_INT,C::blockmatrix,a::Ptr{Cdouble},constraints::Ptr{constraintmatrix},X::blockmatrix,y::Ptr{Cdouble},Z::blockmatrix) - ccall((:free_prob,CSDP.libcsdp),Nothing,(CSDP_INT,CSDP_INT,blockmatrix,Ptr{Cdouble},Ptr{constraintmatrix},blockmatrix,Ptr{Cdouble},blockmatrix),n,k,C,a,constraints,X,y,Z) + return C, a, constraints +end + +function write_prob( + fname::String, + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, +) + return ccall( + (:write_prob, CSDP.libcsdp), + CSDP_INT, + ( + Ptr{UInt8}, + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + Ptr{constraintmatrix}, + ), + fname, + n, + k, + C, + a, + constraints, + ) +end + +function write_sol( + fname::String, + n::CSDP_INT, + k::CSDP_INT, + X::blockmatrix, + y::Ptr{Cdouble}, + Z::blockmatrix, +) + return ccall( + (:write_sol, CSDP.libcsdp), + CSDP_INT, + ( + Ptr{UInt8}, + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + blockmatrix, + ), + fname, + n, + k, + X, + y, + Z, + ) +end + +function free_prob( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, + X::blockmatrix, + y::Ptr{Cdouble}, + Z::blockmatrix, +) + return ccall( + (:free_prob, CSDP.libcsdp), + Nothing, + ( + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + Ptr{constraintmatrix}, + blockmatrix, + Ptr{Cdouble}, + blockmatrix, + ), + n, + k, + C, + a, + constraints, + X, + y, + Z, + ) end #function new_blockmatrix(nblocks::Integer) @@ -280,54 +960,154 @@ end # ccall((:free_blockmatrix,CSDP.libcsdp),Nothing,(Ptr{Cvoid},),C) #end - function Base.getindex(A::blockrec, i::Integer, j::Integer) - return ccall((:getindex,CSDP.libcsdp), Cdouble, (blockrec,CSDP_INT,CSDP_INT), A, i, j) + return ccall( + (:getindex, CSDP.libcsdp), + Cdouble, + (blockrec, CSDP_INT, CSDP_INT), + A, + i, + j, + ) end function getblockrec(A::blockmatrix, i::Integer) - return ccall((:getblockrec,CSDP.libcsdp), blockrec, (blockmatrix,CSDP_INT), A, i) -end - -function allocate_loading_prob(pC::Ref{blockmatrix}, block_dims::Ptr{CSDP_INT}, num_constraints::Integer, num_entries::Ptr{CSDP_INT}, printlevel::Integer) - return ccall((:allocate_loading_prob,CSDP.libcsdp),Ptr{Cvoid},(Ref{blockmatrix},Ptr{CSDP_INT},CSDP_INT,Ptr{CSDP_INT},CSDP_INT),pC,block_dims,num_constraints,num_entries,printlevel) + return ccall( + (:getblockrec, CSDP.libcsdp), + blockrec, + (blockmatrix, CSDP_INT), + A, + i, + ) +end + +function allocate_loading_prob( + pC::Ref{blockmatrix}, + block_dims::Ptr{CSDP_INT}, + num_constraints::Integer, + num_entries::Ptr{CSDP_INT}, + printlevel::Integer, +) + return ccall( + (:allocate_loading_prob, CSDP.libcsdp), + Ptr{Cvoid}, + (Ref{blockmatrix}, Ptr{CSDP_INT}, CSDP_INT, Ptr{CSDP_INT}, CSDP_INT), + pC, + block_dims, + num_constraints, + num_entries, + printlevel, + ) end function free_loading_prob(problem::Ptr{Cvoid}) - ccall((:free_loading_prob,CSDP.libcsdp),Nothing,(Ptr{Cvoid},),problem) -end -function free_loaded_prob(problem::Ptr{Cvoid},X::blockmatrix,y::Ptr{Cdouble},Z::blockmatrix) - ccall((:free_loaded_prob,CSDP.libcsdp),Nothing,(Ptr{Cvoid},blockmatrix,Ptr{Cdouble},blockmatrix),problem,X,y,Z) + return ccall( + (:free_loading_prob, CSDP.libcsdp), + Nothing, + (Ptr{Cvoid},), + problem, + ) +end +function free_loaded_prob( + problem::Ptr{Cvoid}, + X::blockmatrix, + y::Ptr{Cdouble}, + Z::blockmatrix, +) + return ccall( + (:free_loaded_prob, CSDP.libcsdp), + Nothing, + (Ptr{Cvoid}, blockmatrix, Ptr{Cdouble}, blockmatrix), + problem, + X, + y, + Z, + ) end function setconstant(problem::Ptr{Cvoid}, mat::Integer, ent::Cdouble) - ccall((:setconstant,CSDP.libcsdp),Nothing,(Ptr{Cvoid},CSDP_INT,Cdouble),problem,mat,ent) -end -function addentry(problem::Ptr{Cvoid}, mat::Integer, blk::Integer, indexi::Integer, indexj::Integer, ent::Cdouble, allow_duplicates::Integer) - ccall((:addentry,CSDP.libcsdp),CSDP_INT,(Ptr{Cvoid},CSDP_INT,CSDP_INT,CSDP_INT,CSDP_INT,Cdouble,CSDP_INT),problem,mat,blk,indexi,indexj,ent,allow_duplicates) -end - -function sdp(n::CSDP_INT, k::CSDP_INT, - C::blockmatrix, a::Ptr{Cdouble}, constant_offset::Cdouble, constraints::Ptr{constraintmatrix}, - byblocks::Ptr{Ptr{sparseblock}}, - X::blockmatrix, y::Ptr{Cdouble}, Z::blockmatrix, - workvec1::Ptr{Cdouble},workvec2::Ptr{Cdouble},workvec3::Ptr{Cdouble},workvec4::Ptr{Cdouble},workvec5::Ptr{Cdouble},workvec6::Ptr{Cdouble},workvec7::Ptr{Cdouble},workvec8::Ptr{Cdouble}, - diagO::Ptr{Cdouble}, - besty::Ptr{Cdouble}, - O::Ptr{Cdouble}, rhs::Ptr{Cdouble}, dy::Ptr{Cdouble}, dy1::Ptr{Cdouble}, Fp::Ptr{Cdouble}, - printlevel::CSDP_INT, parameters::paramstruc) - + return ccall( + (:setconstant, CSDP.libcsdp), + Nothing, + (Ptr{Cvoid}, CSDP_INT, Cdouble), + problem, + mat, + ent, + ) +end +function addentry( + problem::Ptr{Cvoid}, + mat::Integer, + blk::Integer, + indexi::Integer, + indexj::Integer, + ent::Cdouble, + allow_duplicates::Integer, +) + return ccall( + (:addentry, CSDP.libcsdp), + CSDP_INT, + (Ptr{Cvoid}, CSDP_INT, CSDP_INT, CSDP_INT, CSDP_INT, Cdouble, CSDP_INT), + problem, + mat, + blk, + indexi, + indexj, + ent, + allow_duplicates, + ) +end + +function sdp( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + constant_offset::Cdouble, + constraints::Ptr{constraintmatrix}, + byblocks::Ptr{Ptr{sparseblock}}, + X::blockmatrix, + y::Ptr{Cdouble}, + Z::blockmatrix, + workvec1::Ptr{Cdouble}, + workvec2::Ptr{Cdouble}, + workvec3::Ptr{Cdouble}, + workvec4::Ptr{Cdouble}, + workvec5::Ptr{Cdouble}, + workvec6::Ptr{Cdouble}, + workvec7::Ptr{Cdouble}, + workvec8::Ptr{Cdouble}, + diagO::Ptr{Cdouble}, + besty::Ptr{Cdouble}, + O::Ptr{Cdouble}, + rhs::Ptr{Cdouble}, + dy::Ptr{Cdouble}, + dy1::Ptr{Cdouble}, + Fp::Ptr{Cdouble}, + printlevel::CSDP_INT, + parameters::paramstruc, +) pobj = Ref{Cdouble}(0.0) dobj = Ref{Cdouble}(0.0) - work1 = blockmatrix(); alloc_mat(C, Ref{blockmatrix}(work1)); - work2 = blockmatrix(); alloc_mat(C, Ref{blockmatrix}(work2)); - work3 = blockmatrix(); alloc_mat(C, Ref{blockmatrix}(work3)); - bestx = blockmatrix(); alloc_mat_packed(C, Ref{blockmatrix}(bestx)); - bestz = blockmatrix(); alloc_mat_packed(C, Ref{blockmatrix}(bestz)); - cholxinv = blockmatrix(); alloc_mat_packed(C, Ref{blockmatrix}(cholxinv)); - cholzinv = blockmatrix(); alloc_mat_packed(C, Ref{blockmatrix}(cholzinv)); - Zi = blockmatrix(); alloc_mat(C, Ref{blockmatrix}(Zi)); - dZ = blockmatrix(); alloc_mat(C, Ref{blockmatrix}(dZ)); - dX = blockmatrix(); alloc_mat(C, Ref{blockmatrix}(dX)); + work1 = blockmatrix() + alloc_mat(C, Ref{blockmatrix}(work1)) + work2 = blockmatrix() + alloc_mat(C, Ref{blockmatrix}(work2)) + work3 = blockmatrix() + alloc_mat(C, Ref{blockmatrix}(work3)) + bestx = blockmatrix() + alloc_mat_packed(C, Ref{blockmatrix}(bestx)) + bestz = blockmatrix() + alloc_mat_packed(C, Ref{blockmatrix}(bestz)) + cholxinv = blockmatrix() + alloc_mat_packed(C, Ref{blockmatrix}(cholxinv)) + cholzinv = blockmatrix() + alloc_mat_packed(C, Ref{blockmatrix}(cholzinv)) + Zi = blockmatrix() + alloc_mat(C, Ref{blockmatrix}(Zi)) + dZ = blockmatrix() + alloc_mat(C, Ref{blockmatrix}(dZ)) + dX = blockmatrix() + alloc_mat(C, Ref{blockmatrix}(dX)) fill = Ref{constraintmatrix}(constraintmatrix(C_NULL)) makefill(k, C, constraints, fill, work1, printlevel) @@ -336,76 +1116,350 @@ function sdp(n::CSDP_INT, k::CSDP_INT, sort_entries(k, C, constraints) - status = ccall((:sdp, CSDP.libcsdp), CSDP_INT, - (CSDP_INT, CSDP_INT, # n, k - blockmatrix, Ptr{Cdouble}, Cdouble, Ptr{constraintmatrix}, - Ptr{Ptr{sparseblock}}, constraintmatrix, # byblocks, fill - blockmatrix, Ptr{Cdouble}, blockmatrix, - blockmatrix, blockmatrix, # cholxinv, cholzinv - Ref{Cdouble}, Ref{Cdouble}, # pobj, dobj - blockmatrix,blockmatrix,blockmatrix, # work1, work2, work3 - Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble}, - Ptr{Cdouble}, # diagO - blockmatrix, # bestx - Ptr{Cdouble}, # besty - blockmatrix,blockmatrix, # bestz, Zi - Ptr{Cdouble},Ptr{Cdouble},blockmatrix,blockmatrix,Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble}, - CSDP_INT,paramstruc), - n, k, - C, a, constant_offset, constraints, - byblocks, fill[], - X, y, Z, - cholxinv,cholzinv, - pobj, dobj, - work1, work2, work3, - workvec1, workvec2, workvec3, workvec4, workvec5, workvec6, workvec7, workvec8, - diagO, - bestx, - besty, - bestz, Zi, - O, rhs, dZ, dX, dy, dy1, Fp, - printlevel, parameters) - - free_mat(work1); - free_mat(work2); - free_mat(work3); - free_mat_packed(bestx); - free_mat_packed(bestz); - free_mat_packed(cholxinv); - free_mat_packed(cholzinv); - - free_mat(Zi); - free_mat(dZ); - free_mat(dX); + status = ccall( + (:sdp, CSDP.libcsdp), + CSDP_INT, + ( + CSDP_INT, + CSDP_INT, # n, k + blockmatrix, + Ptr{Cdouble}, + Cdouble, + Ptr{constraintmatrix}, + Ptr{Ptr{sparseblock}}, + constraintmatrix, # byblocks, fill + blockmatrix, + Ptr{Cdouble}, + blockmatrix, + blockmatrix, + blockmatrix, # cholxinv, cholzinv + Ref{Cdouble}, + Ref{Cdouble}, # pobj, dobj + blockmatrix, + blockmatrix, + blockmatrix, # work1, work2, work3 + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, # diagO + blockmatrix, # bestx + Ptr{Cdouble}, # besty + blockmatrix, + blockmatrix, # bestz, Zi + Ptr{Cdouble}, + Ptr{Cdouble}, + blockmatrix, + blockmatrix, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + CSDP_INT, + paramstruc, + ), + n, + k, + C, + a, + constant_offset, + constraints, + byblocks, + fill[], + X, + y, + Z, + cholxinv, + cholzinv, + pobj, + dobj, + work1, + work2, + work3, + workvec1, + workvec2, + workvec3, + workvec4, + workvec5, + workvec6, + workvec7, + workvec8, + diagO, + bestx, + besty, + bestz, + Zi, + O, + rhs, + dZ, + dX, + dy, + dy1, + Fp, + printlevel, + parameters, + ) + + free_mat(work1) + free_mat(work2) + free_mat(work3) + free_mat_packed(bestx) + free_mat_packed(bestz) + free_mat_packed(cholxinv) + free_mat_packed(cholzinv) + + free_mat(Zi) + free_mat(dZ) + free_mat(dX) return status, pobj[], dobj[] end -function loaded_sdp(problem::Ptr{Cvoid},constant_offset::Cdouble,pX::Ref{blockmatrix},py::Ref{Ptr{Cdouble}},pZ::Ref{blockmatrix},printlevel::CSDP_INT,parameters::paramstruc) +function loaded_sdp( + problem::Ptr{Cvoid}, + constant_offset::Cdouble, + pX::Ref{blockmatrix}, + py::Ref{Ptr{Cdouble}}, + pZ::Ref{blockmatrix}, + printlevel::CSDP_INT, + parameters::paramstruc, +) pobj = Ref{Cdouble}(0.0) dobj = Ref{Cdouble}(0.0) - status = ccall((:loaded_sdp,CSDP.libcsdp),CSDP_INT, - (Ptr{Cvoid},Cdouble, Ref{blockmatrix},Ref{Ptr{Cdouble}},Ref{blockmatrix},Ref{Cdouble},Ref{Cdouble},CSDP_INT,paramstruc), - problem, constant_offset,pX, py, pZ,pobj,dobj,printlevel,parameters) + status = ccall( + (:loaded_sdp, CSDP.libcsdp), + CSDP_INT, + ( + Ptr{Cvoid}, + Cdouble, + Ref{blockmatrix}, + Ref{Ptr{Cdouble}}, + Ref{blockmatrix}, + Ref{Cdouble}, + Ref{Cdouble}, + CSDP_INT, + paramstruc, + ), + problem, + constant_offset, + pX, + py, + pZ, + pobj, + dobj, + printlevel, + parameters, + ) return status, pobj[], dobj[] end -function parametrized_sdp(n::CSDP_INT,k::CSDP_INT,C::blockmatrix,a::Ptr{Cdouble},constraints::Ptr{constraintmatrix},constant_offset::Cdouble,pX::Ptr{blockmatrix},py::Ref{Ptr{Cdouble}},pZ::Ptr{blockmatrix},printlevel::CSDP_INT,parameters::paramstruc) +function parametrized_sdp( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, + constant_offset::Cdouble, + pX::Ptr{blockmatrix}, + py::Ref{Ptr{Cdouble}}, + pZ::Ptr{blockmatrix}, + printlevel::CSDP_INT, + parameters::paramstruc, +) pobj = Ref{Cdouble}(0.0) dobj = Ref{Cdouble}(0.0) - status = ccall((:parametrized_sdp,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,blockmatrix,Ptr{Cdouble},Ptr{constraintmatrix},Cdouble,Ptr{blockmatrix},Ref{Ptr{Cdouble}},Ptr{blockmatrix},Ref{Cdouble},Ref{Cdouble},CSDP_INT,paramstruc),n,k,C,a,constraints,constant_offset,pX,py,pZ,pobj,dobj,printlevel,parameters) + status = ccall( + (:parametrized_sdp, CSDP.libcsdp), + CSDP_INT, + ( + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + Ptr{constraintmatrix}, + Cdouble, + Ptr{blockmatrix}, + Ref{Ptr{Cdouble}}, + Ptr{blockmatrix}, + Ref{Cdouble}, + Ref{Cdouble}, + CSDP_INT, + paramstruc, + ), + n, + k, + C, + a, + constraints, + constant_offset, + pX, + py, + pZ, + pobj, + dobj, + printlevel, + parameters, + ) return status, pobj[], dobj[] end -function easy_sdp(n::CSDP_INT,k::CSDP_INT,C::blockmatrix,a::Ptr{Cdouble},constraints::Ptr{constraintmatrix},constant_offset::Cdouble,pX::Ptr{blockmatrix},py::Ref{Ptr{Cdouble}},pZ::Ptr{blockmatrix}) +function easy_sdp( + n::CSDP_INT, + k::CSDP_INT, + C::blockmatrix, + a::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, + constant_offset::Cdouble, + pX::Ptr{blockmatrix}, + py::Ref{Ptr{Cdouble}}, + pZ::Ptr{blockmatrix}, +) pobj = Ref{Cdouble}(0.0) dobj = Ref{Cdouble}(0.0) - status = ccall((:easy_sdp,CSDP.libcsdp),CSDP_INT,(CSDP_INT,CSDP_INT,blockmatrix,Ptr{Cdouble},Ptr{constraintmatrix},Cdouble,Ptr{blockmatrix},Ref{Ptr{Cdouble}},Ptr{blockmatrix},Ref{Cdouble},Ref{Cdouble}),n,k,C,a,constraints,constant_offset,pX,py,pZ,pobj,dobj) + status = ccall( + (:easy_sdp, CSDP.libcsdp), + CSDP_INT, + ( + CSDP_INT, + CSDP_INT, + blockmatrix, + Ptr{Cdouble}, + Ptr{constraintmatrix}, + Cdouble, + Ptr{blockmatrix}, + Ref{Ptr{Cdouble}}, + Ptr{blockmatrix}, + Ref{Cdouble}, + Ref{Cdouble}, + ), + n, + k, + C, + a, + constraints, + constant_offset, + pX, + py, + pZ, + pobj, + dobj, + ) return status, pobj[], dobj[] end -function tweakgap(n::CSDP_INT,k::CSDP_INT,a::Ptr{Cdouble},constraints::Ptr{constraintmatrix},gap::Cdouble,Z::blockmatrix,dZ::blockmatrix,y::Ptr{Cdouble},dy::Ptr{Cdouble},work1::blockmatrix,work2::blockmatrix,work3::blockmatrix,work4::blockmatrix,workvec1::Ptr{Cdouble},workvec2::Ptr{Cdouble},workvec3::Ptr{Cdouble},workvec4::Ptr{Cdouble},printlevel::CSDP_INT) - ccall((:tweakgap,CSDP.libcsdp),Nothing,(CSDP_INT,CSDP_INT,Ptr{Cdouble},Ptr{constraintmatrix},Cdouble,blockmatrix,blockmatrix,Ptr{Cdouble},Ptr{Cdouble},blockmatrix,blockmatrix,blockmatrix,blockmatrix,Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},CSDP_INT),n,k,a,constraints,gap,Z,dZ,y,dy,work1,work2,work3,work4,workvec1,workvec2,workvec3,workvec4,printlevel) -end - -function bisect_(n::Ptr{CSDP_INT},eps1::Ptr{Cdouble},d::Ptr{Cdouble},e::Ptr{Cdouble},e2::Ptr{Cdouble},lb::Ptr{Cdouble},ub::Ptr{Cdouble},mm::Ptr{CSDP_INT},m::Ptr{CSDP_INT},w::Ptr{Cdouble},ind::Ptr{CSDP_INT},ierr::Ptr{CSDP_INT},rv4::Ptr{Cdouble},rv5::Ptr{Cdouble}) - ccall((:bisect_,CSDP.libcsdp),CSDP_INT,(Ptr{CSDP_INT},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble},Ptr{CSDP_INT},Ptr{CSDP_INT},Ptr{Cdouble},Ptr{CSDP_INT},Ptr{CSDP_INT},Ptr{Cdouble},Ptr{Cdouble}),n,eps1,d,e,e2,lb,ub,mm,m,w,ind,ierr,rv4,rv5) +function tweakgap( + n::CSDP_INT, + k::CSDP_INT, + a::Ptr{Cdouble}, + constraints::Ptr{constraintmatrix}, + gap::Cdouble, + Z::blockmatrix, + dZ::blockmatrix, + y::Ptr{Cdouble}, + dy::Ptr{Cdouble}, + work1::blockmatrix, + work2::blockmatrix, + work3::blockmatrix, + work4::blockmatrix, + workvec1::Ptr{Cdouble}, + workvec2::Ptr{Cdouble}, + workvec3::Ptr{Cdouble}, + workvec4::Ptr{Cdouble}, + printlevel::CSDP_INT, +) + return ccall( + (:tweakgap, CSDP.libcsdp), + Nothing, + ( + CSDP_INT, + CSDP_INT, + Ptr{Cdouble}, + Ptr{constraintmatrix}, + Cdouble, + blockmatrix, + blockmatrix, + Ptr{Cdouble}, + Ptr{Cdouble}, + blockmatrix, + blockmatrix, + blockmatrix, + blockmatrix, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + CSDP_INT, + ), + n, + k, + a, + constraints, + gap, + Z, + dZ, + y, + dy, + work1, + work2, + work3, + work4, + workvec1, + workvec2, + workvec3, + workvec4, + printlevel, + ) +end + +function bisect_( + n::Ptr{CSDP_INT}, + eps1::Ptr{Cdouble}, + d::Ptr{Cdouble}, + e::Ptr{Cdouble}, + e2::Ptr{Cdouble}, + lb::Ptr{Cdouble}, + ub::Ptr{Cdouble}, + mm::Ptr{CSDP_INT}, + m::Ptr{CSDP_INT}, + w::Ptr{Cdouble}, + ind::Ptr{CSDP_INT}, + ierr::Ptr{CSDP_INT}, + rv4::Ptr{Cdouble}, + rv5::Ptr{Cdouble}, +) + return ccall( + (:bisect_, CSDP.libcsdp), + CSDP_INT, + ( + Ptr{CSDP_INT}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{Cdouble}, + Ptr{CSDP_INT}, + Ptr{CSDP_INT}, + Ptr{Cdouble}, + Ptr{CSDP_INT}, + Ptr{CSDP_INT}, + Ptr{Cdouble}, + Ptr{Cdouble}, + ), + n, + eps1, + d, + e, + e2, + lb, + ub, + mm, + m, + w, + ind, + ierr, + rv4, + rv5, + ) end diff --git a/src/declarations.jl b/src/declarations.jl index 40a45e3..442ba43 100644 --- a/src/declarations.jl +++ b/src/declarations.jl @@ -4,35 +4,74 @@ struct LoadingProblem ptr::Ptr{Cvoid} end -function allocate_loading_prob(pC::Ref{blockmatrix}, block_dims::Vector{CSDP_INT}, num_constraints::Integer, num_entries::Matrix{CSDP_INT}, printlevel::Integer) - ptr = allocate_loading_prob(pC, fptr(block_dims), num_constraints, pointer(num_entries), printlevel) +function allocate_loading_prob( + pC::Ref{blockmatrix}, + block_dims::Vector{CSDP_INT}, + num_constraints::Integer, + num_entries::Matrix{CSDP_INT}, + printlevel::Integer, +) + ptr = allocate_loading_prob( + pC, + fptr(block_dims), + num_constraints, + pointer(num_entries), + printlevel, + ) return LoadingProblem(ptr) end free_loading_prob(problem::LoadingProblem) = free_loading_prob(problem.ptr) -function free_loaded_prob(problem::LoadingProblem, X::blockmatrix, y::Vector{Cdouble}, Z::blockmatrix) - free_loaded_prob(problem.ptr, X, fptr(y), Z) +function free_loaded_prob( + problem::LoadingProblem, + X::blockmatrix, + y::Vector{Cdouble}, + Z::blockmatrix, +) + return free_loaded_prob(problem.ptr, X, fptr(y), Z) end function setconstant(problem::LoadingProblem, mat::Integer, ent::Cdouble) - setconstant(problem.ptr, mat, ent) + return setconstant(problem.ptr, mat, ent) end -function addentry(problem::LoadingProblem, mat::Integer, blk::Integer, indexi::Integer, indexj::Integer, ent::Cdouble, allow_duplicates::Bool) +function addentry( + problem::LoadingProblem, + mat::Integer, + blk::Integer, + indexi::Integer, + indexj::Integer, + ent::Cdouble, + allow_duplicates::Bool, +) ret = addentry(problem.ptr, mat, blk, indexi, indexj, ent, allow_duplicates) return !iszero(ret) end -function loaded_initsoln(problem::LoadingProblem, num_constraints::Integer, X::Ref{blockmatrix}, Z::Ref{blockmatrix}) +function loaded_initsoln( + problem::LoadingProblem, + num_constraints::Integer, + X::Ref{blockmatrix}, + Z::Ref{blockmatrix}, +) y = loaded_initsoln(problem.ptr, X, Z) return mywrap(y, num_constraints) end -function initsoln(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{constraintmatrix}) +function initsoln( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{constraintmatrix}, +) m = length(As) - X, y, Z = initsoln(CSDP_INT(size(C, 1)), CSDP_INT(m), C.csdp, fptr(b), fptr(As)) - mywrap(X), mywrap(y, m), mywrap(Z) + X, y, Z = + initsoln(CSDP_INT(size(C, 1)), CSDP_INT(m), C.csdp, fptr(b), fptr(As)) + return mywrap(X), mywrap(y, m), mywrap(Z) end -function initsoln(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}) - initsoln(C, b, [A.csdp for A in As]) +function initsoln( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, +) + return initsoln(C, b, [A.csdp for A in As]) end function setupAs!(As::Vector{ConstraintMatrix}, C::BlockMatrix) @@ -49,7 +88,8 @@ function setupAs!(As::Vector{ConstraintMatrix}, C::BlockMatrix) @assert nblocks == length(A.jblocks) for blk in 1:nblocks jblock = A.jblocks[blk] - if jblock.csdp.numentries > 0.25 * jblock.csdp.blocksize && jblock.csdp.numentries > 15 + if jblock.csdp.numentries > 0.25 * jblock.csdp.blocksize && + jblock.csdp.numentries > 15 jblock.csdp.issparse = 0 else jblock.csdp.issparse = 1 @@ -63,57 +103,101 @@ function setupAs!(As::Vector{ConstraintMatrix}, C::BlockMatrix) byblocks[blk] = pointer_from_objref(jblock.csdp) end end - byblocks + return byblocks end -sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, params::Dict{Symbol}) = sdp(C, b, As, 0.0, X, y, Z, options(params)...) -sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, printlevel, params) = sdp(C, b, As, 0.0, X, y, Z, printlevel, params) -sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, co::Cdouble, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, params::Dict{Symbol}) = sdp(C, b, As, co, X, y, Z, options(params)...) -function sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, co::Cdouble, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, printlevel, params) +function sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + params::Dict{Symbol}, +) + return sdp(C, b, As, 0.0, X, y, Z, options(params)...) +end +function sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + printlevel, + params, +) + return sdp(C, b, As, 0.0, X, y, Z, printlevel, params) +end +function sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + co::Cdouble, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + params::Dict{Symbol}, +) + return sdp(C, b, As, co, X, y, Z, options(params)...) +end +function sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + co::Cdouble, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + printlevel, + params, +) # I pass pointers pX, py and pZ to X, y and Z but only *pX, *py and *pZ are use in the code # so no need to worry, they won't change :) Xcsdp = X.csdp ycsdp = fptr(y) Zcsdp = Z.csdp - Ascsdp = map(A->A.csdp, As) + Ascsdp = map(A -> A.csdp, As) n = CSDP_INT(size(C, 1)) k = CSDP_INT(length(As)) - nd = sizeof(Cdouble) * (n+1) - kd = sizeof(Cdouble) * (k+1) + nd = sizeof(Cdouble) * (n + 1) + kd = sizeof(Cdouble) * (k + 1) md = max(nd, kd) - ldam = (iseven(k) ? k+1 : k) + ldam = (iseven(k) ? k + 1 : k) ld = sizeof(Cdouble) * ldam * ldam byblocks = setupAs!(As, C) - status, pobj, dobj = sdp(n, # n::CSDP_INT - k, # k::CSDP_INT - C.csdp, # C::blockmatrix - fptr(b), # a::Ptr{Cdouble} - co, # constant_offset::Cdouble - fptr(Ascsdp), # constraints::Ptr{constraintmatrix} - fptr(byblocks), - Xcsdp, # X::blockmatrix - ycsdp, # y::Ptr{Cdouble} - Zcsdp, # Z::blockmatrix - pointer(Vector{Cdouble}(undef, md)), # workvec1::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec2::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec3::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec4::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec5::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec6::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec7::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # workvec8::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, md)), # diagO::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, kd)), # besty::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, ld)), # O::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, kd)), # rhs::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, kd)), # dy::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, kd)), # dy1::Ptr{Cdouble} - pointer(Vector{Cdouble}(undef, kd)), # Fp::Ptr{Cdouble} - CSDP_INT(printlevel), # printlevel::CSDP_INT - params) # parameters::paramstruc + status, pobj, dobj = sdp( + n, # n::CSDP_INT + k, # k::CSDP_INT + C.csdp, # C::blockmatrix + fptr(b), # a::Ptr{Cdouble} + co, # constant_offset::Cdouble + fptr(Ascsdp), # constraints::Ptr{constraintmatrix} + fptr(byblocks), + Xcsdp, # X::blockmatrix + ycsdp, # y::Ptr{Cdouble} + Zcsdp, # Z::blockmatrix + pointer(Vector{Cdouble}(undef, md)), # workvec1::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec2::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec3::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec4::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec5::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec6::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec7::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # workvec8::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, md)), # diagO::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, kd)), # besty::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, ld)), # O::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, kd)), # rhs::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, kd)), # dy::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, kd)), # dy1::Ptr{Cdouble} + pointer(Vector{Cdouble}(undef, kd)), # Fp::Ptr{Cdouble} + CSDP_INT(printlevel), # printlevel::CSDP_INT + params, + ) # parameters::paramstruc # I can even assert that they won't change @assert Xcsdp == X.csdp @assert ycsdp == fptr(y) @@ -121,10 +205,44 @@ function sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, c return status, pobj, dobj end -loaded_sdp(problem::LoadingProblem, X::Ref{blockmatrix}, y::Vector{Cdouble}, Z::Ref{blockmatrix}, params::Dict{Symbol}) = loaded_sdp(problem, 0.0, X, y, Z, options(params)...) -loaded_sdp(problem::LoadingProblem, X::Ref{blockmatrix}, y::Vector{Cdouble}, Z::Ref{blockmatrix}, printlevel, params) = loaded_sdp(problem, 0.0, X, y, Z, printlevel, params) -loaded_sdp(problem::LoadingProblem, co::Cdouble, X::Ref{blockmatrix}, y::Vector{Cdouble}, Z::Ref{blockmatrix}, params::Dict{Symbol}) = loaded_sdp(problem, co, X, y, Z, options(params)...) -function loaded_sdp(problem::LoadingProblem, co::Cdouble, X::Ref{blockmatrix}, y::Vector{Cdouble}, Z::Ref{blockmatrix}, printlevel, params) +function loaded_sdp( + problem::LoadingProblem, + X::Ref{blockmatrix}, + y::Vector{Cdouble}, + Z::Ref{blockmatrix}, + params::Dict{Symbol}, +) + return loaded_sdp(problem, 0.0, X, y, Z, options(params)...) +end +function loaded_sdp( + problem::LoadingProblem, + X::Ref{blockmatrix}, + y::Vector{Cdouble}, + Z::Ref{blockmatrix}, + printlevel, + params, +) + return loaded_sdp(problem, 0.0, X, y, Z, printlevel, params) +end +function loaded_sdp( + problem::LoadingProblem, + co::Cdouble, + X::Ref{blockmatrix}, + y::Vector{Cdouble}, + Z::Ref{blockmatrix}, + params::Dict{Symbol}, +) + return loaded_sdp(problem, co, X, y, Z, options(params)...) +end +function loaded_sdp( + problem::LoadingProblem, + co::Cdouble, + X::Ref{blockmatrix}, + y::Vector{Cdouble}, + Z::Ref{blockmatrix}, + printlevel, + params, +) # I pass pointers py to X, y and Z but only *pX, *py and *pZ are # used in the code so no need to worry, they won't change :) ycsdp = Ref{Ptr{Cdouble}}(fptr(y)) @@ -136,22 +254,65 @@ function loaded_sdp(problem::LoadingProblem, co::Cdouble, X::Ref{blockmatrix}, y ycsdp, # py::Ptr{Cdouble} Z, # pZ::Ptr{blockmatrix} CSDP_INT(printlevel), # printlevel::CSDP_INT - params) # parameters::paramstruc + params, + ) # parameters::paramstruc # I can even assert that they won't change @assert ycsdp[] == fptr(y) return status, pobj, dobj end -parametrized_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, params::Dict{Symbol}) = parametrized_sdp(C, b, As, 0.0, X, y, Z, options(params)...) -parametrized_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, printlevel, params) = parametrized_sdp(C, b, As, 0.0, X, y, Z, printlevel, params) -parametrized_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, co::Cdouble, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, params::Dict{Symbol}) = parametrized_sdp(C, b, As, co, X, y, Z, options(params)...) -function parametrized_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{ConstraintMatrix}, co::Cdouble, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix, printlevel, params) +function parametrized_sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + params::Dict{Symbol}, +) + return parametrized_sdp(C, b, As, 0.0, X, y, Z, options(params)...) +end +function parametrized_sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + printlevel, + params, +) + return parametrized_sdp(C, b, As, 0.0, X, y, Z, printlevel, params) +end +function parametrized_sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + co::Cdouble, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + params::Dict{Symbol}, +) + return parametrized_sdp(C, b, As, co, X, y, Z, options(params)...) +end +function parametrized_sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{ConstraintMatrix}, + co::Cdouble, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, + printlevel, + params, +) # I pass pointers pX, py and pZ to X, y and Z but only *pX, *py and *pZ are # used in the code so no need to worry, they won't change :) Xcsdp = X.csdp ycsdp = Ref{Ptr{Cdouble}}(fptr(y)) Zcsdp = Z.csdp - Ascsdp = map(A->A.csdp, As) + Ascsdp = map(A -> A.csdp, As) status, pobj, dobj = parametrized_sdp( CSDP_INT(size(C, 1)), # n::CSDP_INT @@ -164,7 +325,8 @@ function parametrized_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{Constra ycsdp, # py::Ptr{Cdouble} ptr(Zcsdp), # pZ::Ptr{blockmatrix} CSDP_INT(printlevel), # printlevel::CSDP_INT - params) # parameters::paramstruc + params, + ) # parameters::paramstruc # I can even assert that they won't change @assert Xcsdp == X.csdp @assert ycsdp[] == fptr(y) @@ -172,23 +334,42 @@ function parametrized_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{Constra return status, pobj, dobj end -easy_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{constraintmatrix}, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix) = easy_sdp(C, b, As, 0.0, X, y, Z) -function easy_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{constraintmatrix}, co::Cdouble, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix) +function easy_sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{constraintmatrix}, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, +) + return easy_sdp(C, b, As, 0.0, X, y, Z) +end +function easy_sdp( + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{constraintmatrix}, + co::Cdouble, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, +) # I pass pointers pX, py and pZ to X, y and Z but only *pX, *py and *pZ are # used in the code so no need to worry, they won't change :) Xcsdp = X.csdp ycsdp = Ref{Ptr{Cdouble}}(fptr(y)) Zcsdp = Z.csdp - status, pobj, dobj = easy_sdp(CSDP_INT(size(C, 1)), # n::CSDP_INT - CSDP_INT(length(As)), # k::CSDP_INT - C.csdp, # C::blockmatrix - fptr(b), # a::Ptr{Cdouble} - fptr(As), # constraints::Ptr{constraintmatrix} - co, # constant_offset::Cdouble - ptr(Xcsdp), # pX::Ptr{blockmatrix} - ycsdp, # py::Ptr{Cdouble} - ptr(Zcsdp)) # pZ::Ptr{blockmatrix} + status, pobj, dobj = easy_sdp( + CSDP_INT(size(C, 1)), # n::CSDP_INT + CSDP_INT(length(As)), # k::CSDP_INT + C.csdp, # C::blockmatrix + fptr(b), # a::Ptr{Cdouble} + fptr(As), # constraints::Ptr{constraintmatrix} + co, # constant_offset::Cdouble + ptr(Xcsdp), # pX::Ptr{blockmatrix} + ycsdp, # py::Ptr{Cdouble} + ptr(Zcsdp), + ) # pZ::Ptr{blockmatrix} # I can even assert that they won't change @assert Xcsdp == X.csdp @assert ycsdp[] == fptr(y) @@ -196,10 +377,34 @@ function easy_sdp(C::BlockMatrix, b::Vector{Cdouble}, As::Vector{constraintmatri return status, pobj, dobj end -function write_prob(fname::String, C::BlockMatrix, b::Vector{Cdouble}, As::Vector{constraintmatrix}) - write_prob(fname, CSDP_INT(size(C, 1)), CSDP_INT(length(As)), C.csdp, fptr(b), fptr(As)) +function write_prob( + fname::String, + C::BlockMatrix, + b::Vector{Cdouble}, + As::Vector{constraintmatrix}, +) + return write_prob( + fname, + CSDP_INT(size(C, 1)), + CSDP_INT(length(As)), + C.csdp, + fptr(b), + fptr(As), + ) end -function write_sol(fname::String, X::BlockMatrix, y::Vector{Cdouble}, Z::BlockMatrix) - write_sol(fname, CSDP_INT(size(X, 1)), CSDP_INT(length(y)), X.csdp, fptr(y), Z.csdp) +function write_sol( + fname::String, + X::BlockMatrix, + y::Vector{Cdouble}, + Z::BlockMatrix, +) + return write_sol( + fname, + CSDP_INT(size(X, 1)), + CSDP_INT(length(y)), + X.csdp, + fptr(y), + Z.csdp, + ) end diff --git a/src/options.jl b/src/options.jl index a20d454..6a4754a 100644 --- a/src/options.jl +++ b/src/options.jl @@ -1,4 +1,22 @@ -const ALLOWED_OPTIONS = [:printlevel, :axtol, :atytol, :objtol, :pinftol, :dinftol, :maxiter, :minstepfrac, :maxstepfrac, :minstepp, :minstepd, :usexzgap, :tweakgap, :affine, :perturbobj, :fastmode, :write_prob] +const ALLOWED_OPTIONS = [ + :printlevel, + :axtol, + :atytol, + :objtol, + :pinftol, + :dinftol, + :maxiter, + :minstepfrac, + :maxstepfrac, + :minstepp, + :minstepd, + :usexzgap, + :tweakgap, + :affine, + :perturbobj, + :fastmode, + :write_prob, +] # The :write_prob option is for the following function function write_prob(m) @@ -11,7 +29,7 @@ function write_prob(m) k += 1 end @info "Writing problem to $(pwd())/$(wrtf)" - write_prob(wrtf, m.C, m.b, map(A->A.csdp, m.As)) + write_prob(wrtf, m.C, m.b, map(A -> A.csdp, m.As)) end end end diff --git a/test/MOI_wrapper.jl b/test/MOI_wrapper.jl index e5c3166..8e492f5 100644 --- a/test/MOI_wrapper.jl +++ b/test/MOI_wrapper.jl @@ -7,38 +7,51 @@ const MOIU = MOI.Utilities const MOIB = MOI.Bridges import CSDP -const optimizer_constructor = MOI.OptimizerWithAttributes(CSDP.Optimizer, MOI.Silent() => true) +const optimizer_constructor = + MOI.OptimizerWithAttributes(CSDP.Optimizer, MOI.Silent() => true) const optimizer = MOI.instantiate(optimizer_constructor) @testset "SolverName" begin @test MOI.get(optimizer, MOI.SolverName()) == "CSDP" end -const bridged = MOI.instantiate(optimizer_constructor, with_bridge_type=Float64) +const bridged = + MOI.instantiate(optimizer_constructor, with_bridge_type = Float64) const config = MOIT.Config(atol = 1e-4, rtol = 1e-4) @testset "Options" begin param = MOI.RawOptimizerAttribute("bad_option") err = MOI.UnsupportedAttribute(param) - @test_throws err MOI.set(optimizer, MOI.RawOptimizerAttribute("bad_option"), 0) + @test_throws err MOI.set( + optimizer, + MOI.RawOptimizerAttribute("bad_option"), + 0, + ) end @testset "Unit" begin - MOIT.unittest(bridged, config, [ - # `NUMERICAL_ERROR` on Mac: https://travis-ci.org/JuliaOpt/CSDP.jl/jobs/601302777#L217-L219 - "solve_unbounded_model", - # `NumberOfThreads` not supported. - "number_threads", - # `TimeLimitSec` not supported. - "time_limit_sec", - # Quadratic functions are not supported - "solve_qcp_edge_cases", "solve_qp_edge_cases", - # Integer and ZeroOne sets are not supported - "solve_integer_edge_cases", "solve_objbound_edge_cases", - "solve_start_soc", # RSOCtoPSDBridge seems to be incorrect for dimension-2 RSOC cone. - "solve_zero_one_with_bounds_1", - "solve_zero_one_with_bounds_2", - "solve_zero_one_with_bounds_3"]) + MOIT.unittest( + bridged, + config, + [ + # `NUMERICAL_ERROR` on Mac: https://travis-ci.org/JuliaOpt/CSDP.jl/jobs/601302777#L217-L219 + "solve_unbounded_model", + # `NumberOfThreads` not supported. + "number_threads", + # `TimeLimitSec` not supported. + "time_limit_sec", + # Quadratic functions are not supported + "solve_qcp_edge_cases", + "solve_qp_edge_cases", + # Integer and ZeroOne sets are not supported + "solve_integer_edge_cases", + "solve_objbound_edge_cases", + "solve_start_soc", # RSOCtoPSDBridge seems to be incorrect for dimension-2 RSOC cone. + "solve_zero_one_with_bounds_1", + "solve_zero_one_with_bounds_2", + "solve_zero_one_with_bounds_3", + ], + ) end @testset "Continuous Linear" begin # See explanation in `MOI/test/Bridges/lazy_bridge_optimizer.jl`. @@ -49,19 +62,29 @@ end # Finds `MOI.ALMOST_OPTIMAL` instead of `MOI.OPTIMAL` "linear10b", # Empty constraint - "linear15" + "linear15", ]) end @testset "Continuous Conic" begin - MOIT.contconictest(bridged, config, [ - # Finds `MOI.OPTIMAL` instead of `MOI.INFEASIBLE`. - "soc3", - # Empty constraint `c4` - "psdt2", - # See https://github.com/coin-or/Csdp/issues/11 - "rotatedsoc1v", - # Missing bridges - "rootdets", - # Does not support power and exponential cone - "pow", "dualpow", "logdet", "exp", "dualexp", "relentr"]) + MOIT.contconictest( + bridged, + config, + [ + # Finds `MOI.OPTIMAL` instead of `MOI.INFEASIBLE`. + "soc3", + # Empty constraint `c4` + "psdt2", + # See https://github.com/coin-or/Csdp/issues/11 + "rotatedsoc1v", + # Missing bridges + "rootdets", + # Does not support power and exponential cone + "pow", + "dualpow", + "logdet", + "exp", + "dualexp", + "relentr", + ], + ) end diff --git a/test/bug.jl b/test/bug.jl index 1dac654..f4b06e5 100644 --- a/test/bug.jl +++ b/test/bug.jl @@ -5,7 +5,7 @@ using SemidefiniteOptInterface const SOI = SemidefiniteOptInterface m = CSDP.CSDPSolverInstance() SOI.initinstance!(m, [-2], 0) -SOI.setobjectivecoefficient!(m, -1., 1, 1, 1) -SOI.setobjectivecoefficient!(m, -1., 1, 2, 2) +SOI.setobjectivecoefficient!(m, -1.0, 1, 1, 1) +SOI.setobjectivecoefficient!(m, -1.0, 1, 2, 2) MOI.optimize!(m) @show m.status diff --git a/test/check_blas.jl b/test/check_blas.jl index 27f69f5..de30eb1 100644 --- a/test/check_blas.jl +++ b/test/check_blas.jl @@ -12,14 +12,39 @@ const libblas = "/usr/lib/libblas.so.3" const openblas = "/usr/lib/libopenblas.so.0" A = [1.0 0.0; 0.0 -1.0] -lda = max(1,stride(A,2)) +lda = max(1, stride(A, 2)) infot = Ref{LinearAlgebra.BlasInt}() uplo = 'U' -ccall((:dpotrf_64_, LinearAlgebra.BLAS.libblas), Void, - (Ptr{UInt8}, Ptr{LinearAlgebra.BlasInt}, Ptr{eltype(A)}, Ptr{LinearAlgebra.BlasInt}, Ptr{LinearAlgebra.BlasInt}), - &uplo, &size(A,1), A, &lda, info) - -ccall((:dpotrf_, openblas), Void, - (Ptr{UInt8}, Ptr{LinearAlgebra.BlasInt}, Ptr{eltype(A)}, Ptr{LinearAlgebra.BlasInt}, Ptr{LinearAlgebra.BlasInt}), - &uplo, &size(A,1), A, &lda, infot) +ccall( + (:dpotrf_64_, LinearAlgebra.BLAS.libblas), + Void, + ( + Ptr{UInt8}, + Ptr{LinearAlgebra.BlasInt}, + Ptr{eltype(A)}, + Ptr{LinearAlgebra.BlasInt}, + Ptr{LinearAlgebra.BlasInt}, + ), + &uplo, + &size(A, 1), + A, + &lda, + info, +) +ccall( + (:dpotrf_, openblas), + Void, + ( + Ptr{UInt8}, + Ptr{LinearAlgebra.BlasInt}, + Ptr{eltype(A)}, + Ptr{LinearAlgebra.BlasInt}, + Ptr{LinearAlgebra.BlasInt}, + ), + &uplo, + &size(A, 1), + A, + &lda, + infot, +) diff --git a/test/jl_ref.jl b/test/jl_ref.jl index fc4accf..1eb41d9 100644 --- a/test/jl_ref.jl +++ b/test/jl_ref.jl @@ -18,7 +18,6 @@ mutable struct S e::Ptr{Cdouble} end - """Use Ref instead of Ptr""" mutable struct R c::UInt32 @@ -27,20 +26,21 @@ mutable struct R end # Say hello, print sizeof(int) -println(ccall((:hello,libn), Cdouble, ())) +println(ccall((:hello, libn), Cdouble, ())) vec = Cdouble[1.0, 2.0] println("&vec = $(pointer(vec))") # Call with S --> should work s = S(OP1, length(vec), pointer(vec)) -ccall((:sum,libn), Cdouble, (S,), s) +ccall((:sum, libn), Cdouble, (S,), s) # Call with R --> does not work r = R(OP2, length(vec), Ref(vec)) -ccall((:sum,libn), Cdouble, (R,), r) +ccall((:sum, libn), Cdouble, (R,), r) # Now call with S, instead of R -Base.cconvert(::Type{R}, r::R) = - S(r.c, r.n, Base.unsafe_convert(Ptr{Cdouble}, r.e)) -ccall((:sum,libn), Cdouble, (S,), r) +function Base.cconvert(::Type{R}, r::R) + return S(r.c, r.n, Base.unsafe_convert(Ptr{Cdouble}, r.e)) +end +ccall((:sum, libn), Cdouble, (S,), r) diff --git a/test/runtests.jl b/test/runtests.jl index a91bd60..566f4cd 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -7,21 +7,27 @@ using LinearAlgebra # For Diagonal vec = Cdouble[1.0, 2.0, 0.0, -1.0] l = length(vec) inc = 1 - n1 = ccall((BLAS.@blasfunc(dasum_), LinearAlgebra.BLAS.libblas), - Cdouble, - (Ref{LinearAlgebra.BlasInt}, Ptr{Cdouble}, - Ref{LinearAlgebra.BlasInt}), - l, vec, inc) + n1 = ccall( + (BLAS.@blasfunc(dasum_), LinearAlgebra.BLAS.libblas), + Cdouble, + (Ref{LinearAlgebra.BlasInt}, Ptr{Cdouble}, Ref{LinearAlgebra.BlasInt}), + l, + vec, + inc, + ) @test abs(n1 - 4) < 1e-15 end @testset "Call libcsdp.norm1" begin vec = Cdouble[1.0, 2.0, 0.0, -1.0] try - n1 = ccall((:norm1, CSDP.libcsdp), - Cdouble, - (Cint, Ptr{Cdouble}), - length(vec), vec) + n1 = ccall( + (:norm1, CSDP.libcsdp), + Cdouble, + (Cint, Ptr{Cdouble}), + length(vec), + vec, + ) @test abs(n1 - 4) < 1e-15 catch println("n1 = $n1, vec=$vec, length(vec)=$(length(vec))") @@ -36,23 +42,29 @@ end @test size(X) == (7, 7) @test length(y) == 2 @test size(Z) == (7, 7) - X✓ = [3 3 0 0 0 0 0; - 3 3 0 0 0 0 0; - 0 0 16 0 0 0 0; - 0 0 0 0 0 0 0; - 0 0 0 0 0 0 0; - 0 0 0 0 0 0 0; - 0 0 0 0 0 0 0] / 24 + X✓ = + [ + 3 3 0 0 0 0 0 + 3 3 0 0 0 0 0 + 0 0 16 0 0 0 0 + 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 + ] / 24 @test norm(convert(AbstractArray, X) - X✓) < 1e-6 y✓ = [3, 4] / 4 @test norm(convert(AbstractArray, y) - y✓) < 1e-6 - Z✓ = [1 -1 0 0 0 0 0; - -1 1 0 0 0 0 0; - 0 0 0 0 0 0 0; - 0 0 0 8 0 0 0; - 0 0 0 0 8 0 0; - 0 0 0 0 0 3 0; - 0 0 0 0 0 0 4] / 4 + Z✓ = + [ + 1 -1 0 0 0 0 0 + -1 1 0 0 0 0 0 + 0 0 0 0 0 0 0 + 0 0 0 8 0 0 0 + 0 0 0 0 8 0 0 + 0 0 0 0 0 3 0 + 0 0 0 0 0 0 4 + ] / 4 @test norm(convert(AbstractArray, Z) - Z✓) < 1e-6 end end diff --git a/test/triu.jl b/test/triu.jl index ff7aac0..8fc4e01 100644 --- a/test/triu.jl +++ b/test/triu.jl @@ -1,12 +1,13 @@ using CSDP if !isdefined(:J) || !isa(J, AbstractArray) - J = [1 3 - 5 6] + J = [ + 1 3 + 5 6 + ] J = map(Float64, J) end - br = CSDP.brec(reshape(J, length(J)), CSDP.MATRIX, 4) ccall((:printb, CSDP.csdp), Void, (CSDP.blockrec,), br) bra = [br, br] diff --git a/test/writesol.jl b/test/writesol.jl index 68d1c81..5139d63 100644 --- a/test/writesol.jl +++ b/test/writesol.jl @@ -1,22 +1,30 @@ using CSDP X_sol = Blockmatrix( - [2 1 - 1 2], - [3 0 1 - 0 2 0 - 1 0 3], - Diagonal([0, - 0])) + [ + 2 1 + 1 2 + ], + [ + 3 0 1 + 0 2 0 + 1 0 3 + ], + Diagonal([0, 0]), +) Z_sol = Blockmatrix( - [4 1 - 1 2], - [3 0 1 - 0 2 0 - 1 0 3], - Diagonal([0, - 0])) + [ + 4 1 + 1 2 + ], + [ + 3 0 1 + 0 2 0 + 1 0 3 + ], + Diagonal([0, 0]), +) y_origin = [5.5, 6.2] y = Cvector{Cdouble}(CSDP.fptr(y_origin)) @@ -29,12 +37,6 @@ println("********** Alright **********") ys = y.e Zs = CSDP.blockmatrix(Z_sol) -@printf "********** Alright %s\n" @__FILE__ +@printf "********** Alright %s\n" @__FILE__ - -CSDP.write_sol("prob.dat-s", - n, - k, - X_sol, - y, - Z_sol) +CSDP.write_sol("prob.dat-s", n, k, X_sol, y, Z_sol)