Source code for RCAIDE.Framework.Mission.Common.State
# RCAIDE/Framework/Analyses/Mission/Segments/Conditions/State.py
#
#
# Created: Jul 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# Imports
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
from RCAIDE.Framework.Core import DataOrdered
from .Conditions import Conditions
from .Unknowns import Unknowns
from .Residuals import Residuals
from .Numerics import Numerics
# python imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# State
# ----------------------------------------------------------------------------------------------------------------------
[docs]
class State(Conditions):
""" Creates the State data structure for storing daata that solved in a mission
Assumptions:
None
Source:
None
"""
def __defaults__(self):
""" This sets the default values.
Assumptions:
None
Source:
N/A
Inputs:
None
Outputs:
None
Properties Used:
None
"""
self.tag = 'state'
self.initials = Conditions()
self.numerics = Numerics()
self.unknowns = Unknowns()
self.conditions = Conditions()
self.residuals = Residuals()
[docs]
def expand_rows(self,rows,override=False):
""" Makes a 1-D array the right size. Often used after a mission is initialized to size out the vectors to the
right size. Will not overwrite an array if it already exists, unless override is True.
Assumptions:
Doesn't expand initials or numerics
Source:
N/A
Inputs:
rows [int]
Outputs:
None
Properties Used:
None
"""
# store
self._size = rows
for k,v in self.items():
try:
rank = v.ndim
except:
rank = 0
# don't expand initials or numerics
if k in ('initials','numerics'):
continue
# recursion
elif isinstance(v,Conditions):
v.expand_rows(rows,override=override)
# need arrays here
elif rank == 2:
self[k] = np.resize(v,[rows,v.shape[1]])
#: if type
#: for each key,value
# ----------------------------------------------------------------------------------------------------------------------
# Container
# ----------------------------------------------------------------------------------------------------------------------
[docs]
class Container(State):
def __defaults__(self):
""" This sets the default values.
Assumptions:
Puts the segments in the right order
Source:
N/A
Inputs:
None
Outputs:
None
Properties Used:
None
"""
self.segments = DataOrdered()
[docs]
def merged(self):
""" Combines the states of multiple segments
Assumptions:
None
Source:
N/A
Inputs:
None
Outputs:
state_out [State()]
Properties Used:
None
"""
state_out = State()
for i,(tag,sub_state) in enumerate(self.segments.items()):
for key in ['unknowns','conditions','residuals']:
if i == 0:
state_out[key].update(sub_state[key])
else:
state_out[key] = state_out[key].do_recursive(append_array,sub_state[key])
return state_out
State.Container = Container
# ----------------------------------------------------------------------------------------------------------------------
# append_array
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def append_array(A,B=None):
""" A stacking operation used by merged to put together data structures
Assumptions:
None
Source:
N/A
Inputs:
A [array]
B [array]
Outputs:
array
Properties Used:
None
"""
if isinstance(A,np.ndarray) and isinstance(B,np.ndarray):
return np.vstack([A,B])
else:
return None