public override HiddenModel createModel(IEnumerable <BaseTrajectory> traces, StrokeMap strokeMap) { var strokes = traces.ToArray(); var symbolTraces = strokes.Select(s => strokeMap.getSymbolTrace(s)).ToArray(); var transitionDatas = strokeMap.Areas.Select((a, i) => transitionSetup.createTransitionDataToArea(i, "S" + strokeMap.ID + "_A" + (i + 1))).ToArray(); foreach (var symTrace in symbolTraces) { var prevT = symTrace[0].Time; for (int i = 1; i < symTrace.Length; i++) { var dT = (int)(symTrace[i].Time - prevT); prevT = symTrace[i].Time; transitionDatas[i - 1].addData(dT); } } var startState = new StartState(); State curState = startState; State nextState; foreach (var transData in transitionDatas) { nextState = new State(); var transition = transData.createTransition(nextState); curState.addTransition(transition); curState = nextState; } var model = new HiddenModel(startState, curState); return(model); }
public TrajectoryModel(CHnMMRecognitionSystem system, string name, IEnumerable <BaseTrajectory> trainingData) { recognitionSystem = system; Name = name; strokeMap = system.HiddenModelCreator.createStrokeMap(trainingData); model = system.HiddenModelCreator.createModel(trainingData, strokeMap); }
public override HiddenModel createModel(IEnumerable <BaseTrajectory> traces, StrokeMap strokeMap) { var strokes = traces.ToArray(); var symbolTraces = strokes.Select(s => strokeMap.getSymbolTrace(s)).ToArray(); var transitionDatas = strokeMap.Areas.Select((a, i) => transitionSetup.createTransitionDataToArea("S" + strokeMap.ID + "_A" + (i + 1))).ToArray(); ////number of areas -> transitiondata to endState //var endTransitions = new Dictionary<int,TransitionData>(15); var endTransitionData = transitionSetup.createTransitionDataToEnd(); foreach (var symTrace in symbolTraces) { var prevT = symTrace[0].Time; //GestureStart is dummy symbol marking the beginning for (int i = 1; i < symTrace.Length; i++) //go through all symbols of a trace (except GestureEnd) { var dT = (int)(symTrace[i].Time - prevT); prevT = symTrace[i].Time; if (i == symTrace.Length - 1) { endTransitionData.addData(dT); //TransitionData endTransition; //if(endTransitions.TryGetValue(i, out endTransition)) //{ // endTransition.addData(dT); //} //else //{ // Debug.Assert(symTrace[i].Symbol == "GestureEnd"); // endTransition = transitionSetup.createTransitionDataToEnd(); //use endtransition // endTransition.addData(dT); // endTransitions[i] = endTransition; //} } else { transitionDatas[i - 1].addData(dT); } } } //var endTransPositions = endTransitions.Select(e => e.Key).OrderBy(x => x).ToArray(); //Debug.Assert(endTransPositions.Last() - endTransPositions.First() == endTransitions.Count-1); var startState = new StartState(); var areaStates = new State[strokeMap.Areas.Length]; var endState = new State(); State curState = startState; State nextState; int curAreaState = 0; foreach (var transData in transitionDatas) { nextState = new State(); areaStates[curAreaState++] = nextState; var transition = transData.createTransition(nextState); curState.addTransition(transition); curState = nextState; } curState.addTransition(endTransitionData.createTransition(endState)); //add end transitions //foreach(var end in endTransitions) //{ // var prevAreaState = areaStates[end.Key - 2]; // prevAreaState.addTransition(end.Value.createTransition(endState)); //} var model = new HiddenModel(startState, endState); return(model); }