(Knowledge Augmented) Decision Process -> (KA)DP¶

The key to orchestrating sequential decision-making – builds upon…
state: you design what (mutable) data is needed to represent progressUpon initialization the DP, you provide a function to supply its initial state
IOContainer: process access to non-state data/channels(i)nput: read-only structured data (typically from external sensors)(o)utput: channels for execution (typically a function to interact with external actuators)(e)lab: key/computed value pairs (typically combining aspects of state + input + arguments)(a)rgs: read-only key/value pairs to parameterize the process
phase: the DP continually executes a cycle (see figure above)Elaboration(implemented viaElaborator): compute value(s) based upon state and IOTermination(implemented viaTerminationCheck): detect state-based ending conditionsPropose(implemented viaActionFactory): indicate validAction(s)Rank(implemented viaActionEvaluator, which producesActionRank): use knowledge to evaluate candidate actionsApply(commonly performed via operators): execute the single selected action, typically to modify state and/or externally actuate
Tip
The string value (e.g., str(my_dp) of a DP tells you a LOT about this info).
A DP can run individual phase/cycle(s), but commonly until a termination condition is detected.
Once a DP has terminated, it must be reinitialized before future runs – this restarts the cycle, and also sets DP state to an initial value (via the supplied function).
Tip
It is not uncommon for the state initialization function to return a reference to a (mutable) object…
my_state = CustomStateClass()
my_dp = DecisionProcess(lambda: my_state)
The effect of this pattern is that DP state persists across DP reinit.
Typical DP Usage (e.g., isolated testing)¶
Design DP state (e.g., a custom class)
Instantiate a DP (with a function that supplies an initial state value)
Add components to the DP (e.g., operators, termination check)
Run (e.g., via
my_dp())Access DP state, possibly
reinit+ re-run