From 3215f27a11e679e9adcb891e8e37a2ff8004b758 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Wed, 9 Apr 2025 08:12:53 -0500 Subject: [PATCH 1/2] Create wrappers for other languages --- language_wrappers/Makefile | 51 ++++++ language_wrappers/Manifest.toml | 277 ++++++++++++++++++++++++++++++++ language_wrappers/Project.toml | 2 + language_wrappers/lib.jl | 18 +++ 4 files changed, 348 insertions(+) create mode 100644 language_wrappers/Makefile create mode 100644 language_wrappers/Manifest.toml create mode 100644 language_wrappers/Project.toml create mode 100644 language_wrappers/lib.jl diff --git a/language_wrappers/Makefile b/language_wrappers/Makefile new file mode 100644 index 0000000..465f63d --- /dev/null +++ b/language_wrappers/Makefile @@ -0,0 +1,51 @@ +# This Makefile template requires the following variables to be set +# in the environment or on the command-line: +# JULIA: path to julia[.exe] executable +# BIN: binary build directory + +ifndef JULIA + $(error "Please pass JULIA=[path of target julia binary], or set as environment variable!") +endif +ifndef BIN + $(error "Please pass BIN=[path of build directory], or set as environment variable!") +endif + +#============================================================================= +# location of test source +SRCDIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) +PKGDIR := $(dir $(SRCDIR)) +JULIAHOME := $(abspath $(JULIA)/../..) +BUILDSCRIPT := $(BIN)/../share/julia/juliac-buildscript.jl +# include $(JULIAHOME)/Make.inc + +# FIXME +SHLIB_EXT := so + +# get the executable suffix, if any +EXE := $(suffix $(abspath $(JULIA))) + +# get compiler and linker flags. (see: `contrib/julia-config.jl`) +JULIA_CONFIG := $(JULIA) -e 'include(joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "julia-config.jl"))' -- +CPPFLAGS_ADD := +CFLAGS_ADD = $(shell $(JULIA_CONFIG) --cflags) +LDFLAGS_ADD = -lm $(shell $(JULIA_CONFIG) --ldflags --ldlibs) -ljulia-internal + +#============================================================================= + +release: NMFMerge-jl.$(SHLIB_EXT) + +NMFMerge-jl.$(SHLIB_EXT): $(PKGDIR)/src/NMFMerge.jl $(BUILDSCRIPT) + $(JULIA) -t 1 -J $(BIN)/../lib/julia/sys.$(SHLIB_EXT) --project --startup-file=no --history-file=no --output-incremental=no --strip-ir --strip-metadata --experimental --trim $(BUILDSCRIPT) $(SRCDIR)/lib.jl --output-lib NMFMerge-jl.so + +check: hello$(EXE) basic_jll$(EXE) # FIXME + $(JULIA) --depwarn=error $(SRCDIR)/../runtests.jl $(SRCDIR)/trimming + +clean: # FIXME + -rm -f hello$(EXE) basic_jll$(EXE) init.o hello.o basic_jll.o + +.PHONY: release clean check + +# Makefile debugging trick: +# call print-VARIABLE to see the runtime value of any variable +print-%: + @echo '$*=$($*)' diff --git a/language_wrappers/Manifest.toml b/language_wrappers/Manifest.toml new file mode 100644 index 0000000..522cb0d --- /dev/null +++ b/language_wrappers/Manifest.toml @@ -0,0 +1,277 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.13.0-DEV" +manifest_format = "2.0" +project_hash = "02e7b54fdc8b2775dc61d1c22f0018e675cc17a2" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + + [deps.Adapt.weakdeps] + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.3.0+1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "e7b7e6f178525d17c720ab9c081e4ef04429f860" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.4" + +[[deps.GsvdInitialization]] +deps = ["LinearAlgebra", "NMF", "NonNegLeastSquares", "TSVD"] +git-tree-sha1 = "81fcc977bf68da9024ef413e2588af2e8f3a8d8b" +uuid = "2ac24108-be9c-42b8-8d78-6a4f62a87e7d" +version = "1.0.0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.JuliaSyntaxHighlighting]] +deps = ["StyledStrings"] +uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" +version = "1.12.0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.12.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.Markdown]] +deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.NMF]] +deps = ["LinearAlgebra", "NonNegLeastSquares", "PrecompileTools", "Printf", "Random", "RandomizedLinAlg", "Statistics", "StatsBase"] +git-tree-sha1 = "d098a41cbc60447b430c32e1ac271193652205ee" +uuid = "6ef6ca0d-6ad7-5ff6-b225-e928bfa0a386" +version = "1.0.3" + +[[deps.NMFMerge]] +deps = ["DataStructures", "GsvdInitialization", "LinearAlgebra", "NMF", "TSVD"] +path = ".." +uuid = "9cc52eda-dfaf-4e21-aae3-9f26bed153a3" +version = "1.0.1" + +[[deps.NonNegLeastSquares]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "cdc11138e74a0dd0b82e7d64eb1350fdf049d3b1" +uuid = "b7351bd1-99d9-5c5d-8786-f205a815c4d7" +version = "0.4.1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.29+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.0" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "3fcd5c8c872f7314a7bb5c1328d0349283d5b82d" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.3.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RandomizedLinAlg]] +deps = ["LinearAlgebra", "Random", "Test"] +git-tree-sha1 = "de93780c85c207586369522af7525aa3011b09c3" +uuid = "0448d7d9-159c-5637-8537-fd72090fea46" +version = "0.1.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.12.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.4" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.10.1+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TSVD]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "c39caef6bae501e5607a6caf68dd9ac6e8addbcb" +uuid = "9449cd9e-2762-5aa3-a617-5413e99d722e" +version = "0.4.4" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.12.0+0" diff --git a/language_wrappers/Project.toml b/language_wrappers/Project.toml new file mode 100644 index 0000000..e138fc5 --- /dev/null +++ b/language_wrappers/Project.toml @@ -0,0 +1,2 @@ +[deps] +NMFMerge = "9cc52eda-dfaf-4e21-aae3-9f26bed153a3" diff --git a/language_wrappers/lib.jl b/language_wrappers/lib.jl new file mode 100644 index 0000000..2eec229 --- /dev/null +++ b/language_wrappers/lib.jl @@ -0,0 +1,18 @@ +module NMFMergeLib + +using NMFMerge + +struct ReturnValue + niters::Int32 + converged::Bool + objvalue::Float64 +end + +Base.@ccallable function nmfmerge_inplace(Wout::Matrix{Float64}, Hout::Matrix{Float64}, X::Matrix{Float64}, ncomponents::Int32, tol::Float64, maxiter::Int32)::ReturnValue + result = nmfmerge(X, ncomponents; tol_final=tol, maxiter) + Wout .= result.W + Hout .= result.H + return ReturnValue(result.niters, result.converged, result.objvalue) +end + +end From 0649fdc99b9290de846d3aaf1403166f4dc59462 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Fri, 1 Aug 2025 04:16:24 -0500 Subject: [PATCH 2/2] Get Makefile working This leverages julia#59108 to generate a log file with the information needed to create a language binding. As that PR is not yet merged, this may be subject to change. This appears to get things working up through trimming, at which point there are many verifier errors that need to be resolved. --- .gitignore | 2 + .vscode/settings.json | 1 - language_wrappers/Makefile | 24 +-- language_wrappers/Manifest.toml | 277 -------------------------------- language_wrappers/Project.toml | 3 + language_wrappers/lib.jl | 17 +- 6 files changed, 33 insertions(+), 291 deletions(-) delete mode 100644 .vscode/settings.json delete mode 100644 language_wrappers/Manifest.toml diff --git a/.gitignore b/.gitignore index 95731a5..be57604 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ /Manifest.toml /docs/Manifest.toml /docs/build/ +/language_wrappers/Manifest.toml +/language_wrappers/bindinginfo_libNMFMerge.log diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/language_wrappers/Makefile b/language_wrappers/Makefile index 465f63d..6dc2625 100644 --- a/language_wrappers/Makefile +++ b/language_wrappers/Makefile @@ -13,9 +13,9 @@ endif #============================================================================= # location of test source SRCDIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) -PKGDIR := $(dir $(SRCDIR)) +PKGDIR := $(abspath $(dir $(SRCDIR))) JULIAHOME := $(abspath $(JULIA)/../..) -BUILDSCRIPT := $(BIN)/../share/julia/juliac-buildscript.jl +# BUILDSCRIPT := $(BIN)/../share/julia/juliac-buildscript.jl # include $(JULIAHOME)/Make.inc # FIXME @@ -26,24 +26,28 @@ EXE := $(suffix $(abspath $(JULIA))) # get compiler and linker flags. (see: `contrib/julia-config.jl`) JULIA_CONFIG := $(JULIA) -e 'include(joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "julia-config.jl"))' -- +JULIA_LIBDIR := $(shell $(JULIA) -e 'println(joinpath(Sys.BINDIR, "..", "lib"))' --) CPPFLAGS_ADD := CFLAGS_ADD = $(shell $(JULIA_CONFIG) --cflags) LDFLAGS_ADD = -lm $(shell $(JULIA_CONFIG) --ldflags --ldlibs) -ljulia-internal +# get the JuliaC build script +JULIAC_BUILDSCRIPT := $(shell $(JULIA) -e 'print(joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "juliac", "juliac-buildscript.jl"))') + #============================================================================= -release: NMFMerge-jl.$(SHLIB_EXT) +release: libNMFMerge-o.a -NMFMerge-jl.$(SHLIB_EXT): $(PKGDIR)/src/NMFMerge.jl $(BUILDSCRIPT) - $(JULIA) -t 1 -J $(BIN)/../lib/julia/sys.$(SHLIB_EXT) --project --startup-file=no --history-file=no --output-incremental=no --strip-ir --strip-metadata --experimental --trim $(BUILDSCRIPT) $(SRCDIR)/lib.jl --output-lib NMFMerge-jl.so +$(BIN)/libNMFMerge-o.a: $(PKGDIR)/language_wrappers/lib.jl $(JULIAC_BUILDSCRIPT) + $(JULIA) -t 1 -J $(JULIA_LIBDIR)/julia/sys.$(SHLIB_EXT) --startup-file=no --history-file=no --project=$(PKGDIR)/language_wrappers/ --output-o $@ --output-incremental=no --strip-ir --strip-metadata --experimental --trim $(JULIAC_BUILDSCRIPT) $< --output-lib true $(BIN)/bindinginfo_libNMFMerge.log -check: hello$(EXE) basic_jll$(EXE) # FIXME - $(JULIA) --depwarn=error $(SRCDIR)/../runtests.jl $(SRCDIR)/trimming +# check: $(BIN)/libNMFMerge$(EXE) +# $(JULIA) --depwarn=error $(SRCDIR)/trimming.jl $< -clean: # FIXME - -rm -f hello$(EXE) basic_jll$(EXE) init.o hello.o basic_jll.o +clean: + -rm -f $(BIN)/libNMFMerge-o.a $(BIN)/bindinginfo_libNMFMerge.log -.PHONY: release clean check +.PHONY: release clean # Makefile debugging trick: # call print-VARIABLE to see the runtime value of any variable diff --git a/language_wrappers/Manifest.toml b/language_wrappers/Manifest.toml deleted file mode 100644 index 522cb0d..0000000 --- a/language_wrappers/Manifest.toml +++ /dev/null @@ -1,277 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.13.0-DEV" -manifest_format = "2.0" -project_hash = "02e7b54fdc8b2775dc61d1c22f0018e675cc17a2" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.3.0" - - [deps.Adapt.extensions] - AdaptSparseArraysExt = "SparseArrays" - AdaptStaticArraysExt = "StaticArrays" - - [deps.Adapt.weakdeps] - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.AliasTables]] -deps = ["PtrArrays", "Random"] -git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" -uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" -version = "1.1.3" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.16.0" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.0+1" - -[[deps.DataAPI]] -git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.16.0" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.22" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" - -[[deps.DocStringExtensions]] -git-tree-sha1 = "e7b7e6f178525d17c720ab9c081e4ef04429f860" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.4" - -[[deps.GsvdInitialization]] -deps = ["LinearAlgebra", "NMF", "NonNegLeastSquares", "TSVD"] -git-tree-sha1 = "81fcc977bf68da9024ef413e2588af2e8f3a8d8b" -uuid = "2ac24108-be9c-42b8-8d78-6a4f62a87e7d" -version = "1.0.0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.4" - -[[deps.JuliaSyntaxHighlighting]] -deps = ["StyledStrings"] -uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" -version = "1.12.0" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.29" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" - -[[deps.Markdown]] -deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.NMF]] -deps = ["LinearAlgebra", "NonNegLeastSquares", "PrecompileTools", "Printf", "Random", "RandomizedLinAlg", "Statistics", "StatsBase"] -git-tree-sha1 = "d098a41cbc60447b430c32e1ac271193652205ee" -uuid = "6ef6ca0d-6ad7-5ff6-b225-e928bfa0a386" -version = "1.0.3" - -[[deps.NMFMerge]] -deps = ["DataStructures", "GsvdInitialization", "LinearAlgebra", "NMF", "TSVD"] -path = ".." -uuid = "9cc52eda-dfaf-4e21-aae3-9f26bed153a3" -version = "1.0.1" - -[[deps.NonNegLeastSquares]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "cdc11138e74a0dd0b82e7d64eb1350fdf049d3b1" -uuid = "b7351bd1-99d9-5c5d-8786-f205a815c4d7" -version = "0.4.1" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.0" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "3fcd5c8c872f7314a7bb5c1328d0349283d5b82d" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.3.1" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" - -[[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" -uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" - -[[deps.RandomizedLinAlg]] -deps = ["LinearAlgebra", "Random", "Test"] -git-tree-sha1 = "de93780c85c207586369522af7525aa3011b09c3" -uuid = "0448d7d9-159c-5637-8537-fd72090fea46" -version = "0.1.0" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -version = "1.11.0" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.12.0" - -[[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" -weakdeps = ["SparseArrays"] - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.0" - -[[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.4" - -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.10.1+0" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.TSVD]] -deps = ["Adapt", "LinearAlgebra"] -git-tree-sha1 = "c39caef6bae501e5607a6caf68dd9ac6e8addbcb" -uuid = "9449cd9e-2762-5aa3-a617-5413e99d722e" -version = "0.4.4" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -version = "1.11.0" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.12.0+0" diff --git a/language_wrappers/Project.toml b/language_wrappers/Project.toml index e138fc5..7ed0fed 100644 --- a/language_wrappers/Project.toml +++ b/language_wrappers/Project.toml @@ -1,2 +1,5 @@ [deps] NMFMerge = "9cc52eda-dfaf-4e21-aae3-9f26bed153a3" + +[sources] +NMFMerge = {path = ".."} diff --git a/language_wrappers/lib.jl b/language_wrappers/lib.jl index 2eec229..29b886a 100644 --- a/language_wrappers/lib.jl +++ b/language_wrappers/lib.jl @@ -8,10 +8,21 @@ struct ReturnValue objvalue::Float64 end -Base.@ccallable function nmfmerge_inplace(Wout::Matrix{Float64}, Hout::Matrix{Float64}, X::Matrix{Float64}, ncomponents::Int32, tol::Float64, maxiter::Int32)::ReturnValue +struct CMatrix{T} <: AbstractMatrix{T} + data::Ptr{T} + rows::Int32 + cols::Int32 +end + +Base.@ccallable function nmfmerge_inplace(Wout::CMatrix{Float64}, Hout::CMatrix{Float64}, X::CMatrix{Float64}, ncomponents::Int32, tol::Float64, maxiter::Int32)::ReturnValue + Wout.rows == X.rows || throw(ArgumentError("Wout and X must have the same number of rows")) + Hout.cols == X.cols || throw(ArgumentError("Hout and X must have the same number of columns")) + W, H, X = unsafe_wrap(Array, Wout.data, (Wout.rows, Wout.cols)), + unsafe_wrap(Array, Hout.data, (Hout.rows, Hout.cols)), + unsafe_wrap(Array, X.data, (X.rows, X.cols)) result = nmfmerge(X, ncomponents; tol_final=tol, maxiter) - Wout .= result.W - Hout .= result.H + W .= result.W + H .= result.H return ReturnValue(result.niters, result.converged, result.objvalue) end