@@ -36,39 +36,68 @@ function getsite(ts::TagSet)
3636 return parse (Int, celltag[(length (indextagprefix ()) + 1 ): end ])
3737end
3838
39- function translatecell (ts:: TagSet , n:: Integer )
39+ # #Translation operators
40+
41+ # Default translate cell
42+ function translatecelltags (ts:: TagSet , n:: Integer )
4043 ncell = getcell (ts)
4144 if isnothing (ncell)
4245 return ts
4346 end
4447 return replacetags (ts, celltags (ncell) => celltags (ncell + n))
4548end
4649
47- function translatecell (i:: Index , n:: Integer )
50+ function translatecelltags (i:: Index , n:: Integer )
4851 ts = tags (i)
49- translated_ts = translatecell (ts, n)
52+ translated_ts = translatecelltags (ts, n)
5053 return replacetags (i, ts => translated_ts)
5154end
5255
53- function translatecell (is:: Union{<:Tuple,<:Vector} , n:: Integer )
54- return translatecell .(is, n)
56+ # Transfer the functional properties
57+ # translatecell(translator, T::ITensor, n::Integer) = translator(T, n)
58+ function translatecell (translator:: Function , T:: ITensor , n:: Integer )
59+ return ITensors. setinds (T, translatecell (translator, inds (T), n))
60+ end
61+ translatecell (translator:: Function , T:: MPO , n:: Integer ) = translatecell .(translator, T, n)
62+ function translatecell (translator:: Function , T:: Matrix{ITensor} , n:: Integer )
63+ return translatecell .(translator, T, n)
64+ end
65+ translatecell (translator:: Function , i:: Index , n:: Integer ) = translator (i, n)
66+ function translatecell (translator:: Function , is:: Union{<:Tuple,<:Vector} , n:: Integer )
67+ return translatecell .(translator, is, n)
5568end
5669
57- translatecell (T:: ITensor , n:: Integer ) = ITensors. setinds (T, translatecell (inds (T), n))
58- translatecell (T:: MPO , n:: Integer ) = translatecell .(T, n)
59- translatecell (T:: Matrix{ITensor} , n:: Integer ) = translatecell .(T, n)
70+ # Default behavior
71+ # translatecell(T::ITensor, n::Integer) = ITensors.setinds(T, translatecell(inds(T), n))
72+ # translatecell(T::MPO, n::Integer) = translatecell.(T, n)
73+ # translatecell(T::Matrix{ITensor}, n::Integer) = translatecell.(T, n)
6074
61- struct CelledVector{T} <: AbstractVector{T}
75+ struct CelledVector{T,F } <: AbstractVector{T}
6276 data:: Vector{T}
77+ translator:: F
6378end
6479ITensors. data (cv:: CelledVector ) = cv. data
80+ translator (cv:: CelledVector ) = cv. translator
6581
82+ Base. copy (m:: CelledVector ) = typeof (m)(copy (m. data), m. translator) # needed to carry the translator when copying
83+ Base. deepcopy (m:: CelledVector ) = typeof (m)(deepcopy (m. data), m. translator) # needed to carry the translator when copying
6684Base. convert (:: Type{CelledVector{T}} , v:: Vector ) where {T} = CelledVector {T} (v)
6785
6886function CelledVector {T} (:: UndefInitializer , n:: Integer ) where {T}
6987 return CelledVector (Vector {T} (undef, n))
7088end
7189
90+ function CelledVector {T} (:: UndefInitializer , n:: Integer , translator:: Function ) where {T}
91+ return CelledVector (Vector {T} (undef, n), translator:: Function )
92+ end
93+ CelledVector (v:: AbstractVector ) = CelledVector (v, translatecelltags)
94+ function CelledVector {T} (v:: Vector{T} ) where {T}
95+ return CelledVector (v, translatecelltags)
96+ end
97+ function CelledVector {T} (v:: Vector{T} , translator:: Function ) where {T}
98+ return CelledVector (v, translator)
99+ end
100+
72101"""
73102 celllength(cv::CelledVector)
74103
@@ -105,12 +134,12 @@ _getindex_cell1(cv::CelledVector, n::Int) = ITensors.data(cv)[n]
105134_setindex_cell1! (cv:: CelledVector , val, n:: Int ) = (ITensors. data (cv)[n] = val)
106135
107136# Fallback
108- translatecell (x, :: Integer ) = x
137+ # translatecell(x, ::Integer) = x # I think this is useless now
109138
110139function getindex (cv:: CelledVector , n:: Int )
111140 cellₙ = cell (cv, n)
112141 siteₙ = cellindex (cv, n)
113- return translatecell (_getindex_cell1 (cv, siteₙ), cellₙ - 1 )
142+ return translatecell (cv . translator, _getindex_cell1 (cv, siteₙ), cellₙ - 1 )
114143end
115144
116145# Do we need this definition? Maybe uses generic Julia fallback
@@ -137,44 +166,8 @@ getindex(cv::CelledVector, c::Cell) = cv[eachindex(cv, c)]
137166function setindex! (cv:: CelledVector , T, n:: Int )
138167 cellₙ = cell (cv, n)
139168 siteₙ = cellindex (cv, n)
140- _setindex_cell1! (cv, translatecell (T, - (cellₙ - 1 )), siteₙ)
169+ _setindex_cell1! (cv, translatecell (cv . translator, T, - (cellₙ - 1 )), siteₙ)
141170 return cv
142171end
143172
144173celltags (cell) = TagSet (" c=$cell " )
145-
146- #
147- # TODO : This version accepts a more general translation function between
148- # unit cells
149- #
150-
151- # struct CelledVector{T, F, FINV} <: AbstractVector{T}
152- # data::Vector{T}
153- # f::F
154- # end
155- #
156- # CelledVector(v::AbstractVector) = CelledVector(v, identity)
157- #
158- # cell_length(cv::CelledVector) = length(cv.data)
159- #
160- # # Determine which cell the index is in
161- # cell(cv::CelledVector, n::Integer) = fld1(n, cell_length(cv))
162- #
163- # # Determine the index in the cell where the index sits
164- # cell_index(cv::CelledVector, n::Integer) = mod1(n, cell_length(cv))
165- #
166- # # Return the cell and the cell index
167- # cell_and_cell_index(cv::CelledVector, n::Integer) = fldmod1(n, cell_length(cv))
168- #
169- # function getindex(cv::CelledVector, n::Integer)
170- # cellₙ, cell_indexₙ = cell_and_cell_index(cv, n)
171- # return cv.f(cv.data[cell_indexₙ], cellₙ)
172- # end
173- #
174- # function setindex!(cv::CelledVector, val, n::Integer)
175- # cellₙ, cell_indexₙ = cell_and_cell_index(cv, n)
176- # # XXX : is this offset generally correct?
177- # # It seems to be for "linear" functions.
178- # cv.data[cell_indexₙ] = cv.f(val, -cellₙ + 2)
179- # return cv
180- # end
0 commit comments