Repository: OpenMDAO/dymos (python)

Issue:
Initial States Doesn't Seem Supported for Explicit Shooting
### Description

The following code functions to set my initial states with Radau, but when I swap over to Explicit Shooting, I can no longer promote `initial_states:x` out of the phase. Looking at the n2, I don't immediately see an alternative

```python
import openmdao.api as om
import dymos as dm
from dymos.examples.oscillator.oscillator_ode import OscillatorODE

# Instantiate an OpenMDAO Problem instance.
prob = om.Problem()

# Instantiate a Dymos Trajectory and add it to the Problem model.
traj = dm.Trajectory()
prob.model.add_subsystem('traj', traj)
phase = dm.Phase(
    ode_class=OscillatorODE,
    transcription=dm.Radau(num_segments=4))
traj.add_phase('phase0', phase, promotes_inputs=['initial_states:x'])

phase.add_timeseries_output('output1')

# Tell Dymos the states to be propagated using the given ODE.
phase.add_state('v', rate_source='v_dot', targets=['v'], units='m/s')
phase.add_state('x', input_initial=True, rate_source='v', targets=['x'], units='m')

idv: om.IndepVarComp = traj.add_subsystem('idv', om.IndepVarComp(), promotes=['*'])
idv.add_output('initial_states:x', val=2)

# Setup the OpenMDAO problem
prob.setup()
prob.run_model()

om.n2(prob)
```

### Example

```python
import openmdao.api as om
import dymos as dm
from dymos.examples.oscillator.oscillator_ode import OscillatorODE

# Instantiate an OpenMDAO Problem instance.
prob = om.Problem()

# Instantiate a Dymos Trajectory and add it to the Problem model.
traj = dm.Trajectory()
prob.model.add_subsystem('traj', traj)
phase = dm.Phase(
    ode_class=OscillatorODE,
    transcription=dm.ExplicitShooting(num_segments=4))
traj.add_phase('phase0', phase, promotes_inputs=['initial_states:x'])

phase.add_timeseries_output('output1')

# Tell Dymos the states to be propagated using the given ODE.
phase.add_state('v', rate_source='v_dot', targets=['v'], units='m/s')
phase.add_state('x', input_initial=True, rate_source='v', targets=['x'], units='m')

idv: om.IndepVarComp = traj.add_subsystem('idv', om.IndepVarComp(), promotes=['*'])
idv.add_output('initial_states:x', val=2)

# Setup the OpenMDAO problem
prob.setup()
prob.run_model()

om.n2(prob)
```


### Dymos Version

1.7.0

### Relevant environment information

_No response_

Pull request description:
Initial states in ExplicitShooting now provided with `phase_path.initial_states:state_name`
### Summary

Changed the name of the input that governs the initial state values in `ExplicitShooting` to `initial_states:{state_name}`.
This is in line with the behavior of the pseudospectral phases when solve_segements is used.

### Related Issues

- Resolves #904 

### Backwards incompatibilities

Users who previously used `set_val('path_to_phase.states:x', ...)` with ExplicitShooting will need to change
their code to use `set_val('path_to_phase.initial_states:x', ...)`

### New Dependencies

None


Patch:
diff --git a/docs/dymos_book/examples/brachistochrone/brachistochrone.ipynb b/docs/dymos_book/examples/brachistochrone/brachistochrone.ipynb
index 2a16350f..1047031d 100644
--- a/docs/dymos_book/examples/brachistochrone/brachistochrone.ipynb
+++ b/docs/dymos_book/examples/brachistochrone/brachistochrone.ipynb
@@ -613,9 +613,9 @@
     "\n",
     "# Only the initial values of the states are design variables,\n",
     "# so the phase interp method is not used on states.\n",
-    "p.set_val('traj.phase0.states:x', 0.0)\n",
-    "p.set_val('traj.phase0.states:y', 10.0)\n",
-    "p.set_val('traj.phase0.states:v', 0.0)\n",
+    "p.set_val('traj.phase0.initial_states:x', 0.0)\n",
+    "p.set_val('traj.phase0.initial_states:y', 10.0)\n",
+    "p.set_val('traj.phase0.initial_states:v', 0.0)\n",
     "p.set_val('traj.phase0.controls:theta', phase.interp('theta', ys=[5, 100.5]))\n",
     "\n",
     "#\n",
diff --git a/docs/dymos_book/examples/robertson_problem/robertson_problem.ipynb b/docs/dymos_book/examples/robertson_problem/robertson_problem.ipynb
index f777e680..24a8c3b3 100644
--- a/docs/dymos_book/examples/robertson_problem/robertson_problem.ipynb
+++ b/docs/dymos_book/examples/robertson_problem/robertson_problem.ipynb
@@ -300,9 +300,9 @@
     "    p['traj.phase0.t_initial'] = 0.0\n",
     "    p['traj.phase0.t_duration'] = t_final\n",
     "\n",
-    "    p.set_val('traj.phase0.states:x0', phase.interp('x0', ys=[1.0, 0.7]))\n",
-    "    p.set_val('traj.phase0.states:y0', phase.interp('y0', ys=[0.0, 1e-5]))\n",
-    "    p.set_val('traj.phase0.states:z0', phase.interp('z0', ys=[0.0, 0.3]))\n",
+    "    p.set_val('traj.phase0.initial_states:x0', 1.0)\n",
+    "    p.set_val('traj.phase0.initial_states:y0', 0.0)\n",
+    "    p.set_val('traj.phase0.initial_states:z0', 0.0)\n",
     "\n",
     "    return p\n"
    ]
diff --git a/dymos/phase/simulation_phase.py b/dymos/phase/simulation_phase.py
index 642dfd63..0ec79d3e 100644
--- a/dymos/phase/simulation_phase.py
+++ b/dymos/phase/simulation_phase.py
@@ -110,7 +110,7 @@ class SimulationPhase(Phase):
 
         for name, options in self.state_options.items():
             val = from_phase.get_val(f'states:{name}', units=options['units'])[0, ...]
-            self.set_val(f'states:{name}', val, units=options['units'])
+            self.set_val(f'initial_states:{name}', val, units=options['units'])
 
         for name, options in self.parameter_options.items():
             val = from_phase.get_val(f'parameters:{name}', units=options['units'])
@@ -162,7 +162,7 @@ class SimulationPhase(Phase):
         # Assign initial state values
         for name in phs.state_options:
             op = op_dict[f'timeseries.timeseries_comp.states:{name}']
-            prob[f'{self_path}states:{name}'][...] = op['val'][0, ...]
+            prob[f'{self_path}initial_states:{name}'][...] = op['val'][0, ...]
 
         # Assign control values
         for name, options in phs.control_options.items():
diff --git a/dymos/transcriptions/common/parameter_comp.py b/dymos/transcriptions/common/parameter_comp.py
index 580e34e8..6d66afdc 100644
--- a/dymos/transcriptions/common/parameter_comp.py
+++ b/dymos/transcriptions/common/parameter_comp.py
@@ -33,7 +33,7 @@ class ParameterComp(ExplicitComponent):
 
         self._no_check_partials = not dymos_options['include_check_partials']
 
-    def add_parameter(self, name, val=1.0, shape=None, output_name=None, src_indices=None, flat_src_indices=None,
+    def add_parameter(self, name, val=1.0, shape=None, output_name=None,
                       units=None, desc='', tags=None, input_tags=None, output_tags=None, input_shape_by_conn=False,
                       input_copy_shape=None, output_shape_by_conn=False, output_copy_shape=None,
                       distributed=None, res_units=None, lower=None, upper=None, ref=1.0, ref0=0.0, res_ref=1.0, ):
@@ -52,14 +52,6 @@ class ParameterComp(ExplicitComponent):
             val is not an array. Default is None.
         output_name : str
             Name given to the output variale in this component's namespace.  If None, f'{name}_value' is used.
-        src_indices : int or list or tuple or int ndarray or Iterable or None
-            The global indices of the source variable to transfer data from.
-            A value of None implies this input depends on all entries of the source array.
-            Default is None. The shapes of the target and src_indices must match,
-            and the form of the entries within is determined by the value of 'flat_src_indices'.
-        flat_src_indices : bool
-            If True and the source is non-flat, each entry of src_indices is assumed to be an index
-            into the flattened source.  Ignored if the source is flat.
         units : str or None
             Units in which this input variable will be provided to the component
             during execution. Default is None, which means it is unitless.
@@ -150,7 +142,7 @@ class ParameterComp(ExplicitComponent):
         out_val = np.expand_dims(in_val, axis=0)
 
         i_meta = self.add_input(name=f'parameters:{name}', val=in_val, shape=_shape, units=units, desc=desc,
-                                src_indices=src_indices, flat_src_indices=flat_src_indices, tags=tags + input_tags,
+                                tags=tags + input_tags,
                                 shape_by_conn=input_shape_by_conn, copy_shape=input_copy_shape, distributed=distributed)
 
         o_meta = self.add_output(name=_out_name, val=out_val, shape=_out_shape, units=units,
diff --git a/dymos/transcriptions/explicit_shooting/explicit_shooting.py b/dymos/transcriptions/explicit_shooting/explicit_shooting.py
index 127e5e76..0a24dee1 100644
--- a/dymos/transcriptions/explicit_shooting/explicit_shooting.py
+++ b/dymos/transcriptions/explicit_shooting/explicit_shooting.py
@@ -260,7 +260,7 @@ class ExplicitShooting(TranscriptionBase):
         integ._configure_states()
 
         for name, options in phase.state_options.items():
-            phase.promotes('integrator', inputs=[f'states:{name}'])
+            phase.promotes('integrator', inputs=[(f'states:{name}', f'initial_states:{name}')])
             for ts_name, ts_options in phase._timeseries.items():
                 if f'states:{name}' not in ts_options['outputs']:
                     phase.add_timeseries_output(name, output_name=f'states:{name}',
@@ -272,7 +272,7 @@ class ExplicitShooting(TranscriptionBase):
                 raise ValueError('fix_final is not a valid option for states when using the '
                                  'ExplicitShooting transcription.')
             if options['opt'] and not options['fix_initial']:
-                phase.add_design_var(name=f'states:{state_name}',
+                phase.add_design_var(name=f'initial_states:{state_name}',
                                      lower=options['lower'],
                                      upper=options['upper'],
                                      scaler=options['scaler'],


Test patch:
diff --git a/dymos/examples/brachistochrone/test/ex_brachistochrone.py b/dymos/examples/brachistochrone/test/ex_brachistochrone.py
index 3b1458d5..3fcc5d4f 100644
--- a/dymos/examples/brachistochrone/test/ex_brachistochrone.py
+++ b/dymos/examples/brachistochrone/test/ex_brachistochrone.py
@@ -78,9 +78,15 @@ def brachistochrone_min_time(transcription='gauss-lobatto', num_segments=8, tran
     p['traj0.phase0.t_initial'] = 0.0
     p['traj0.phase0.t_duration'] = 2.0
 
-    p['traj0.phase0.states:x'] = phase.interp('x', [0, 10])
-    p['traj0.phase0.states:y'] = phase.interp('y', [10, 5])
-    p['traj0.phase0.states:v'] = phase.interp('v', [0, 9.9])
+    if transcription.startswith('shooting'):
+        p['traj0.phase0.initial_states:x'] = 0
+        p['traj0.phase0.initial_states:y'] = 10
+        p['traj0.phase0.initial_states:v'] = 0
+    else:
+        p['traj0.phase0.states:x'] = phase.interp('x', [0, 10])
+        p['traj0.phase0.states:y'] = phase.interp('y', [10, 5])
+        p['traj0.phase0.states:v'] = phase.interp('v', [0, 9.9])
+
     p['traj0.phase0.controls:theta'] = phase.interp('theta', [5, 100])
     p['traj0.phase0.parameters:g'] = 9.80665
 
diff --git a/dymos/examples/brachistochrone/test/test_brachistochrone_subprob_reports.py b/dymos/examples/brachistochrone/test/test_brachistochrone_subprob_reports.py
index 9b818cd9..1a71012c 100644
--- a/dymos/examples/brachistochrone/test/test_brachistochrone_subprob_reports.py
+++ b/dymos/examples/brachistochrone/test/test_brachistochrone_subprob_reports.py
@@ -105,9 +105,9 @@ def setup_model_shooting(do_reports):
 
     prob.set_val('phase0.t_initial', 0.0)
     prob.set_val('phase0.t_duration', 2)
-    prob.set_val('phase0.states:x', 0.0)
-    prob.set_val('phase0.states:y', 10.0)
-    prob.set_val('phase0.states:v', 1.0E-6)
+    prob.set_val('phase0.initial_states:x', 0.0)
+    prob.set_val('phase0.initial_states:y', 10.0)
+    prob.set_val('phase0.initial_states:v', 1.0E-6)
     prob.set_val('phase0.parameters:g', 1.0, units='m/s**2')
     prob.set_val('phase0.controls:theta', phase.interp('theta', ys=[0.01, 90]), units='deg')
 
diff --git a/dymos/examples/hull_problem/test/test_hull_problem.py b/dymos/examples/hull_problem/test/test_hull_problem.py
index a9734058..32e9b563 100644
--- a/dymos/examples/hull_problem/test/test_hull_problem.py
+++ b/dymos/examples/hull_problem/test/test_hull_problem.py
@@ -39,8 +39,12 @@ class TestHull(unittest.TestCase):
 
         p.setup(check=True)
 
-        p.set_val('traj.phase.states:x', phase0.interp('x', [1.5, 1]))
-        p.set_val('traj.phase.states:xL', phase0.interp('xL', [0, 1]))
+        if transcription is ExplicitShooting:
+            p.set_val('traj.phase.initial_states:x', 1.5)
+            p.set_val('traj.phase.initial_states:xL', 0.0)
+        else:
+            p.set_val('traj.phase.states:x', phase0.interp('x', [1.5, 1]))
+            p.set_val('traj.phase.states:xL', phase0.interp('xL', [0, 1]))
         p.set_val('traj.phase.t_initial', 0)
         p.set_val('traj.phase.t_duration', 10)
         p.set_val('traj.phase.controls:u', phase0.interp('u', [-7, -0.14]))
diff --git a/dymos/examples/robertson_problem/doc/test_doc_robertson_problem.py b/dymos/examples/robertson_problem/doc/test_doc_robertson_problem.py
index d253285b..dfb1aed8 100644
--- a/dymos/examples/robertson_problem/doc/test_doc_robertson_problem.py
+++ b/dymos/examples/robertson_problem/doc/test_doc_robertson_problem.py
@@ -7,7 +7,7 @@ from openmdao.utils.testing_utils import use_tempdirs
 from dymos.examples.robertson_problem.doc.robertson_ode import RobertsonODE
 
 
-# matplotlib.use('Agg')
+matplotlib.use('Agg')
 plt.style.use('ggplot')
 
 
@@ -53,9 +53,9 @@ class TestRobertsonProblemForDocs(unittest.TestCase):
         p['traj.phase0.t_initial'] = 0.0
         p['traj.phase0.t_duration'] = t_final
 
-        p.set_val('traj.phase0.states:x0', phase.interp('x0', ys=[1.0, 0.7]))
-        p.set_val('traj.phase0.states:y0', phase.interp('y0', ys=[0.0, 1e-5]))
-        p.set_val('traj.phase0.states:z0', phase.interp('z0', ys=[0.0, 0.3]))
+        p.set_val('traj.phase0.initial_states:x0', phase.interp('x0', ys=[1.0, 0.7]))
+        p.set_val('traj.phase0.initial_states:y0', phase.interp('y0', ys=[0.0, 1e-5]))
+        p.set_val('traj.phase0.initial_states:z0', phase.interp('z0', ys=[0.0, 0.3]))
 
         return p
 
diff --git a/dymos/phase/test/test_phase.py b/dymos/phase/test/test_phase.py
index 441b82b0..edcae62f 100644
--- a/dymos/phase/test/test_phase.py
+++ b/dymos/phase/test/test_phase.py
@@ -603,9 +603,14 @@ class TestPhaseBase(unittest.TestCase):
                 p['phase0.t_initial'] = 0.0
                 p['phase0.t_duration'] = 2.0
 
-                p['phase0.states:x'] = phase.interp('x', [0, 10])
-                p['phase0.states:y'] = phase.interp('y', [10, 5])
-                p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+                if txname == 'explicit-shooting':
+                    p['phase0.initial_states:x'] = 0
+                    p['phase0.initial_states:y'] = 10
+                    p['phase0.initial_states:v'] = 0
+                else:
+                    p['phase0.states:x'] = phase.interp('x', [0, 10])
+                    p['phase0.states:y'] = phase.interp('y', [10, 5])
+                    p['phase0.states:v'] = phase.interp('v', [0, 9.9])
                 p['phase0.controls:theta'] = phase.interp('theta', [5, 100])
                 p['phase0.parameters:g'] = 5
 
@@ -671,9 +676,14 @@ class TestPhaseBase(unittest.TestCase):
                 p['phase0.t_initial'] = 0.0
                 p['phase0.t_duration'] = 2.0
 
-                p['phase0.states:x'] = phase.interp('x', [0, 10])
-                p['phase0.states:y'] = phase.interp('y', [10, 5])
-                p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+                if txname == 'explicit-shooting':
+                    p['phase0.initial_states:x'] = 0
+                    p['phase0.initial_states:y'] = 10
+                    p['phase0.initial_states:v'] = 0
+                else:
+                    p['phase0.states:x'] = phase.interp('x', [0, 10])
+                    p['phase0.states:y'] = phase.interp('y', [10, 5])
+                    p['phase0.states:v'] = phase.interp('v', [0, 9.9])
                 p['phase0.controls:theta'] = phase.interp('theta', [5, 100])
                 p['phase0.parameters:g'] = 5
 
@@ -738,9 +748,14 @@ class TestPhaseBase(unittest.TestCase):
                 p['phase0.t_initial'] = 0.0
                 p['phase0.t_duration'] = 2.0
 
-                p['phase0.states:x'] = phase.interp('x', [0, 10])
-                p['phase0.states:y'] = phase.interp('y', [10, 5])
-                p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+                if txname == 'explicit-shooting':
+                    p['phase0.initial_states:x'] = 0
+                    p['phase0.initial_states:y'] = 10
+                    p['phase0.initial_states:v'] = 0
+                else:
+                    p['phase0.states:x'] = phase.interp('x', [0, 10])
+                    p['phase0.states:y'] = phase.interp('y', [10, 5])
+                    p['phase0.states:v'] = phase.interp('v', [0, 9.9])
                 p['phase0.controls:theta'] = phase.interp('theta', [5, 100])
                 p['phase0.parameters:g'] = 5
 
diff --git a/dymos/phase/test/test_time_targets.py b/dymos/phase/test/test_time_targets.py
index 1a405455..47e14469 100644
--- a/dymos/phase/test/test_time_targets.py
+++ b/dymos/phase/test/test_time_targets.py
@@ -106,7 +106,7 @@ class TestPhaseTimeTargets(unittest.TestCase):
 
         t = {'gauss-lobatto': dm.GaussLobatto(num_segments=num_seg, order=transcription_order),
              'radau-ps': dm.Radau(num_segments=num_seg, order=transcription_order),
-             'explicit-shooting': dm.ExplicitShooting(num_segments=num_seg, grid='radau-ps', num_steps_per_segment=10)}
+             'explicit-shooting': dm.ExplicitShooting(num_segments=num_seg, grid='radau-ps')}
 
         phase = dm.Phase(ode_class=_BrachistochroneTestODE, transcription=t[transcription])
 
@@ -141,9 +141,14 @@ class TestPhaseTimeTargets(unittest.TestCase):
         p['phase0.t_initial'] = 1.0
         p['phase0.t_duration'] = 5.0
 
-        p['phase0.states:x'] = phase.interp('x', [0, 10])
-        p['phase0.states:y'] = phase.interp('y', [10, 5])
-        p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+        if transcription == 'explicit-shooting':
+            p['phase0.initial_states:x'] = 0
+            p['phase0.initial_states:y'] = 10
+            p['phase0.initial_states:v'] = 0
+        else:
+            p['phase0.states:x'] = phase.interp('x', [0, 10])
+            p['phase0.states:y'] = phase.interp('y', [10, 5])
+            p['phase0.states:v'] = phase.interp('v', [0, 9.9])
         p['phase0.controls:theta'] = phase.interp('theta', [5, 100.5])
 
         return p
diff --git a/dymos/phase/test/test_timeseries.py b/dymos/phase/test/test_timeseries.py
index 3e3a8017..9fb30382 100644
--- a/dymos/phase/test/test_timeseries.py
+++ b/dymos/phase/test/test_timeseries.py
@@ -236,9 +236,9 @@ class TestTimeseriesOutput(unittest.TestCase):
         p['phase0.t_initial'] = 0.0
         p['phase0.t_duration'] = 2.0
 
-        p['phase0.states:x'] = phase.interp('x', [0, 10])
-        p['phase0.states:y'] = phase.interp('y', [10, 5])
-        p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+        p['phase0.initial_states:x'] = 0
+        p['phase0.initial_states:y'] = 10
+        p['phase0.initial_states:v'] = 0
         p['phase0.controls:theta'] = phase.interp('theta', [5, 100])
         p['phase0.parameters:g'] = 9.80665
 
@@ -447,9 +447,15 @@ class TestTimeseriesExprBrachistochrone(unittest.TestCase):
         p['phase0.t_initial'] = 0.0
         p['phase0.t_duration'] = 2.0
 
-        p['phase0.states:x'] = phase.interp('x', [0, 10])
-        p['phase0.states:y'] = phase.interp('y', [10, 5])
-        p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+        if isinstance(transcription, dm.ExplicitShooting):
+            p['phase0.initial_states:x'] = 0
+            p['phase0.initial_states:y'] = 10
+            p['phase0.initial_states:v'] = 0
+        else:
+            p['phase0.states:x'] = phase.interp('x', [0, 10])
+            p['phase0.states:y'] = phase.interp('y', [10, 5])
+            p['phase0.states:v'] = phase.interp('v', [0, 9.9])
+
         p[f'phase0.{control_name}'] = phase.interp('theta', [5, 100])
         p['phase0.parameters:g'] = 9.80665
         return p
diff --git a/dymos/test/test_check_partials.py b/dymos/test/test_check_partials.py
index 903bebb9..61b0c707 100644
--- a/dymos/test/test_check_partials.py
+++ b/dymos/test/test_check_partials.py
@@ -41,9 +41,9 @@ class TestCheckPartials(unittest.TestCase):
 
         prob.set_val('phase0.t_initial', 0.0)
         prob.set_val('phase0.t_duration', 2)
-        prob.set_val('phase0.states:x', 0.0)
-        prob.set_val('phase0.states:y', 10.0)
-        prob.set_val('phase0.states:v', 1.0E-6)
+        prob.set_val('phase0.initial_states:x', 0.0)
+        prob.set_val('phase0.initial_states:y', 10.0)
+        prob.set_val('phase0.initial_states:v', 1.0E-6)
         prob.set_val('phase0.parameters:g', 1.0, units='m/s**2')
         prob.set_val('phase0.controls:theta', phase.interp('theta', ys=[0.01, 90]),
                      units='deg')
diff --git a/dymos/transcriptions/explicit_shooting/test/test_explicit_shooting.py b/dymos/transcriptions/explicit_shooting/test/test_explicit_shooting.py
index 61104b0e..2504c781 100644
--- a/dymos/transcriptions/explicit_shooting/test/test_explicit_shooting.py
+++ b/dymos/transcriptions/explicit_shooting/test/test_explicit_shooting.py
@@ -106,7 +106,7 @@ class TestExplicitShooting(unittest.TestCase):
 
         prob.set_val('phase0.t_initial', 0.0)
         prob.set_val('phase0.t_duration', 1.0)
-        prob.set_val('phase0.states:y', 1.0)
+        prob.set_val('phase0.initial_states:y', 1.0)
 
         prob.run_model()
 
@@ -142,8 +142,8 @@ class TestExplicitShooting(unittest.TestCase):
 
         prob.set_val('phase0.t_initial', 0.0)
         prob.set_val('phase0.t_duration', 1.0)
-        prob.set_val('phase0.states:x', 0.5)
-        prob.set_val('phase0.states:y', 1.0)
+        prob.set_val('phase0.initial_states:x', 0.5)
+        prob.set_val('phase0.initial_states:y', 1.0)
         prob.set_val('phase0.parameters:p', 1)
 
         prob.run_model()
@@ -208,9 +208,9 @@ class TestExplicitShooting(unittest.TestCase):
 
                 prob.set_val('traj0.phase0.t_initial', 0.0)
                 prob.set_val('traj0.phase0.t_duration', 2)
-                prob.set_val('traj0.phase0.states:x', 0.0)
-                prob.set_val('traj0.phase0.states:y', 10.0)
-                prob.set_val('traj0.phase0.states:v', 1.0E-6)
+                prob.set_val('traj0.phase0.initial_states:x', 0.0)
+                prob.set_val('traj0.phase0.initial_states:y', 10.0)
+                prob.set_val('traj0.phase0.initial_states:v', 1.0E-6)
                 prob.set_val('traj0.phase0.parameters:g', 9.80665, units='m/s**2')
                 prob.set_val('traj0.phase0.controls:theta', phase.interp('theta', ys=[0.01, 50]), units='deg')
 
@@ -277,9 +277,9 @@ class TestExplicitShooting(unittest.TestCase):
 
                 prob.set_val('traj0.phase0.t_initial', 0.0)
                 prob.set_val('traj0.phase0.t_duration', 2)
-                prob.set_val('traj0.phase0.states:x', 0.0)
-                prob.set_val('traj0.phase0.states:y', 10.0)
-                prob.set_val('traj0.phase0.states:v', 1.0E-6)
+                prob.set_val('traj0.phase0.initial_states:x', 0.0)
+                prob.set_val('traj0.phase0.initial_states:y', 10.0)
+                prob.set_val('traj0.phase0.initial_states:v', 1.0E-6)
                 prob.set_val('traj0.phase0.controls:theta', phase.interp('theta', ys=[0.01, 90]), units='deg')
 
                 prob.run_driver()
@@ -353,9 +353,9 @@ class TestExplicitShooting(unittest.TestCase):
 
                         prob.set_val('traj0.phase0.t_initial', 0.0)
                         prob.set_val('traj0.phase0.t_duration', 2)
-                        prob.set_val('traj0.phase0.states:x', 0.0)
-                        prob.set_val('traj0.phase0.states:y', 10.0)
-                        prob.set_val('traj0.phase0.states:v', 1.0E-6)
+                        prob.set_val('traj0.phase0.initial_states:x', 0.0)
+                        prob.set_val('traj0.phase0.initial_states:y', 10.0)
+                        prob.set_val('traj0.phase0.initial_states:v', 1.0E-6)
                         prob.set_val('traj0.phase0.parameters:g', 9.80665, units='m/s**2')
                         prob.set_val('traj0.phase0.polynomial_controls:theta',
                                      phase.interp('theta', ys=[0.01, 50]), units='deg')
@@ -472,9 +472,9 @@ class TestExplicitShooting(unittest.TestCase):
 
             prob.set_val('phase0.t_initial', 0.0)
             prob.set_val('phase0.t_duration', 2)
-            prob.set_val('phase0.states:x', 0.0)
-            prob.set_val('phase0.states:y', 10.0)
-            prob.set_val('phase0.states:v', 1.0E-6)
+            prob.set_val('phase0.initial_states:x', 0.0)
+            prob.set_val('phase0.initial_states:y', 10.0)
+            prob.set_val('phase0.initial_states:v', 1.0E-6)
             prob.set_val('phase0.parameters:g', 1.0, units='m/s**2')
             prob.set_val('phase0.controls:theta', phase.interp('theta', ys=[0.01, 90]), units='deg')
 
@@ -632,9 +632,9 @@ class TestExplicitShooting(unittest.TestCase):
             # We use the phase.interpolate method to linearly interpolate values onto the state input nodes.
             # Since fix_initial=True for all states and fix_final=True for x and y, the initial or final
             # values of the interpolation provided here will not be changed by the optimizer.
-            p.set_val('traj.phase0.states:x', phase.interp('x', [0, 10]))
-            p.set_val('traj.phase0.states:y', phase.interp('y', [10, 5]))
-            p.set_val('traj.phase0.states:v', phase.interp('v', [0, 9.9]))
+            p.set_val('traj.phase0.initial_states:x', phase.interp('x', [0, 10]))
+            p.set_val('traj.phase0.initial_states:y', phase.interp('y', [10, 5]))
+            p.set_val('traj.phase0.initial_states:v', phase.interp('v', [0, 9.9]))
 
             # Guesses for controls are provided at all control_input node.
             # Here phase.interpolate is used to linearly interpolate values onto the control input nodes.