public TrajectoryModel(CHnMMClassificationSystem system, string name, IEnumerable <BaseTrajectory> trainingData) { recognitionSystem = system; Name = name; strokeMap = system.HiddenModelCreator.createStrokeMap(trainingData); model = system.HiddenModelCreator.createModel(trainingData, strokeMap); }
public override CHnMModel 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) { if (symTrace != null) { var has_empty = symTrace.Where(w => w == null).ToArray(); if (has_empty.Length == 0) { var symTrace_clean = symTrace.Where(w => w.Symbol != "GestureStart").ToArray(); var prevT = symTrace[0].Time; for (int i = 0; i < symTrace_clean.Length; i++) { var dT = (int)(symTrace_clean[i].Time - prevT); prevT = symTrace_clean[i].Time; transitionDatas[i].addData(dT);; } } else { //handle the empty datas here } } } var startState = new StartState(); State curState = startState; State nextState; int ai = 0; foreach (var transData in transitionDatas) { nextState = new State(); var transition = transData.createTransition(nextState, strokeMap.Areas[ai++]); curState.addTransition(transition); curState = nextState; } var model = new CHnMModel(startState, curState); return(model); }
public override CHnMModel 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, null); curState.addTransition(transition); curState = nextState; } curState.addTransition(endTransitionData.createTransition(endState, null)); //add end transitions //foreach(var end in endTransitions) //{ // var prevAreaState = areaStates[end.Key - 2]; // prevAreaState.addTransition(end.Value.createTransition(endState)); //} var model = new CHnMModel(startState, endState); return(model); }