예제 #1
0
        public static Fst get(Fst fst)
        {
            if (fst.getSemiring() == null)
            {
                return(null);
            }
            Semiring semiring = fst.getSemiring();
            Fst      fst2     = new Fst(semiring);

            fst2.setIsyms(fst.getIsyms());
            fst2.setOsyms(fst.getOsyms());
            LinkedList linkedList = new LinkedList();
            HashMap    hashMap    = new HashMap();
            State      state      = new State(semiring.zero());
            string     text       = new StringBuilder().append("(").append(fst.getStart()).append(",").append(semiring.one()).append(")").toString();

            linkedList.add(new ArrayList());
            ((ArrayList)linkedList.peek()).add(new Pair(fst.getStart(), Float.valueOf(semiring.one())));
            fst2.addState(state);
            hashMap.put(text, state);
            fst2.setStart(state);
            while (!linkedList.isEmpty())
            {
                ArrayList arrayList    = (ArrayList)linkedList.remove();
                State     stateLabel   = Determinize.getStateLabel(arrayList, hashMap);
                ArrayList uniqueLabels = Determinize.getUniqueLabels(fst, arrayList);
                Iterator  iterator     = uniqueLabels.iterator();
                while (iterator.hasNext())
                {
                    int      num       = ((Integer)iterator.next()).intValue();
                    Float    @float    = Float.valueOf(semiring.zero());
                    Iterator iterator2 = arrayList.iterator();
                    while (iterator2.hasNext())
                    {
                        Pair  pair    = (Pair)iterator2.next();
                        State state2  = (State)pair.getLeft();
                        Float float2  = (Float)pair.getRight();
                        int   numArcs = state2.getNumArcs();
                        for (int i = 0; i < numArcs; i++)
                        {
                            Arc arc = state2.getArc(i);
                            if (num == arc.getIlabel())
                            {
                                @float = Float.valueOf(semiring.plus(@float.floatValue(), semiring.times(float2.floatValue(), arc.getWeight())));
                            }
                        }
                    }
                    ArrayList arrayList2 = new ArrayList();
                    Iterator  iterator3  = arrayList.iterator();
                    while (iterator3.hasNext())
                    {
                        Pair  pair2    = (Pair)iterator3.next();
                        State state3   = (State)pair2.getLeft();
                        Float float3   = (Float)pair2.getRight();
                        Float float4   = Float.valueOf(semiring.divide(semiring.one(), @float.floatValue()));
                        int   numArcs2 = state3.getNumArcs();
                        for (int j = 0; j < numArcs2; j++)
                        {
                            Arc arc2 = state3.getArc(j);
                            if (num == arc2.getIlabel())
                            {
                                State nextState = arc2.getNextState();
                                Pair  pair3     = Determinize.getPair(arrayList2, nextState, Float.valueOf(semiring.zero()));
                                pair3.setRight(Float.valueOf(semiring.plus(((Float)pair3.getRight()).floatValue(), semiring.times(float4.floatValue(), semiring.times(float3.floatValue(), arc2.getWeight())))));
                            }
                        }
                    }
                    string   text2     = "";
                    Iterator iterator4 = arrayList2.iterator();
                    while (iterator4.hasNext())
                    {
                        Pair  pair4  = (Pair)iterator4.next();
                        State state4 = (State)pair4.getLeft();
                        Float float4 = (Float)pair4.getRight();
                        if (!String.instancehelper_equals(text2, ""))
                        {
                            text2 = new StringBuilder().append(text2).append(",").toString();
                        }
                        text2 = new StringBuilder().append(text2).append("(").append(state4).append(",").append(float4).append(")").toString();
                    }
                    if (hashMap.get(text2) == null)
                    {
                        State state2 = new State(semiring.zero());
                        fst2.addState(state2);
                        hashMap.put(text2, state2);
                        Float    float2    = Float.valueOf(state2.getFinalWeight());
                        Iterator iterator5 = arrayList2.iterator();
                        while (iterator5.hasNext())
                        {
                            Pair pair5 = (Pair)iterator5.next();
                            float2 = Float.valueOf(semiring.plus(float2.floatValue(), semiring.times(((State)pair5.getLeft()).getFinalWeight(), ((Float)pair5.getRight()).floatValue())));
                        }
                        state2.setFinalWeight(float2.floatValue());
                        linkedList.add(arrayList2);
                    }
                    stateLabel.addArc(new Arc(num, num, @float.floatValue(), (State)hashMap.get(text2)));
                }
            }
            return(fst2);
        }
예제 #2
0
        public static Fst get(Fst fst, int n, bool determinize)
        {
            if (fst == null)
            {
                return(null);
            }
            if (fst.getSemiring() == null)
            {
                return(null);
            }
            Fst fst2 = fst;

            if (determinize)
            {
                fst2 = Determinize.get(fst);
            }
            Semiring semiring = fst2.getSemiring();
            Fst      fst3     = new Fst(semiring);

            fst3.setIsyms(fst2.getIsyms());
            fst3.setOsyms(fst2.getOsyms());
            float[] array = NShortestPaths.shortestDistance(fst2);
            ExtendFinal.apply(fst2);
            int[]         array2        = new int[fst2.getNumStates()];
            PriorityQueue priorityQueue = new PriorityQueue(10, new NShortestPaths_1(array, semiring));
            HashMap       hashMap       = new HashMap(fst.getNumStates());
            HashMap       hashMap2      = new HashMap(fst.getNumStates());
            State         start         = fst2.getStart();
            Pair          pair          = new Pair(start, Float.valueOf(semiring.one()));

            priorityQueue.add(pair);
            hashMap.put(pair, null);
            while (!priorityQueue.isEmpty())
            {
                Pair  pair2  = (Pair)priorityQueue.remove();
                State state  = (State)pair2.getLeft();
                Float @float = (Float)pair2.getRight();
                State state2 = new State(state.getFinalWeight());
                fst3.addState(state2);
                hashMap2.put(pair2, state2);
                if (hashMap.get(pair2) == null)
                {
                    fst3.setStart(state2);
                }
                else
                {
                    State state3 = (State)hashMap2.get(hashMap.get(pair2));
                    State state4 = (State)((Pair)hashMap.get(pair2)).getLeft();
                    for (int i = 0; i < state4.getNumArcs(); i++)
                    {
                        Arc arc = state4.getArc(i);
                        if (arc.getNextState().equals(state))
                        {
                            state3.addArc(new Arc(arc.getIlabel(), arc.getOlabel(), arc.getWeight(), state2));
                        }
                    }
                }
                Integer integer = Integer.valueOf(state.getId());
                int[]   array3  = array2;
                int     num     = integer.intValue();
                int[]   array4  = array3;
                array4[num]++;
                if (array2[integer.intValue()] == n && state.getFinalWeight() != semiring.zero())
                {
                    break;
                }
                if (array2[integer.intValue()] <= n)
                {
                    for (int j = 0; j < state.getNumArcs(); j++)
                    {
                        Arc   arc2  = state.getArc(j);
                        float num2  = semiring.times(@float.floatValue(), arc2.getWeight());
                        Pair  pair3 = new Pair(arc2.getNextState(), Float.valueOf(num2));
                        hashMap.put(pair3, pair2);
                        priorityQueue.add(pair3);
                    }
                }
            }
            return(fst3);
        }