# How do I set a minimum bond dimension when applying ITensors to an MPS?

I'm looking for a way to tell ITensors to keep a certain minimum number of singular values when I apply a two-site operator to an MPS.
I usually have an array ops of two-site ITensors, which I apply on an MPS state using apply(ops, state; cutoff=err), but no matter how low I set err, I never see the bond dimension increasing.
To be precise, I'm testing the evolution of a chain of 1/2-spins under a simple exchange Hamiltonian
$$\sum_{i=1}^N(\sigma^+_j\sigma^-_{j+1}+\sigma^-_j\sigma^+_{j+1}),$$
starting from a state with a single spin in the "up" state, the others in the "down" state; even with err=1e-15 the bond dimensions never exceed 2.
If I recall correctly, theoretically speaking it could be higher, at least in the more central sites, but it doesn't happen here. It may be that the entanglement along the chain is so low that the singular values other than the first two are genuinely very tiny, but I would like to include them anyway, for the sake of testing.

I see that the svd function in the library has the mindim keyword, so the option is there, but I can't find a way to use it when I call product or apply.

commented by (70.1k points)
Hi Davide,
Your request is an interesting one: I agree it would be good if we had a way to really turn off truncation altogether for testing purposes, even if it led to exactly zero singular values (because then you can definitely look).

Let me comment on your setup first, though, then please let me know if you'd still like the "no truncating" feature.

From your initial state and the operator you've defined, I'm pretty sure what is happening is that one of the terms in your operator, when acting on a bond (j,j+1) is just flipping the two neighboring spins and the other is just evaluating to zero. That's if the spins are different. If they are the same then that term just gives zero.

So then I'm pretty sure your operator is just always mapping product states to product states and that's why the bond dimension doesn't grow (& I'm surprised it grows even to 2 and not just stays 1).

Finally, you can be assured that if the bond dimension doesn't grow, it's because the singular values really were zero or else below your cutoff (more precisely their sum was below the cutoff). So they must be smaller than 1E-15.

But if you think the feature of no truncation would still be helpful, it might not be too hard for us to add that.

Best,
Miles
commented by (140 points)
Thank you for your answer. I was probably too vague in my question, but the operator I am applying to the state is not just the Hamiltonian H, but actually exp(-iHt) for some real number t, so maybe this explains why the bond dimension is 2 instead of 1.
Anyway, yes, a mindim keyword would be useful to me in order to inspect the SVDs (but of course I don't want to demand anything); I would try to add it myself but I can't find where exactly the factorization is computed after the state is multiplied by an operator.

--
Davide
commented by (14.1k points)
I believe that all of the keyword arguments passed to apply just get forwarded through to factorize, so that should be the case with mindim as well. Did you try passing mindim to apply?

Also, if you don't specify cutoff at all, it should do no truncation. If that doesn't work, you could try setting cutoff=0 or cutoff=nothing. The first one should only truncate singular values that are exactly zero, and the second should perform no truncation at all.