public bool GetNextTran(StateNodeBase cur_node, int action, out StateNodeBase next_node) { //find transitions of _cur_node Dictionary <int, ST_CondSet> action_trans_map; bool suc = _tran_map.TryGetValue(cur_node, out action_trans_map); if (!suc) { LogManager.Warning("transgraph[{0}] : cur_node[{1}] has no transitions", _name, cur_node._name); next_node = null; return(false); } LogManager.Assert(action_trans_map != null, "GetNextTran Error111"); //find transition of (_cur_node, action) ST_CondSet cond_set; suc = action_trans_map.TryGetValue(action, out cond_set); if (!suc) { // my.warning("_cur_node[{0}]--action[{1}] has no transition", cur_node._name, action); next_node = null; return(false); } LogManager.Assert(cond_set != null, "GetNextTran Error222"); next_node = cond_set.GetResult(); return(next_node != null); }
public bool ConflictWith(StateTransition trans) { ST_Condition cond1 = _st_cond; ST_Condition cond2 = trans._st_cond; // 两个condition都不是fullpass,那么没有冲突的可能 bool atleast_1_fullpass = (cond1 == ST_Condition.FullPass || cond2 == ST_Condition.FullPass); List <StateNodeBase> from_list_1 = GetFromNodes(); List <StateNodeBase> from_list_2 = trans.GetFromNodes(); StateNodeBase to_1 = GetToNode(); StateNodeBase to_2 = trans.GetToNode(); int action_1 = _action; int action_2 = trans._action; // 两层循环判断冲突 foreach (var from_i in from_list_1) { foreach (var from_j in from_list_2) { if (from_i == from_j) { // action一样,并且两个condition中至少有一个fullpass if (action_1 == action_2 && atleast_1_fullpass) { LogManager.Warning("transition conflict, from[{0}] and action[{1}] to node[{2},{3}] duplicate!", from_i, action_1, to_1, to_2); return(true); } } } } return(false); }
//from + action是【因】 //to 是【果】 public ST_Single(StateNodeBase from_node, StateNodeBase to_node, int action, ST_Condition st_cond = null) { LogManager.Assert(from_node != null, "from node is null"); LogManager.Assert(to_node != null, "to node is null"); LogManager.Assert(action > 0, "action <= 0"); LogManager.Assert(!string.Equals(from_node._name, to_node._name), string.Format("same type of node: [{0}]", from_node._name)); _from_node = from_node; _to_node = to_node; _action = action; _st_cond = st_cond ?? ST_Condition.FullPass; }
public ST_Group(StateNodeGroup from_group, int action, StateNodeBase to_node) { LogManager.Assert(!StateNodeGroup.IsNullOrEmpty(from_group), "from node is null or empty"); LogManager.Assert(to_node != null, "to node is null"); LogManager.Assert(action > 0, "action <= 0"); LogManager.Assert(!string.Equals(from_group._name, to_node._name), string.Format("same type of node: [{0}]", from_group._name)); _from_group = from_group; _to_node = to_node; _action = action; foreach (var node in _from_group) { trans_list.Add(new ST_Single(node, _to_node, _action)); } _st_cond = ST_Condition.FullPass; }
public override void Destroy() { _from_group.Destroy(); _from_group = null; _to_node = null; }
public override void Destroy() { _from_node = null; _to_node = null; }