kestrelquantum / NamedTrajectories.jl

Efficient Handling of Trajectories with User Defined Named Components
MIT License
6 stars 4 forks source link

[Feature]: Virtual names #38

Open makzator opened 1 month ago

makzator commented 1 month ago

Feature Description

A NamedTrajectory is created by passing a NamedTuple of components that combines component names with initial data. I recently encountered the scenario that during optimization I wanted to access trajectory data stored under multiple different names using a single reference, e.g.:

# define components
components = (
  psi0_iso = rand(2d, T),
  psi1_iso = rand(2d, T),
  a = rand(2, T),
  dts = rand(1, T)
)

# build trajectory
traj = NamedTrajectory(components; timestep=:dts, controls=:a)

# now wishing to access a concatenation of psi0_iso and psi1_iso
# under a virtual reference psi_iso
traj.psi_iso == vcat(traj.psi0_iso, traj.psi1_iso)

An alternative example would be to only access part of a component, e.g.:

traj.psi0_im == traj.psi0_iso[(d+1):end,:]

Such virtual names / references would be helpful for convenience and maybe other purposes. In my case I wanted to use predefined infidelity objectives but on concatenated statevectors.

One way to implement this could be:

# define virtual names and what components + indices they correspond to
vnames = (
  psi_iso = [
      (:psi0_iso, 1:2d),
      (:psi1_iso, 1:2d)
    ],
  psi0_im = [
    (:psi0_iso, (d+1):2d)
  ]
)

# build trajectory with optional arg
traj = NamedTrajectory(components; timestep=:dts, controls=:a, vnames=vnames)

Importance

1 (lowest)

What does this feature affect?

Other information

No response

aarontrowbridge commented 1 month ago

i like this idea, it seems like it should be pretty easy to implement too