@@ -305,16 +305,17 @@ Instantiate a local operator `O` on a lattice `lattice` as a vector of MPO tenso
305305vector of linear site indices.
306306"""
307307function instantiate_operator (lattice:: AbstractArray{<:VectorSpace} , (inds′, O):: Pair )
308- inds = inds′ isa Int ? tuple ( inds′) : inds′
309- mpo = O isa FiniteMPO ? O : FiniteMPO (O)
308+ inds = inds′ isa Int ? [ inds′] : inds′
309+ mpo = O isa FiniteMPO ? copy (O) : FiniteMPO (O)
310310
311311 # convert to linear index type
312- indices = map (inds) do I
313- return Base. _to_linear_index (lattice, Tuple (I)... ) # this should mean all inds are valid...
312+ indices = Vector {Int} (undef, length (inds))
313+ for i in eachindex (indices)
314+ indices[i] = Base. _to_linear_index (lattice, Tuple (inds[i])... ) # this should mean all inds are valid...
314315 end
315316
316317 # sort indices and deduplicate
317- indices, mpo = canonicalize_indices (indices, mpo)
318+ indices, mpo = canonicalize_indices! (indices, mpo)
318319 operators = parent (mpo)
319320
320321 @assert allunique (indices) && issorted (indices) " From here on we require unique and ascending indices\n $indices "
@@ -338,14 +339,23 @@ function instantiate_operator(lattice::AbstractArray{<:VectorSpace}, (inds′, O
338339 return sites => local_mpo
339340end
340341
341- function canonicalize_indices (indices, mpo)
342- issorted (indices) && return indices, mpo
343- mpo = copy (mpo)
344- I = TensorKit. TupleTools. sortperm (indices)
345- for s in TensorKit. permutation2swaps (I)
346- swap! (mpo, s)
342+ function canonicalize_indices! (indices, mpo)
343+ # swap non-sorted entries
344+ for i in 2 : length (indices)
345+ for j in reverse (i: length (indices))
346+ if indices[j] < indices[j - 1 ]
347+ swap! (mpo, j - 1 )
348+ indices[j - 1 ], indices[j] = indices[j], indices[j - 1 ]
349+ end
350+ end
351+ end
352+ for i in length (indices): - 1 : 2
353+ if indices[i] == indices[i - 1 ]
354+ multiply_neighbours! (mpo, i - 1 )
355+ popat! (indices, i)
356+ end
347357 end
348- return TensorKit . TupleTools . getindices ( indices, I) , mpo
358+ return indices, mpo
349359end
350360
351361# yields the promoted tensortype of all tensors
0 commit comments