diff --git a/.github/workflows/TagBot.yml b/.github/workflows/TagBot.yml index 4635672..d724361 100644 --- a/.github/workflows/TagBot.yml +++ b/.github/workflows/TagBot.yml @@ -15,3 +15,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: JuliaRegistries/TagBot@304fc93e4623081443fee5b6317ac73b37923574 # v1.25.8 + with: + token: ${{ secrets.GITHUB_TOKEN }} + # For commits that modify workflow files: SSH key enables tagging, but + # releases require manual creation. For full automation of such commits, + # use a PAT with `workflow` scope instead of GITHUB_TOKEN. + # See: https://github.com/JuliaRegistries/TagBot#commits-that-modify-workflow-files + ssh: ${{ secrets.DOCUMENTER_KEY }} + # ssh: ${{ secrets.NAME_OF_MY_SSH_PRIVATE_KEY_SECRET }} + # changelog_format: github # 'custom' (default), 'github', or 'conventional' \ No newline at end of file diff --git a/Project.toml b/Project.toml index a4f885c..c273df9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ITensorCPD" uuid = "8ca0d870-8743-11ef-3aad-a3ebf6911431" authors = ["Karl Pierce "] -version = "0.0.81" +version = "0.0.82" [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" @@ -18,15 +18,18 @@ TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" [compat] -Adapt = ">=4" -GPUArraysCore = ">=0.2" -ITensors = ">=0.9" +Adapt = "4" +GPUArraysCore = "0.2" +ITensors = "0.9" ITensorNetworks = "<0.19" LinearAlgebra = "1.10.0" -OhMyThreads = ">=0.8" +Metal = "1" +OhMyThreads = "0.8" +Random = "1.10" +SparseArrays = "1.10" StatsBase = "0.34.6" -StridedViews = ">=0.5" -TensorOperations = ">=5" +StridedViews = "0.5" +TensorOperations = "5" TimerOutputs = "0.5" julia = ">=1.10" diff --git a/src/algorithms/algorithms.jl b/src/algorithms/algorithms.jl index 6152e3a..781395b 100644 --- a/src/algorithms/algorithms.jl +++ b/src/algorithms/algorithms.jl @@ -1 +1 @@ -include("ALS/als_algs.jl") \ No newline at end of file +include("als_algorithms/als_algs.jl") \ No newline at end of file diff --git a/src/algorithms/als/randomized/krp_lev_score_sampled.jl b/src/algorithms/als/randomized/krp_lev_score_sampled.jl deleted file mode 100644 index f1ce278..0000000 --- a/src/algorithms/als/randomized/krp_lev_score_sampled.jl +++ /dev/null @@ -1,109 +0,0 @@ -using ITensors: Index -using ITensors.NDTensors: data -using ITensors.NDTensors.Expose: expose - - -### With this solver we are going to compute sampling projectors for LS decomposition -### based on the leverage score of the factor matrices. Then we are going to solve a -### sampled least squares problem -struct LevScoreSampled <: ProjectionAlgorithm - NSamples::Tuple -end - - # What happens when sampling is 0? - LevScoreSampled() = LevScoreSampled((1,)) - LevScoreSampled(n::Int) = LevScoreSampled((n,)) - - nsamples(alg::LevScoreSampled) = alg.NSamples - - ## We are going to construct a matrix of sampled indices of the tensor - function project_krp(::LevScoreSampled, als, factors, cp, rank::Index, fact::Int) - nsamps = nsamples(als.mttkrp_alg) - nsamps = length(nsamps) == 1 ? nsamps[1] : nsamps[fact] - - resample = als.additional_items[:stop_resample] - resample = resample < 0 || resample > iter(als) - if resample - sampled_cols = sample_factor_matrices(nsamps, fact, als.additional_items[:factor_weights]) - ## Write new samples to pivot tensor - - array(als.additional_items[:projects_tensors][fact]) .= sampled_cols - else - sampled_cols = array(als.additional_items[:projects_tensors][fact]) - end - - return pivot_hadamard(factors, rank, sampled_cols, inds(als.additional_items[:projects_tensors][fact])[1]) - end - - function matricize_tensor(::LevScoreSampled, als, factors, cp, rank::Index, fact::Int) - ## I need to turn this into an ITensor and then pass it to the computed algorithm. - return matricize_tensor(als.mttkrp_alg, Val(als.additional_items[:cache_sampled_targets]), als, factors, cp, rank, fact) - end - - function matricize_tensor(::LevScoreSampled, ::Val{false}, als, factors, cp, rank::Index, fact::Int) - return fused_flatten_sample(als.target, fact, als.additional_items[:projects_tensors][fact]) - end - - function matricize_tensor(::LevScoreSampled, ::Val{true}, als, factors, cp, rank::Index, fact::Int) - if als.check.iter ≤ als.additional_items[:stop_resample] - als.additional_items[:sampled_targets][fact] = fused_flatten_sample(als.target, fact, als.additional_items[:projects_tensors][fact]) - end - - return @inbounds als.additional_items[:sampled_targets][fact] - end - - function post_solve(::LevScoreSampled, als, factors, λ, cp, rank::Index, fact::Integer) - ## update the factor weights. - @inbounds als.additional_items[:factor_weights][fact] = compute_leverage_score_probabilitiy(factors[fact], ind(cp, fact)) - end - -### With this solver we are going to compute sampling projectors for LS decomposition -### based on the leverage score of the factor matrices. Then we are going to solve a -### sampled least squares problem. To make the sampling process more efficient this algorithm -### gathers samples in blocks -struct BlockLevScoreSampled<: ProjectionAlgorithm - NSamples::Tuple - Blocks::Tuple -end - - BlockLevScoreSampled() = BlockLevScoreSampled((0,), (1,)) - BlockLevScoreSampled(n::Int) = BlockLevScoreSampled((n,), (1,)) - BlockLevScoreSampled(n::Int, m::Int) = BlockLevScoreSampled((n,), (m,)) - BlockLevScoreSampled(n::Tuple) = BlockLevScoreSampled{n, (1,)}() - BlockLevScoreSampled(n::Int, m::Tuple) = BlockLevScoreSampled((n,), m) - BlockLevScoreSampled(n::Tuple, m::Int) = BlockLevScoreSampled(n, (m,)) - - nsamples(alg::BlockLevScoreSampled) = alg.NSamples - blocks(alg::BlockLevScoreSampled) = alg.Blocks - - ## We are going to construct a matrix of sampled indices of the tensor - function project_krp(::BlockLevScoreSampled, als, factors, cp, rank::Index, fact::Int) - nsamps = nsamples(als.mttkrp_alg) - nsamps = length(nsamps) == 1 ? nsamps[1] : nsamps[fact] - block_size = blocks(als.mttkrp_alg) - block_size = length(block_size) == 1 ? block_size[1] : block_size[fact] - - resample = als.additional_items[:stop_resample] - resample = resample < 0 || resample > iter(als) - if resample - sampled_cols = block_sample_factor_matrices(nsamps, als.additional_items[:factor_weights], block_size, fact) - ## Write new samples to pivot tensor - array(als.additional_items[:projects_tensors][fact]) .= sampled_cols - else - sampled_cols = array(als.additional_items[:projects_tensors][fact]) - end - - return pivot_hadamard(factors, rank, sampled_cols, inds(als.additional_items[:projects_tensors][fact])[1]) - end - - function matricize_tensor(::BlockLevScoreSampled, als, factors, cp, rank::Index, fact::Int) - ## I need to turn this into an ITensor and then pass it to the computed algorithm. - return fused_flatten_sample(als.target, fact, als.additional_items[:projects_tensors][fact]) - end - - - function post_solve(::BlockLevScoreSampled, als, factors, λ, cp, rank::Index, fact::Integer) - ## update the factor weights. - als.additional_items[:factor_weights][fact] = compute_leverage_score_probabilitiy(factors[fact], ind(cp, fact)) - end - diff --git a/src/algorithms/ALS/als_algs.jl b/src/algorithms/als_algorithms/als_algs.jl similarity index 100% rename from src/algorithms/ALS/als_algs.jl rename to src/algorithms/als_algorithms/als_algs.jl diff --git a/src/algorithms/ALS/randomized/ProjectionAlgorithm.jl b/src/algorithms/als_algorithms/randomized/ProjectionAlgorithm.jl similarity index 100% rename from src/algorithms/ALS/randomized/ProjectionAlgorithm.jl rename to src/algorithms/als_algorithms/randomized/ProjectionAlgorithm.jl diff --git a/src/algorithms/ALS/randomized/krp_lev_score_sampled.jl b/src/algorithms/als_algorithms/randomized/krp_lev_score_sampled.jl similarity index 100% rename from src/algorithms/ALS/randomized/krp_lev_score_sampled.jl rename to src/algorithms/als_algorithms/randomized/krp_lev_score_sampled.jl diff --git a/src/algorithms/ALS/randomized/qr_lev_score_sampled.jl b/src/algorithms/als_algorithms/randomized/qr_lev_score_sampled.jl similarity index 100% rename from src/algorithms/ALS/randomized/qr_lev_score_sampled.jl rename to src/algorithms/als_algorithms/randomized/qr_lev_score_sampled.jl diff --git a/src/algorithms/ALS/randomized/sketched_ls.jl b/src/algorithms/als_algorithms/randomized/sketched_ls.jl similarity index 100% rename from src/algorithms/ALS/randomized/sketched_ls.jl rename to src/algorithms/als_algorithms/randomized/sketched_ls.jl diff --git a/src/algorithms/ALS/standard/MttkrpAlgorithm.jl b/src/algorithms/als_algorithms/standard/MttkrpAlgorithm.jl similarity index 100% rename from src/algorithms/ALS/standard/MttkrpAlgorithm.jl rename to src/algorithms/als_algorithms/standard/MttkrpAlgorithm.jl diff --git a/src/algorithms/ALS/standard/network.jl b/src/algorithms/als_algorithms/standard/network.jl similarity index 100% rename from src/algorithms/ALS/standard/network.jl rename to src/algorithms/als_algorithms/standard/network.jl diff --git a/src/algorithms/ALS/standard/standard_ls_tensor.jl b/src/algorithms/als_algorithms/standard/standard_ls_tensor.jl similarity index 100% rename from src/algorithms/ALS/standard/standard_ls_tensor.jl rename to src/algorithms/als_algorithms/standard/standard_ls_tensor.jl diff --git a/src/algorithms/ALS/standard/tensor.jl b/src/algorithms/als_algorithms/standard/tensor.jl similarity index 100% rename from src/algorithms/ALS/standard/tensor.jl rename to src/algorithms/als_algorithms/standard/tensor.jl diff --git a/src/optimizers/ALS/als_optimizer.jl b/src/optimizers/als_optimizers/als_optimizer.jl similarity index 100% rename from src/optimizers/ALS/als_optimizer.jl rename to src/optimizers/als_optimizers/als_optimizer.jl diff --git a/src/optimizers/ALS/optimize.jl b/src/optimizers/als_optimizers/optimize.jl similarity index 100% rename from src/optimizers/ALS/optimize.jl rename to src/optimizers/als_optimizers/optimize.jl diff --git a/src/optimizers/ALS/randomized/krp_lev_score_sampled.jl b/src/optimizers/als_optimizers/randomized/krp_lev_score_sampled.jl similarity index 100% rename from src/optimizers/ALS/randomized/krp_lev_score_sampled.jl rename to src/optimizers/als_optimizers/randomized/krp_lev_score_sampled.jl diff --git a/src/optimizers/ALS/randomized/qr_lev_score_sampled.jl b/src/optimizers/als_optimizers/randomized/qr_lev_score_sampled.jl similarity index 100% rename from src/optimizers/ALS/randomized/qr_lev_score_sampled.jl rename to src/optimizers/als_optimizers/randomized/qr_lev_score_sampled.jl diff --git a/src/optimizers/ALS/randomized/sketched_ls.jl b/src/optimizers/als_optimizers/randomized/sketched_ls.jl similarity index 100% rename from src/optimizers/ALS/randomized/sketched_ls.jl rename to src/optimizers/als_optimizers/randomized/sketched_ls.jl diff --git a/src/optimizers/ALS/standard/network.jl b/src/optimizers/als_optimizers/standard/network.jl similarity index 100% rename from src/optimizers/ALS/standard/network.jl rename to src/optimizers/als_optimizers/standard/network.jl diff --git a/src/optimizers/ALS/standard/tensor.jl b/src/optimizers/als_optimizers/standard/tensor.jl similarity index 100% rename from src/optimizers/ALS/standard/tensor.jl rename to src/optimizers/als_optimizers/standard/tensor.jl diff --git a/src/optimizers/cpd_optimizers.jl b/src/optimizers/cpd_optimizers.jl index b4d9855..46860ea 100644 --- a/src/optimizers/cpd_optimizers.jl +++ b/src/optimizers/cpd_optimizers.jl @@ -1,5 +1,5 @@ abstract type CPDOptimizer end ## ALS optimizers -include("ALS/als_optimizer.jl") -include("ALS/optimize.jl") \ No newline at end of file +include("als_optimizers/als_optimizer.jl") +include("als_optimizers/optimize.jl") \ No newline at end of file diff --git a/test/pivot_mapping.jl b/test/pivot_mapping.jl index 52d5b1a..4748307 100644 --- a/test/pivot_mapping.jl +++ b/test/pivot_mapping.jl @@ -155,5 +155,5 @@ using ITensorCPD: column_to_multi_coords krpm = reshape(array(krp), (ia*ib, m)) omega * krpm oh = ITensorCPD.omega_hadamard([A,B], cprank, omega) - @test all(array(oh) - omega * krpm .< 1e-10) + @test norm(array(oh) - omega * krpm) / norm(omega * krpm) < 1e-10 end