예제 #1
0
        public void ProjectGrammar(int[][] traces, LAPCFGrammar grammar)
        {
            int[] trace = traces [tag];

            for (int i = trace.Length - 1; i >= 0; --i) {
                pruned [i] = pruned [trace [i]];
            }

            subtagCount = grammar.subTagCounts [tag];
            alpha.Length = subtagCount;
            beta.Length = subtagCount;

            if (TYPE != VTYPE.TERMINAL) {
                for (int i = 0; i < subtagCount; ++i) {
                    _alpha [i] = double.NegativeInfinity;
                }
            } else {
                for (int i = 0; i < subtagCount; ++i) {
                    _alpha [i] = 0;
                }
            }

            for (int i = 0; i < beta.Length; ++i) {
                _beta [i] = double.NegativeInfinity;
            }

            foreach (var e in incomings) {
                switch (e.TYPE) {
                case ETYPE.BINARY:
                    e.binaryScores = grammar.GetRuleScores (e.to.tag, e.from0.tag, e.from1.tag, true);
                    break;
                case ETYPE.UNARY:
                    e.unaryScores = grammar.GetRuleScores (e.to.tag, e.from0.tag, true);
                    break;
                case ETYPE.TERMINAL:
                    e.terminalScores = grammar.GetTerminalRuleScores (e.to.tag, e.from0.tag, true);
                    break;
                case ETYPE.DUMMY:
                    break;
                default:
                    throw new Exception ("unrecognized edge type!");
                }
            }

            posteriorScore = double.NegativeInfinity;
        }