State graphs help us understand how a system moves from one situation to another. They show all possible steps and choices clearly.
State graphs and transitions in Agentic AI
class State: def __init__(self, name): self.name = name self.transitions = {} # Maps action to next State def add_transition(self, action, next_state): self.transitions[action] = next_state def next_state(self, action): return self.transitions.get(action, None) # Example usage: # state1 = State('Start') # state2 = State('Middle') # state1.add_transition('go', state2) # next = state1.next_state('go') # print(next.name) # Output: Middle
Each state has a name and a list of possible transitions.
Transitions connect one state to another based on an action or event.
empty_state = State('Empty') print(empty_state.transitions) # Output: {}
single_transition_state = State('Single') single_transition_state.add_transition('move', State('Next')) print(list(single_transition_state.transitions.keys())) # Output: ['move']
start = State('Start') middle = State('Middle') end = State('End') start.add_transition('go', middle) middle.add_transition('finish', end) print(start.next_state('go').name) # Output: Middle print(middle.next_state('finish').name) # Output: End
state = State('Loop') state.add_transition('repeat', state) print(state.next_state('repeat').name) # Output: Loop
This program creates a simple state graph with three states and transitions. It shows moving through states by actions.
class State: def __init__(self, name): self.name = name self.transitions = {} def add_transition(self, action, next_state): self.transitions[action] = next_state def next_state(self, action): return self.transitions.get(action, None) # Create states start_state = State('Start') middle_state = State('Middle') end_state = State('End') # Add transitions start_state.add_transition('go', middle_state) middle_state.add_transition('finish', end_state) middle_state.add_transition('repeat', middle_state) # loop # Print initial state print(f"Current state: {start_state.name}") # Move from start to middle current_state = start_state.next_state('go') print(f"After 'go' action, state: {current_state.name}") # Repeat in middle state current_state = current_state.next_state('repeat') print(f"After 'repeat' action, state: {current_state.name}") # Finish to end state current_state = current_state.next_state('finish') print(f"After 'finish' action, state: {current_state.name}")
Time complexity to find the next state is O(1) because transitions are stored in a dictionary.
Space complexity depends on the number of states and transitions stored.
A common mistake is forgetting to add transitions, which leads to None when moving states.
Use state graphs when you want to clearly map all possible moves and decisions in a system.
State graphs show how a system moves between different situations.
Each state has transitions triggered by actions or events.
They help plan and understand AI agent behavior step-by-step.
Practice
Solution
Step 1: Understand the purpose of state graphs
State graphs show different states (situations) and how an AI agent moves between them.Step 2: Compare options to this definition
Only The different situations an AI agent can be in and how it moves between them describes states and transitions; others talk about unrelated AI aspects.Final Answer:
The different situations an AI agent can be in and how it moves between them -> Option DQuick Check:
State graph = states + transitions [OK]
- Confusing state graphs with code syntax
- Thinking state graphs show hardware details
- Assuming state graphs show final model outputs
Solution
Step 1: Recall standard notation for transitions
Transitions are often shown asState1 --action--> State2.Step 2: Match options to this notation
S1 --a--> S2matches the standard arrow with action label; others use incorrect or unclear syntax.Final Answer:
S1 --a--> S2-> Option AQuick Check:
Transition notation = S1 --a--> S2 [OK]
- Using arrows without action labels
- Confusing syntax with programming code
- Ignoring the direction of the arrow
S1 --a--> S2S2 --b--> S3What is the final state after actions ['a', 'b'] starting from S1?
Solution
Step 1: Follow the first action 'a' from S1
Action 'a' moves from S1 to S2.Step 2: Follow the second action 'b' from S2
Action 'b' moves from S2 to S3.Final Answer:
S3 -> Option AQuick Check:
Actions 'a', 'b' lead S1 -> S2 -> S3 [OK]
- Stopping after first action
- Mixing up action order
- Assuming no transitions exist
transitions = { 'S1': {'a': 'S2'}, 'S2': {'b': 'S3'} }
current_state = 'S1'
actions = ['a', 'c']
for act in actions:
current_state = transitions[current_state][act]What error will occur when running this code?
Solution
Step 1: Check transitions for each action
From 'S1', action 'a' leads to 'S2'. Next action 'c' is not in transitions['S2'].Step 2: Identify error type
Accessing transitions['S2']['c'] causes a KeyError because 'c' key is missing.Final Answer:
KeyError because action 'c' is not valid from S2 -> Option CQuick Check:
Missing key in dict = KeyError [OK]
- Assuming all actions are valid
- Confusing KeyError with TypeError
- Ignoring dictionary key checks
S1 --a--> S2, S2 --b--> S3, and S3 --c--> S1.Which data structure best models these transitions for easy lookup and update?
Solution
Step 1: Understand the need for quick lookup by state and action
We want to find next state given current state and action quickly.Step 2: Evaluate data structures
A dictionary of dictionaries allows direct lookup: transitions[state][action] = next_state.Final Answer:
A dictionary where keys are states and values are dictionaries of actions to next states -> Option BQuick Check:
Nested dict = fast state-action lookup [OK]
- Using lists which are slower for lookups
- Ignoring the action in transitions
- Storing transitions as plain strings
Ready to prove it?
Pass the test and this pattern moves unknown
