Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
b4ae4d7
Working BP Commit
JoeyT1994 Oct 2, 2025
d77d063
BP Code
JoeyT1994 Oct 23, 2025
b80e36e
Express BP in terms of `SweepIterator` interface
jack-dunham Oct 28, 2025
fe44b80
Add method for `setmessages!` that allows messages from one cache to …
jack-dunham Oct 31, 2025
3ce0898
Network is now passed to `forest_cover_edge_sequence` directly.
jack-dunham Nov 10, 2025
f6e4fd0
test file formatting
jack-dunham Nov 25, 2025
63840a9
Add `DataGraphsPartitionedGraphsExt` glue for `TensorNetwork` type
jack-dunham Nov 25, 2025
ba22ab5
Make abstract tensor network interface more generic.
jack-dunham Nov 25, 2025
49b0870
BP Caching overhauls
jack-dunham Nov 25, 2025
db46c04
Remove dead deps
jack-dunham Nov 25, 2025
400e373
Fix merge
jack-dunham Nov 25, 2025
b9aafe8
Fix type inference in TensorNetwork construction
jack-dunham Nov 25, 2025
4090e61
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Nov 25, 2025
be0750e
Remove `ITensorBase` dep
jack-dunham Nov 25, 2025
b971b89
`forest_cover_edge_sequence` now constructs a temporary `NamedGraph` …
jack-dunham Dec 1, 2025
9ebf031
[LazyNamedDimsArrays] Fix `parenttype` method
jack-dunham Jan 6, 2026
16fe303
BP Cache now uses new `DataGraphs`interface
jack-dunham Jan 6, 2026
24a4335
Adjust `default_message` to take a `message` type as its first argument
jack-dunham Jan 6, 2026
c43884e
Remove unnecessary code and fix ambiguities in `AbstractTensorNetwork`
jack-dunham Jan 6, 2026
dd6f645
`TensorNetwork` type now uses new DataGraphs interface
jack-dunham Jan 6, 2026
7bb579c
Sweeping algorithms based on AlgorithmsInterface.jl (#30)
mtfishman Dec 19, 2025
032447a
Upgrade to NamedDimsArrays.jl v0.11 (#38)
mtfishman Dec 23, 2025
b256d79
[LazyNamedDimsArrays] New `symnameddims` method that pulls out indice…
jack-dunham Jan 9, 2026
b2da9d8
The function `region_scalar` should now return a scalar, rather than …
jack-dunham Jan 9, 2026
8506e26
Fix double counting in `edge_scalars` function
jack-dunham Jan 9, 2026
938180a
Minor code formatting
jack-dunham Jan 9, 2026
4461967
Expressed belief propagation in terms of AlgorithmsInterface
jack-dunham Jan 9, 2026
d68860a
Fixes to TensorNetwork construction from tensor list
jack-dunham Jan 9, 2026
2f5c783
Minor simplifications to `contract_network` interface.
jack-dunham Jan 9, 2026
9a45a5b
Merge branch 'main' into bp
jack-dunham Feb 13, 2026
4eec9b6
Upgrade DataGraphs and NamedGraphs dependencies
jack-dunham Feb 10, 2026
202724c
[AlgorithmsInterfaceExtensions] Allowing mapping over a generic itera…
jack-dunham Feb 10, 2026
69542e3
Upgrade serial BP to use own `<:Algorithm` structs.
jack-dunham Feb 11, 2026
9925069
Simplify BP cache to only store factors
jack-dunham Feb 13, 2026
292f2fa
Upgrade to DataGraphs v0.3.1 and NamedGraphs v0.10
jack-dunham Feb 13, 2026
9d937aa
Fix compat
jack-dunham Feb 13, 2026
5432fe2
Fix broken merge
jack-dunham Feb 13, 2026
c916c84
Bug fix; upgrade tests
jack-dunham Feb 19, 2026
4a511a1
Add 2D TN test
jack-dunham Feb 24, 2026
5b97af3
Formatting
jack-dunham Feb 24, 2026
fef588d
Merge branch 'main' into bp
jack-dunham Feb 24, 2026
62dae14
Merge branch 'bp' of https://github.com/jack-dunham/ITensorNetworksNe…
jack-dunham Mar 24, 2026
951cee6
Simplify BP code
jack-dunham Mar 12, 2026
1f1920c
Add spin ice test
jack-dunham Mar 13, 2026
5f3be98
Version Bump
jack-dunham Mar 13, 2026
487683a
Use `abs2` in message diff function.
jack-dunham Mar 13, 2026
aa24243
Add method for setting intitial messages; improve spin ice tests.
jack-dunham Mar 16, 2026
9248686
Remove redundant `default_message_diff_function` function.
jack-dunham Mar 16, 2026
9d7abea
Upgrade to DataGraphs and NamedGraphs to 0.4 and 0.11
jack-dunham Mar 24, 2026
f23b261
Merge branch 'main' into bp
jack-dunham Apr 14, 2026
1126331
Formatting
jack-dunham Apr 14, 2026
76b48be
Upgrade to simplified `similar_graph`
jack-dunham Apr 17, 2026
330074a
Remove edge arg in `similar_graph`.
jack-dunham Apr 20, 2026
cab6af3
Inline message computation into `solve!`; use type instead of alg str…
jack-dunham Apr 20, 2026
b5e6e36
Add in `PartitionedGraphs` interface methods for `TensorNetwork` and …
jack-dunham Apr 20, 2026
0786e82
Test BP with differing precisions; remove `atol` test criteria.
jack-dunham Apr 21, 2026
86fee1f
Use `map` instead of comprehension when returning messages.
jack-dunham Apr 22, 2026
b40dc99
Fix `nested_algorithm` methods on iterables.
jack-dunham Apr 22, 2026
2454330
Merge branch 'bp' of https://github.com/jack-dunham/ITensorNetworksNe…
jack-dunham Apr 22, 2026
3dcd192
Cleanup `AbstractBeliefPropagationCache` interface.
jack-dunham Apr 22, 2026
b3ad81b
Remove `Graphs.connected_components` method for `TensorNetwork`
jack-dunham Apr 27, 2026
d42b8c6
Remove unecessary `symnameddims` method.
jack-dunham Apr 27, 2026
e4dad19
Remove confusing code comment.
jack-dunham Apr 27, 2026
fc0203b
Remove `beliefpropagation_sweep` in favour of constructor call.
jack-dunham Apr 27, 2026
1e68a18
Fix message type initialization failing when only factors are provided.
jack-dunham Apr 28, 2026
76581a1
Formatting.
jack-dunham Apr 28, 2026
bf2a59f
Remove `edge_data_type` method for `AbstractTensorNetwork`
jack-dunham Apr 28, 2026
6e92749
Add some tests for `TensorNetwork` type.
jack-dunham Apr 28, 2026
f52e34b
Bug fixes; more tests
jack-dunham Apr 28, 2026
cf44dd6
Using `Inf` instead of `NaN` for delta initialization in `StopWhenCon…
jack-dunham Apr 28, 2026
1032177
Add some basic tests for `PartitionedGraphs` interactions with `Tenso…
jack-dunham Apr 28, 2026
aa78c20
Add tests via Claude.
jack-dunham Apr 29, 2026
f836155
Refine and redistribute generated tests
jack-dunham Apr 29, 2026
01de55f
Further BP test improvements
jack-dunham Apr 29, 2026
c533c89
Fix incomplete `sitenames` and `siteaxes` definitions.
jack-dunham Apr 29, 2026
122c2e7
Remove `default_message` and other fixes.
jack-dunham Apr 29, 2026
9b415ec
Fix test imports
jack-dunham Apr 29, 2026
26f12bc
Formatting.
jack-dunham Apr 29, 2026
e9dc540
Fix and test tensor network graph manipulation functions.
jack-dunham Apr 29, 2026
25df289
Refactor `BeliefPropagationCache` -> `MessageCache`, remove abstract …
jack-dunham Apr 30, 2026
3b20434
Simplify `factors` and `messages` methods on `AbstractGraph`
jack-dunham May 1, 2026
fecb55b
Allow a custom stopping criteria input into `beliefpropagation` using…
jack-dunham May 1, 2026
7211f29
Hard code edge type in `MessageCache`.
jack-dunham May 1, 2026
ef5c2ca
Merge branch 'bp' of https://github.com/jack-dunham/ITensorNetworksNe…
jack-dunham May 1, 2026
364f50d
Remove `MessageCache` undef initializer.
jack-dunham May 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "ITensorNetworksNext"
uuid = "302f2e75-49f0-4526-aef7-d8ba550cb06c"
version = "0.3.24"
version = "0.4.0"
authors = ["ITensor developers <support@itensor.org> and contributors"]

[workspace]
Expand Down Expand Up @@ -39,15 +39,15 @@ Adapt = "4.3"
AlgorithmsInterface = "0.1"
BackendSelection = "0.1.6"
Combinatorics = "1"
DataGraphs = "0.2.7"
DataGraphs = "0.4"
DiagonalArrays = "0.3.31"
Dictionaries = "0.4.5"
FunctionImplementations = "0.4"
FunctionImplementations = "0.4.1"
Graphs = "1.13.1"
LinearAlgebra = "1.10"
MacroTools = "0.5.16"
NamedDimsArrays = "0.14.2"
NamedGraphs = "0.6.9, 0.7, 0.8"
NamedDimsArrays = "0.14.3"
NamedGraphs = "0.11"
SimpleTraits = "0.9.5"
SplitApplyCombine = "1.2.3"
TensorOperations = "5.3.1"
Expand Down
2 changes: 1 addition & 1 deletion docs/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ path = ".."
[compat]
Documenter = "1"
ITensorFormatter = "0.2.27"
ITensorNetworksNext = "0.3"
ITensorNetworksNext = "0.4"
Literate = "2"
2 changes: 1 addition & 1 deletion examples/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ ITensorNetworksNext = "302f2e75-49f0-4526-aef7-d8ba550cb06c"
path = ".."

[compat]
ITensorNetworksNext = "0.3"
ITensorNetworksNext = "0.4"
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ function AI.initialize_state!(
end

function AI.initialize_state(
problem::Problem, algorithm::Algorithm; kwargs...
problem::Problem, algorithm::Algorithm; iterate, kwargs...
)
stopping_criterion_state = AI.initialize_state(
problem, algorithm, algorithm.stopping_criterion
problem, algorithm, algorithm.stopping_criterion; iterate
)
return DefaultState(; stopping_criterion_state, kwargs...)
return DefaultState(; iterate, stopping_criterion_state, kwargs...)
end

# ============================ DefaultState ================================================
Expand Down Expand Up @@ -151,8 +151,9 @@ end

abstract type NestedAlgorithm <: Algorithm end

function nested_algorithm(f::Function, nalgorithms::Int; kwargs...)
return DefaultNestedAlgorithm(f, nalgorithms; kwargs...)
nested_algorithm(f::Function, int::Int; kwargs...) = nested_algorithm(f, 1:int; kwargs...)
function nested_algorithm(f::Function, iterable; kwargs...)
return DefaultNestedAlgorithm(f, iterable; kwargs...)
end

max_iterations(algorithm::NestedAlgorithm) = length(algorithm.algorithms)
Expand Down Expand Up @@ -206,8 +207,8 @@ from a list of stored algorithms.
algorithms::Algorithms
stopping_criterion::StoppingCriterion = AI.StopAfterIteration(length(algorithms))
end
function DefaultNestedAlgorithm(f::Function, nalgorithms::Int; kwargs...)
return DefaultNestedAlgorithm(; algorithms = f.(1:nalgorithms), kwargs...)
function DefaultNestedAlgorithm(f::Function, iterable; kwargs...)
return DefaultNestedAlgorithm(; algorithms = f.(iterable), kwargs...)
end

# ============================ FlattenedAlgorithm ==========================================
Expand Down
3 changes: 3 additions & 0 deletions src/ITensorNetworksNext.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,7 @@ include("contract_network.jl")
include("sweeping/utils.jl")
include("sweeping/eigenproblem.jl")

include("beliefpropagation/messagecache.jl")
include("beliefpropagation/beliefpropagationproblem.jl")

end
2 changes: 1 addition & 1 deletion src/LazyNamedDimsArrays/lazynameddimsarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ using WrappedUnions: @wrapped
union::Union{A, Mul{LazyNamedDimsArray{T, A}}}
end

parenttype(::Type{LazyNamedDimsArray{<:Any, A}}) where {A} = A
parenttype(::Type{LazyNamedDimsArray{T, A}}) where {T, A} = A
parenttype(::Type{LazyNamedDimsArray{T}}) where {T} = AbstractNamedDimsArray{T}
parenttype(::Type{LazyNamedDimsArray}) = AbstractNamedDimsArray

Expand Down
105 changes: 40 additions & 65 deletions src/abstracttensornetwork.jl
Original file line number Diff line number Diff line change
@@ -1,27 +1,21 @@
using Adapt: Adapt, adapt, adapt_structure
using Adapt: Adapt, adapt
using BackendSelection: @Algorithm_str, Algorithm
using DataGraphs: DataGraphs, AbstractDataGraph, edge_data, underlying_graph,
underlying_graph_type, vertex_data
using DataGraphs: DataGraphs, AbstractDataGraph, edge_data, set_vertex_data!,
underlying_graph, underlying_graph_type, vertex_data
using Dictionaries: Dictionary
using Graphs: Graphs, AbstractEdge, AbstractGraph, Graph, add_edge!, add_vertex!, bfs_tree,
center, dst, edges, edgetype, ne, neighbors, nv, rem_edge!, src, vertices
using LinearAlgebra: LinearAlgebra, factorize
using Graphs: Graphs, AbstractEdge, AbstractGraph, add_edge!, add_vertex!, dst, edges,
edgetype, ne, neighbors, nv, rem_edge!, src, vertices
using LinearAlgebra: LinearAlgebra
using MacroTools: @capture
using NamedDimsArrays: dimnames, inds
using NamedGraphs.GraphsExtensions:
directed_graph, incident_edges, rem_edges!, rename_vertices, vertextype, ⊔
using NamedGraphs: NamedGraphs, NamedGraph, not_implemented, steiner_tree
using SplitApplyCombine: flatten
using NamedGraphs.GraphsExtensions: directed_graph, incident_edges, rem_edges!, vertextype
using NamedGraphs.OrdinalIndexing: OrdinalSuffixedInteger
using NamedGraphs: NamedGraphs, NamedGraph, not_implemented, similar_graph

abstract type AbstractTensorNetwork{V, VD} <: AbstractDataGraph{V, VD, Nothing} end

function Graphs.rem_edge!(tn::AbstractTensorNetwork, e)
rem_edge!(underlying_graph(tn), e)
return tn
end

# TODO: Define a generic fallback for `AbstractDataGraph`?
DataGraphs.edge_data_eltype(::Type{<:AbstractTensorNetwork}) = error("No edge data")
# Need to be careful about removing edges from tensor networks in case there is a bond
Graphs.rem_edge!(::AbstractTensorNetwork, edge) = not_implemented()
Comment thread
jack-dunham marked this conversation as resolved.

# Graphs.jl overloads
function Graphs.weights(graph::AbstractTensorNetwork)
Expand All @@ -36,7 +30,7 @@ function Graphs.weights(graph::AbstractTensorNetwork)
end

# Copy
Base.copy(tn::AbstractTensorNetwork) = error("Not implemented")
Base.copy(::AbstractTensorNetwork) = not_implemented()

# Iteration
Base.iterate(tn::AbstractTensorNetwork, args...) = iterate(vertex_data(tn), args...)
Expand All @@ -49,20 +43,7 @@ Base.eltype(tn::AbstractTensorNetwork) = eltype(vertex_data(tn))
# Overload if needed
Graphs.is_directed(::Type{<:AbstractTensorNetwork}) = false

# Derived interface, may need to be overloaded
function DataGraphs.underlying_graph_type(G::Type{<:AbstractTensorNetwork})
return underlying_graph_type(data_graph_type(G))
end

# AbstractDataGraphs overloads
function DataGraphs.vertex_data(graph::AbstractTensorNetwork, args...)
return error("Not implemented")
end
function DataGraphs.edge_data(graph::AbstractTensorNetwork, args...)
return error("Not implemented")
end

DataGraphs.underlying_graph(tn::AbstractTensorNetwork) = error("Not implemented")
DataGraphs.underlying_graph(::AbstractTensorNetwork) = not_implemented()
function NamedGraphs.vertex_positions(tn::AbstractTensorNetwork)
return NamedGraphs.vertex_positions(underlying_graph(tn))
end
Expand All @@ -81,49 +62,46 @@ function Adapt.adapt_structure(to, tn::AbstractTensorNetwork)
return map_vertex_data_preserve_graph(adapt(to), tn)
end

function linkinds(tn::AbstractTensorNetwork, edge::Pair)
return linkinds(tn, edgetype(tn)(edge))
end
function linkinds(tn::AbstractTensorNetwork, edge::AbstractEdge)
return inds(tn[src(edge)]) ∩ inds(tn[dst(edge)])
end
function linkaxes(tn::AbstractTensorNetwork, edge::Pair)
linkinds(tn::AbstractGraph, edge::Pair) = linkinds(tn, edgetype(tn)(edge))
linkinds(tn::AbstractGraph, edge::AbstractEdge) = inds(tn[src(edge)]) ∩ inds(tn[dst(edge)])

function linkaxes(tn::AbstractGraph, edge::Pair)
return linkaxes(tn, edgetype(tn)(edge))
end
function linkaxes(tn::AbstractTensorNetwork, edge::AbstractEdge)
function linkaxes(tn::AbstractGraph, edge::AbstractEdge)
return axes(tn[src(edge)]) ∩ axes(tn[dst(edge)])
end
function linknames(tn::AbstractTensorNetwork, edge::Pair)
function linknames(tn::AbstractGraph, edge::Pair)
return linknames(tn, edgetype(tn)(edge))
end
function linknames(tn::AbstractTensorNetwork, edge::AbstractEdge)
function linknames(tn::AbstractGraph, edge::AbstractEdge)
return dimnames(tn[src(edge)]) ∩ dimnames(tn[dst(edge)])
end

function siteinds(tn::AbstractTensorNetwork, v)
function siteinds(tn::AbstractGraph, v)
s = inds(tn[v])
for v′ in neighbors(tn, v)
s = setdiff(s, inds(tn[v′]))
end
return s
end
function siteaxes(tn::AbstractTensorNetwork, edge::AbstractEdge)
s = axes(tn[src(edge)]) ∩ axes(tn[dst(edge)])
function siteaxes(tn::AbstractGraph, v)
s = axes(tn[v])
for v′ in neighbors(tn, v)
s = setdiff(s, axes(tn[v′]))
end
return s
end
function sitenames(tn::AbstractTensorNetwork, edge::AbstractEdge)
s = dimnames(tn[src(edge)]) ∩ dimnames(tn[dst(edge)])
function sitenames(tn::AbstractGraph, v)
s = dimnames(tn[v])
for v′ in neighbors(tn, v)
s = setdiff(s, dimnames(tn[v′]))
end
return s
end

function setindex_preserve_graph!(tn::AbstractTensorNetwork, value, vertex)
vertex_data(tn)[vertex] = value
function setindex_preserve_graph!(tn::AbstractGraph, value, vertex)
set_vertex_data!(tn, value, vertex)
return tn
end

Expand Down Expand Up @@ -153,15 +131,15 @@ end

# Update the graph of the TensorNetwork `tn` to include
# edges that should exist based on the tensor connectivity.
function add_missing_edges!(tn::AbstractTensorNetwork)
function add_missing_edges!(tn::AbstractGraph)
foreach(v -> add_missing_edges!(tn, v), vertices(tn))
return tn
end

# Update the graph of the TensorNetwork `tn` to include
# edges that should be incident to the vertex `v`
# based on the tensor connectivity.
function add_missing_edges!(tn::AbstractTensorNetwork, v)
function add_missing_edges!(tn::AbstractGraph, v)
for v′ in vertices(tn)
if v ≠ v′
e = v => v′
Expand All @@ -175,14 +153,19 @@ end

# Fix the edges of the TensorNetwork `tn` to match
# the tensor connectivity.
function fix_edges!(tn::AbstractTensorNetwork)
function fix_edges!(tn::AbstractGraph)
foreach(v -> fix_edges!(tn, v), vertices(tn))
return tn
end
# Fix the edges of the TensorNetwork `tn` to match
# the tensor connectivity at vertex `v`.
function fix_edges!(tn::AbstractTensorNetwork, v)
rem_edges!(tn, incident_edges(tn, v))
function fix_edges!(tn::AbstractGraph, v)
for e in incident_edges(tn, v)
# Remove an edge if there is no index on that edge.
if isempty(linkinds(tn, e))
rem_edge!(tn, e)
end
end
add_missing_edges!(tn, v)
return tn
end
Expand Down Expand Up @@ -215,28 +198,20 @@ function Base.setindex!(tn::AbstractTensorNetwork, value, v)
fix_edges!(tn, v)
return tn
end
using NamedGraphs.OrdinalIndexing: OrdinalSuffixedInteger
# Fix ambiguity error.
function Base.setindex!(graph::AbstractTensorNetwork, value, vertex::OrdinalSuffixedInteger)
graph[vertices(graph)[vertex]] = value
return graph
end
# Fix ambiguity error.
function Base.setindex!(tn::AbstractTensorNetwork, value, edge::AbstractEdge)
return error("No edge data.")
end
# Fix ambiguity error.
function Base.setindex!(tn::AbstractTensorNetwork, value, edge::Pair)
return error("No edge data.")
end
using NamedGraphs.OrdinalIndexing: OrdinalSuffixedInteger
Base.setindex!(tn::AbstractTensorNetwork, value, edge::AbstractEdge) = not_implemented()
Base.setindex!(tn::AbstractTensorNetwork, value, edge::Pair) = not_implemented()
# Fix ambiguity error.
function Base.setindex!(
tn::AbstractTensorNetwork,
value,
edge::Pair{<:OrdinalSuffixedInteger, <:OrdinalSuffixedInteger}
)
return error("No edge data.")
return not_implemented()
end

function Base.show(io::IO, mime::MIME"text/plain", graph::AbstractTensorNetwork)
Expand Down
Loading
Loading