## Misc To Do

? Bug: UInt64 == Tag runs, but doesn't work properly. Should it even run?

+ Rename Davidson function if not using the diagonal preconditioner.

+ Read/write of ITensors and other objects, using HDF5 format

+ Add docstrings (see mps/dmrg.jl for an example)

+ Add noise term support to DMRG

+ Add copyright notice on top of files (see C++ version)

+ davidson improvements
  - evaluate logic (cyclic permutation of order of steps in main for loop?)
  - improve definitions and handling of parameters such as miniter, maxiter

+ MPS/MPO algorithms
  - rename nmultMPO to multMPO

+ Additional DMRG algorithms:
  - Vector of MPOs
  - orthogonalize against previous MPS
  - supply boundary environment tensors

+ Boson site set

+ QN Index

+ QN block-sparse tensors (with separate block-sparse library as discussed)

+ QN version of AutoMPO

+ Fermion support for AutoMPO (possibly through auto fermionic signs)

+ Move AutoMPO & physics site sets into separate ITensor physics package?

+ Slicing of ITensors


## Performance Issues

## Design Questions

+ What version number to use? 1.0? 

+ Switch to same version git branch naming scheme as the C++ repo uses

+ Should we rename methods like storage_svd etc. to just svd?
  Arguments for changing:
    - could use storage objects better in generic algorithms
      (e.g. put a Dense{Float64} object into a Krylov library routine)
    - hard to draw line between which functions are "storage_func" or just "func"
  Arguments for status quo:
    - makes code more readable in some ways
    - easier to see which methods to overload to make a new storage type
      (but we can address this by listing such methods in the docs)

## Optimization Ideas

+ Mimic "small vector" / "InfArray" optimization used in C++ ITensor.
  This optimization makes IndexSets not allocate on the heap until 
  the number of indices exceeds a certain size. Use a stack-allocated / non-allocating
  fixed-size array or tuple to hold indices below that size.

+ Instead of indexpositions returning a Vector{Int}, it could 
  act like a generator in python. (In Julia how is this implemented?
  Do you return an iterable struct?)

## Final Release Checks

+ Apply license text to all source files (see appendix of LICENSE file)
+ Make sure installation is clean on a brand new Julia install (no libraries at all)
+ Ensure dependencies are the true minimum amount
