package dmcore.agents.coreagents;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import utils.Const;
import utils.Utils;
import dmcore.agents.mytypedef.TFloorStatus;
import dmcore.agents.mytypedef.AgentFactory;
import android.util.Log;
//D: structure describing the state of the dialog manager at some point
class TDialogState {
TFloorStatus fsFloorStatus; // who has the floor?
String sFocusedAgentName; // the name of the focused agent
ArrayList<TExecutionStackItem> esExecutionStack =
new ArrayList<TExecutionStackItem>(); // the execution stack
TExpectationAgenda eaAgenda; // the expectation agenda
TSystemAction saSystemAction; // the current system action
String sInputLineConfiguration; // String representation of the input
// line config at this state (lm, etc)
int iTurnNumber; // the current turn number
int iEHIndex; // the execution history index matching
// this dialog state
String sStateName; // the name of the current dialog state
}
public class CStateManagerAgent extends CAgent implements AgentFactory{
// dialog state name definitions
public HashMap<String, String> s2sDialogStateNames = new HashMap<String, String>();
// private vector containing a history of the states that the DM went
// through
public ArrayList<TDialogState> vStateHistory = new ArrayList<TDialogState>();
// variable containing the state broadcast address
public String sStateBroadcastAddress;
//-----------------------------------------------------------------------------
// Constructors and Destructors
//-----------------------------------------------------------------------------
// D: Default constructor
public CStateManagerAgent(String sAName,String sAConfiguration,
String sAType){
super(sAName, sAConfiguration, sAType);
// nothing here
}
public CStateManagerAgent(String sAName,String sAConfiguration){
super(sAName,sAConfiguration);
this.sType = "CAgent:CStateManagerAgent";
}
public CStateManagerAgent() {
// TODO Auto-generated constructor stub
}
//-----------------------------------------------------------------------------
// Static function for dynamic agent creation
//-----------------------------------------------------------------------------
public CAgent AgentFactory(String sAName, String sAConfiguration) {
return new CStateManagerAgent(sAName, sAConfiguration);
}
//-----------------------------------------------------------------------------
// CAgent class overwritten methods
//-----------------------------------------------------------------------------
// D: the overwritten Reset method
public void Reset() {
vStateHistory.clear();
}
// D: Updates the state information
public void UpdateState() {
// log the activity
Log.d(Const.STATEMANAGER_STREAM_TAG, "Updating dialog state ...");
// first, if necessary, assemble the agenda of concept expectations
if (DMCore.pDMCore.bAgendaModifiedFlag) {
DMCore.pDMCore.assembleExpectationAgenda();
}
// construct the dialog state
TDialogState dsDialogState = new TDialogState();
dsDialogState.fsFloorStatus = DMCore.pDMCore.fsFloorStatus;
dsDialogState.sFocusedAgentName = DMCore.pDMCore.GetAgentInFocus().GetName();
dsDialogState.esExecutionStack =
(ArrayList<TExecutionStackItem>) DMCore.pDMCore.esExecutionStack.clone();
dsDialogState.eaAgenda = DMCore.pDMCore.eaAgenda;
dsDialogState.saSystemAction = DMCore.pDMCore.saSystemAction;
dsDialogState.iTurnNumber = DMCore.pDMCore.iTurnNumber;
dsDialogState.iEHIndex = DMCore.pDMCore.esExecutionStack.get(0).iEHIndex;
// compute the dialog state
dsDialogState.sStateName = "";
if(s2sDialogStateNames.isEmpty()) {
dsDialogState.sStateName = dsDialogState.sFocusedAgentName;
} else {
// go through the mapping and find something that matches the focus
Map.Entry<String,String> entry;
Iterator<Map.Entry<String,String>> iterator =
s2sDialogStateNames.entrySet().iterator();
while(iterator.hasNext()) {
entry = iterator.next();
if(dsDialogState.sFocusedAgentName.contains(entry.getKey())) {
dsDialogState.sStateName = entry.getValue();
break;
}
}
// if we couldn't find anything in the mapping, then set it to
// _unknown_
if(dsDialogState.sStateName.equals(""))
dsDialogState.sStateName = "_unknown_";
}
// adds the input line configuration as part of the state
HashMap<String,String> s2sInputLineConfiguration =
DMCore.pDMCore.GetAgentInFocus().GetInputLineConfiguration();
dsDialogState.sInputLineConfiguration =
Utils.S2SHashToString(s2sInputLineConfiguration);
// and push the state in history
vStateHistory.add(dsDialogState);
TDialogState ds = GetLastState();
// log the finish
int tmpsize = vStateHistory.size()-1;
Log.d(Const.STATEMANAGER_STREAM_TAG, "Dialog state update completed: "+
dsDialogState.sFocusedAgentName+" at "+tmpsize+
"(iEHIndex="+dsDialogState.iEHIndex+"):\n");
//GetStateAsString());
}
// D: Access the last state
public TDialogState GetLastState() {
return vStateHistory.get(vStateHistory.size()-1);
}
}
这段代码定义了一个名为 CStateManagerAgent
的类,它是对话管理系统中的状态管理代理。
该类继承自 CAgent
类,并实现了 AgentFactory
接口。
主要功能是管理对话的状态历史
,包括记录对话的不同阶段的状态信息,并提供更新状态和获取最新状态的方法。
下面是这段代码的主要功能和作用的总结:
-
状态管理:
- 状态定义:通过
TDialogState
类定义了对话状态的基本结构,- 包括
- 地板状态 (
fsFloorStatus
)、 - 焦点代理名称 (
sFocusedAgentName
)、 - 执行栈 (
esExecutionStack
)、 - 期望议程 (
eaAgenda
)、 - 系统动作 (
saSystemAction
)、 - 输入线配置 (
sInputLineConfiguration
)、 - 轮次编号 (
iTurnNumber
)、 - 执行历史索引 (
iEHIndex
) - 和状态名称 (
sStateName
)。
- 地板状态 (
- 包括
- 状态定义:通过
-
成员变量:
- 状态历史:使用
ArrayList<TDialogState>
类型的vStateHistory
来存储对话状态的历史记录。 - 状态广播地址:使用
String
类型的sStateBroadcastAddress
来存储状态广播的地址。 - 对话状态名称映射:使用
HashMap<String, String>
类型的s2sDialogStateNames
来存储对话状态名称的映射。
- 状态历史:使用
-
构造函数:
- 提供了多个构造函数,用于创建
CStateManagerAgent
的实例。
- 提供了多个构造函数,用于创建
-
重写方法:
Reset
:重写了CAgent
类中的Reset
方法,用于清空状态历史。UpdateState
:- 用于更新对话状态,
- 包括构造新的
TDialogState
对象, - 记录当前的地板状态、焦点代理、执行栈、期望议程、系统动作等信息,
- 并将新状态添加到历史记录中。
-
其他方法:
AgentFactory
:静态方法,用于动态创建CStateManagerAgent
的实例。GetLastState
:返回最新的对话状态。
主要功能:
- 状态记录:记录对话过程中的各种状态信息。
- 状态更新:通过
UpdateState
方法更新状态信息,并将其添加到历史记录中。 - 状态访问:提供方法来获取最新的对话状态。
使用场景:
- 对话管理:在需要跟踪对话流程的应用程序中,如智能客服系统、语音助手等,用来管理对话的不同阶段的状态。
示例:
假设在对话管理系统中,需要记录用户和系统的交互过程,并根据这些交互来调整系统的行为。
可以使用 CStateManagerAgent
类来记录每次交互的状态,
包括谁拥有发言权、当前关注的代理是谁、执行栈中的内容等,并在需要时通过 GetLastState
方法来获取当前的状态信息。
概括:
- 用途:管理对话管理系统的状态信息,包括记录和更新对话的不同阶段的状态。
- 实现:通过定义
TDialogState
类来描述对话状态,使用ArrayList<TDialogState>
来存储状态历史,并提供更新状态和获取最新状态的方法。 - 应用场景:在对话管理系统中用于跟踪和管理对话的不同阶段的状态信息。