Exemplo n.º 1
0
        /*
         * /// (non-Javadoc)
         * ///
         * /// @see java.lang.Object#equals(java.lang.Object)
         */

        public override bool Equals(Object obj)
        {
            //Note: NOT performance critical
            if (this == obj)
            {
                return(true);
            }
            if (obj == null)
            {
                return(false);
            }
            if (GetType() != obj.GetType())
            {
                return(false);
            }
            var other = (Fst)obj;

            if (!Arrays.AreEqual(Isyms, other.Isyms))
            {
                return(false);
            }
            if (!Arrays.AreEqual(Osyms, other.Osyms))
            {
                return(false);
            }
            if (Start == null)
            {
                if (other.Start != null)
                {
                    return(false);
                }
            }
            else if (!Start.Equals(other.Start))
            {
                return(false);
            }
            if (_states == null)
            {
                if (other._states != null)
                {
                    return(false);
                }
            }
            else if (!Arrays.AreEqual(_states, other._states))
            {
                return(false);
            }
            if (Semiring == null)
            {
                if (other.Semiring != null)
                {
                    return(false);
                }
            }
            else if (!Semiring.Equals(other.Semiring))
            {
                return(false);
            }
            return(true);
        }
Exemplo n.º 2
0
        /**
         * /// Trims an Fst, removing states and arcs that are not on successful paths.
         * ///
         * /// @param fst the fst to trim
         */
        public static void Apply(Fst fst)
        {
            Semiring semiring = fst.Semiring;

            if (semiring == null)
            {
                Logger.LogInfo <Connect>("Fst has no semiring.");
                return;
            }

            HashSet <State> accessible   = new HashSet <State>();
            HashSet <State> coaccessible = new HashSet <State>();

            List <Arc>[] exploredArcs = new List <Arc> [fst.GetNumStates()];

            List <List <State> > paths = new List <List <State> >();

            paths.Add(new List <State>());

            DepthFirstSearch(fst, accessible, paths, exploredArcs, coaccessible);

            HashSet <State> toDelete = new HashSet <State>();

            for (int i = 0; i < fst.GetNumStates(); i++)
            {
                State s = fst.GetState(i);
                if (!(accessible.Contains(s) || coaccessible.Contains(s)))
                {
                    toDelete.Add(s);
                }
            }

            fst.DeleteStates(toDelete);
        }
Exemplo n.º 3
0
        /**
         * /// Computes the composition of two Fsts. The two Fsts are augmented in order
         * /// to avoid multiple epsilon paths in the resulting Fst
         * ///
         * /// @param fst1 the first Fst
         * /// @param fst2 the second Fst
         * /// @param semiring the semiring to use in the operation
         * /// @return the composed Fst
         */
        public static Fst Get(Fst fst1, Fst fst2, Semiring semiring)
        {
            if ((fst1 == null) || (fst2 == null))
            {
                return(null);
            }

            if (!Arrays.AreEqual(fst1.Osyms, fst2.Isyms))
            {
                // symboltables do not match
                return(null);
            }

            Fst filter = GetFilter(fst1.Osyms, semiring);

            Augment(1, fst1, semiring);
            Augment(0, fst2, semiring);

            Fst tmp = compose(fst1, filter, semiring, false);

            Fst res = compose(tmp, fst2, semiring, false);

            // Connect.apply(res);

            return(res);
        }
Exemplo n.º 4
0
        /**
         * /// Augments the labels of an Fst in order to use it for composition avoiding
         * /// multiple epsilon paths in the resulting Fst
         * ///
         * /// Augment can be applied to both {@link edu.cmu.sphinx.fst.Fst} and
         * /// {@link edu.cmu.sphinx.fst.ImmutableFst}, as immutable fsts hold an
         * /// additional null arc for that operation
         * ///
         * /// @param label constant denoting if the augment should take place on input
         * ///            or output labels For value equal to 0 augment will take place
         * ///            for input labels For value equal to 1 augment will take place
         * ///            for output labels
         * /// @param fst the fst to augment
         * /// @param semiring the semiring to use in the operation
         */
        public static void Augment(int label, Fst fst, Semiring semiring)
        {
            // label: 0->augment on ilabel
            // 1->augment on olabel

            String[] isyms = fst.Isyms;
            String[] osyms = fst.Osyms;

            int e1InputIndex = isyms == null ? 0 : isyms.Length;
            int e2InputIndex = isyms == null ? 1 : isyms.Length + 1;

            int e1OutputIndex = osyms == null ? 0 : osyms.Length;
            int e2OutputIndex = osyms == null ? 1 : osyms.Length + 1;

            int numStates = fst.GetNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State s = fst.GetState(i);
                // Immutable fsts hold an additional (null) arc for augmention
                int numArcs = (fst is ImmutableFst) ? s.GetNumArcs() - 1
                        : s.GetNumArcs();
                for (int j = 0; j < numArcs; j++)
                {
                    Arc a = s.GetArc(j);
                    if ((label == 1) && (a.Olabel == 0))
                    {
                        a.Olabel = e2OutputIndex;
                    }
                    else if ((label == 0) && (a.Ilabel == 0))
                    {
                        a.Ilabel = e1InputIndex;
                    }
                }
                if (label == 0)
                {
                    if (fst is ImmutableFst)
                    {
                        s.SetArc(numArcs, new Arc(e2InputIndex, 0, semiring.One,
                                                  s));
                    }
                    else
                    {
                        s.AddArc(new Arc(e2InputIndex, 0, semiring.One, s));
                    }
                }
                else if (label == 1)
                {
                    if (fst is ImmutableFst)
                    {
                        s.SetArc(numArcs, new Arc(0, e1OutputIndex, semiring.One,
                                                  s));
                    }
                    else
                    {
                        s.AddArc(new Arc(0, e1OutputIndex, semiring.One, s));
                    }
                }
            }
        }
Exemplo n.º 5
0
        public static void apply(Fst fst)
        {
            Semiring  semiring  = fst.getSemiring();
            ArrayList arrayList = new ArrayList();
            int       numStates = fst.getNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State state = fst.getState(i);
                if (state.getFinalWeight() != semiring.zero())
                {
                    arrayList.add(state);
                }
            }
            State state2 = new State(semiring.one());

            fst.addState(state2);
            Iterator iterator = arrayList.iterator();

            while (iterator.hasNext())
            {
                State state3 = (State)iterator.next();
                state3.addArc(new Arc(0, 0, state3.getFinalWeight(), state2));
                state3.setFinalWeight(semiring.zero());
            }
        }
Exemplo n.º 6
0
        /**
         * /// Extends an Fst to a single final state.
         * ///
         * /// It adds a new final state with a 0.0 (Semiring's 1) final wight and
         * /// connects the current final states to it using epsilon transitions with
         * /// weight equal to the original final state's weight.
         * ///
         * /// @param fst the Fst to extend
         */
        public static void Apply(Fst fst)
        {
            Semiring     semiring = fst.Semiring;
            List <State> fStates  = new List <State>();

            int numStates = fst.GetNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State s = fst.GetState(i);
                if (s.FinalWeight != semiring.Zero)
                {
                    fStates.Add(s);
                }
            }

            // Add a new single final
            State newFinal = new State(semiring.One);

            fst.AddState(newFinal);
            foreach (State s in fStates)
            {
                // add epsilon transition from the old final to the new one
                s.AddArc(new Arc(0, 0, s.FinalWeight, newFinal));
                // set old state's weight to zero
                s.FinalWeight = semiring.Zero;
            }
        }
Exemplo n.º 7
0
        private static void calcClosure(Fst fst, State state, HashMap[] array, Semiring semiring)
        {
            int numArcs = state.getNumArcs();

            for (int i = 0; i < numArcs; i++)
            {
                Arc arc = state.getArc(i);
                if (arc.getIlabel() == 0 && arc.getOlabel() == 0)
                {
                    if (array[arc.getNextState().getId()] == null)
                    {
                        RmEpsilon.calcClosure(fst, arc.getNextState(), array, semiring);
                    }
                    if (array[arc.getNextState().getId()] != null)
                    {
                        Iterator iterator = array[arc.getNextState().getId()].keySet().iterator();
                        while (iterator.hasNext())
                        {
                            State state2 = (State)iterator.next();
                            float num    = semiring.times(RmEpsilon.getPathWeight(arc.getNextState(), state2, array).floatValue(), arc.getWeight());
                            RmEpsilon.add(state, state2, num, array, semiring);
                        }
                    }
                    RmEpsilon.add(state, arc.getNextState(), arc.getWeight(), array, semiring);
                }
            }
        }
Exemplo n.º 8
0
        /**
         * /// Reverses an fst
         * ///
         * /// @param fst the fst to reverse
         * /// @return the reversed fst
         */
        public static Fst Get(Fst fst)
        {
            if (fst.Semiring == null)
            {
                return(null);
            }

            ExtendFinal.Apply(fst);

            Semiring semiring = fst.Semiring;

            Fst res = new Fst(fst.GetNumStates());

            res.Semiring = semiring;

            res.Isyms = fst.Osyms;
            res.Osyms = fst.Isyms;

            State[] stateMap  = new State[fst.GetNumStates()];
            int     numStates = fst.GetNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State _is = fst.GetState(i);
                State s   = new State(semiring.Zero);
                res.AddState(s);
                stateMap[_is.GetId()] = s;
                if (_is.FinalWeight != semiring.Zero)
                {
                    res.SetStart(s);
                }
            }

            stateMap[fst.Start.GetId()].FinalWeight = semiring.One;

            for (int i = 0; i < numStates; i++)
            {
                State olds    = fst.GetState(i);
                State news    = stateMap[olds.GetId()];
                int   numArcs = olds.GetNumArcs();
                for (int j = 0; j < numArcs; j++)
                {
                    Arc   olda = olds.GetArc(j);
                    State next = stateMap[olda.NextState.GetId()];
                    Arc   newa = new Arc(olda.Ilabel, olda.Olabel,
                                         semiring.Reverse(olda.Weight), news);
                    next.AddArc(newa);
                }
            }

            ExtendFinal.Undo(fst);
            return(res);
        }
Exemplo n.º 9
0
        /**
         * /// Get a filter to use for avoiding multiple epsilon paths in the resulting
         * /// Fst
         * ///
         * /// See: M. Mohri, "Weighted automata algorithms", Handbook of Weighted
         * /// Automata. Springer, pp. 213-250, 2009.
         * ///
         * /// @param syms the gilter's input/output symbols
         * /// @param semiring the semiring to use in the operation
         * /// @return the filter
         */
        public static Fst GetFilter(String[] syms, Semiring semiring)
        {
            Fst filter = new Fst(semiring);

            if (syms == null)
            {
                return(filter); //empty one
            }
            int e1Index = syms == null ? 0 : syms.Length;
            int e2Index = syms == null ? 1 : syms.Length + 1;

            filter.Isyms = syms;
            filter.Osyms = syms;

            // State 0
            State s0 = new State(syms.Length + 3);

            s0.FinalWeight = semiring.One;
            State s1 = new State(syms.Length);

            s1.FinalWeight = semiring.One;
            State s2 = new State(syms.Length);

            s2.FinalWeight = semiring.One;
            filter.AddState(s0);
            s0.AddArc(new Arc(e2Index, e1Index, semiring.One, s0));
            s0.AddArc(new Arc(e1Index, e1Index, semiring.One, s1));
            s0.AddArc(new Arc(e2Index, e2Index, semiring.One, s2));
            for (int i = 1; i < syms.Length; i++)
            {
                s0.AddArc(new Arc(i, i, semiring.One, s0));
            }
            filter.SetStart(s0);

            // State 1
            filter.AddState(s1);
            s1.AddArc(new Arc(e1Index, e1Index, semiring.One, s1));
            for (int i = 1; i < syms.Length; i++)
            {
                s1.AddArc(new Arc(i, i, semiring.One, s0));
            }

            // State 2
            filter.AddState(s2);
            s2.AddArc(new Arc(e2Index, e2Index, semiring.One, s2));
            for (int i = 1; i < syms.Length; i++)
            {
                s2.AddArc(new Arc(i, i, semiring.One, s0));
            }

            return(filter);
        }
Exemplo n.º 10
0
        public static void augment(int label, Fst fst, Semiring semiring)
        {
            string[] isyms     = fst.getIsyms();
            string[] osyms     = fst.getOsyms();
            int      ilabel    = isyms.Length;
            int      iLabel    = isyms.Length + 1;
            int      oLabel    = osyms.Length;
            int      olabel    = osyms.Length + 1;
            int      numStates = fst.getNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State state = fst.getState(i);
                int   num   = (!(fst is ImmutableFst)) ? state.getNumArcs() : (state.getNumArcs() - 1);
                for (int j = 0; j < num; j++)
                {
                    Arc arc = state.getArc(j);
                    if (label == 1 && arc.getOlabel() == 0)
                    {
                        arc.setOlabel(olabel);
                    }
                    else if (label == 0 && arc.getIlabel() == 0)
                    {
                        arc.setIlabel(ilabel);
                    }
                }
                if (label == 0)
                {
                    if (fst is ImmutableFst)
                    {
                        state.setArc(num, new Arc(iLabel, 0, semiring.one(), state));
                    }
                    else
                    {
                        state.addArc(new Arc(iLabel, 0, semiring.one(), state));
                    }
                }
                else if (label == 1)
                {
                    if (fst is ImmutableFst)
                    {
                        state.setArc(num, new Arc(0, oLabel, semiring.one(), state));
                    }
                    else
                    {
                        state.addArc(new Arc(0, oLabel, semiring.one(), state));
                    }
                }
            }
        }
Exemplo n.º 11
0
        /**
         * /// Deserializes an ImmutableFst from an ObjectInputStream
         * ///
         * /// @param in
         * ///            the ObjectInputStream. It should be already be initialized by
         * ///            the caller.
         * /// @return
         * /// @throws IOException
         * /// @throws ClassNotFoundException
         */
        private static ImmutableFst ReadImmutableFst(Stream inStream)
        {
            BinaryFormatter serializer = new BinaryFormatter();

            String[]     _is       = ReadStringMap(inStream);
            String[]     os        = ReadStringMap(inStream);
            int          startid   = (int)serializer.Deserialize(inStream);
            Semiring     semiring  = (Semiring)serializer.Deserialize(inStream);
            int          numStates = (int)serializer.Deserialize(inStream);
            ImmutableFst res       = new ImmutableFst(numStates);

            res.Isyms    = _is;
            res.Osyms    = os;
            res.Semiring = semiring;
            for (int i = 0; i < numStates; i++)
            {
                int            numArcs = (int)serializer.Deserialize(inStream);
                ImmutableState s       = new ImmutableState(numArcs + 1);
                float          f       = (float)serializer.Deserialize(inStream);
                if (f == res.Semiring.Zero)
                {
                    f = res.Semiring.Zero;
                }
                else if (f == res.Semiring.One)
                {
                    f = res.Semiring.One;
                }
                s.FinalWeight          = f;
                s.Id                   = (int)serializer.Deserialize(inStream);
                res._states[s.GetId()] = s;
            }
            res.SetStart(res._states[startid]);

            numStates = res._states.Length;
            for (int i = 0; i < numStates; i++)
            {
                ImmutableState s1 = res._states[i];
                for (int j = 0; j < s1.InitialNumArcs - 1; j++)
                {
                    Arc a = new Arc();
                    a.Ilabel    = (int)serializer.Deserialize(inStream);
                    a.Olabel    = (int)serializer.Deserialize(inStream);
                    a.Weight    = (float)serializer.Deserialize(inStream);
                    a.NextState = res._states[(int)serializer.Deserialize(inStream)];
                    s1.SetArc(j, a);
                }
            }

            return(res);
        }
Exemplo n.º 12
0
        private static Fst readFst(ObjectInputStream objectInputStream)
        {
            string[] array    = Fst.readStringMap(objectInputStream);
            string[] array2   = Fst.readStringMap(objectInputStream);
            int      num      = objectInputStream.readInt();
            Semiring semiring = (Semiring)objectInputStream.readObject();
            int      num2     = objectInputStream.readInt();
            Fst      fst      = new Fst(num2);

            fst.isyms    = array;
            fst.osyms    = array2;
            fst.semiring = semiring;
            for (int i = 0; i < num2; i++)
            {
                int   num3  = objectInputStream.readInt();
                State state = new State(num3 + 1);
                float num4  = objectInputStream.readFloat();
                if (num4 == fst.semiring.zero())
                {
                    num4 = fst.semiring.zero();
                }
                else if (num4 == fst.semiring.one())
                {
                    num4 = fst.semiring.one();
                }
                state.setFinalWeight(num4);
                state.id = objectInputStream.readInt();
                fst.states.add(state);
            }
            fst.setStart((State)fst.states.get(num));
            num2 = fst.getNumStates();
            for (int i = 0; i < num2; i++)
            {
                State state2 = fst.getState(i);
                for (int j = 0; j < state2.initialNumArcs - 1; j++)
                {
                    Arc arc = new Arc();
                    arc.setIlabel(objectInputStream.readInt());
                    arc.setOlabel(objectInputStream.readInt());
                    arc.setWeight(objectInputStream.readFloat());
                    arc.setNextState((State)fst.states.get(objectInputStream.readInt()));
                    state2.addArc(arc);
                }
            }
            return(fst);
        }
Exemplo n.º 13
0
        private static ImmutableFst readImmutableFst(ObjectInputStream objectInputStream)
        {
            string[]     isyms        = Fst.readStringMap(objectInputStream);
            string[]     osyms        = Fst.readStringMap(objectInputStream);
            int          num          = objectInputStream.readInt();
            Semiring     semiring     = (Semiring)objectInputStream.readObject();
            int          num2         = objectInputStream.readInt();
            ImmutableFst immutableFst = new ImmutableFst(num2);

            immutableFst.isyms    = isyms;
            immutableFst.osyms    = osyms;
            immutableFst.semiring = semiring;
            for (int i = 0; i < num2; i++)
            {
                int            num3           = objectInputStream.readInt();
                ImmutableState immutableState = new ImmutableState(num3 + 1);
                float          num4           = objectInputStream.readFloat();
                if (num4 == immutableFst.semiring.zero())
                {
                    num4 = immutableFst.semiring.zero();
                }
                else if (num4 == immutableFst.semiring.one())
                {
                    num4 = immutableFst.semiring.one();
                }
                immutableState.setFinalWeight(num4);
                immutableState.id = objectInputStream.readInt();
                immutableFst.states[immutableState.getId()] = immutableState;
            }
            immutableFst.setStart(immutableFst.states[num]);
            num2 = immutableFst.states.Length;
            for (int i = 0; i < num2; i++)
            {
                ImmutableState immutableState2 = immutableFst.states[i];
                for (int j = 0; j < immutableState2.initialNumArcs - 1; j++)
                {
                    Arc arc = new Arc();
                    arc.setIlabel(objectInputStream.readInt());
                    arc.setOlabel(objectInputStream.readInt());
                    arc.setWeight(objectInputStream.readFloat());
                    arc.setNextState(immutableFst.states[objectInputStream.readInt()]);
                    immutableState2.setArc(j, arc);
                }
            }
            return(immutableFst);
        }
Exemplo n.º 14
0
        public static Fst get(Fst fst1, Fst fst2, Semiring semiring)
        {
            if (fst1 == null || fst2 == null)
            {
                return(null);
            }
            if (!Arrays.equals(fst1.getOsyms(), fst2.getIsyms()))
            {
                return(null);
            }
            Fst filter = Compose.getFilter(fst1.getOsyms(), semiring);

            Compose.augment(1, fst1, semiring);
            Compose.augment(0, fst2, semiring);
            Fst fst3 = Compose.compose(fst1, filter, semiring, false);

            return(Compose.compose(fst3, fst2, semiring, false));
        }
Exemplo n.º 15
0
        public static Fst get(Fst fst)
        {
            if (fst.getSemiring() == null)
            {
                return(null);
            }
            ExtendFinal.apply(fst);
            Semiring semiring = fst.getSemiring();
            Fst      fst2     = new Fst(fst.getNumStates());

            fst2.setSemiring(semiring);
            fst2.setIsyms(fst.getOsyms());
            fst2.setOsyms(fst.getIsyms());
            State[] array     = new State[fst.getNumStates()];
            int     numStates = fst.getNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State state  = fst.getState(i);
                State state2 = new State(semiring.zero());
                fst2.addState(state2);
                array[state.getId()] = state2;
                if (state.getFinalWeight() != semiring.zero())
                {
                    fst2.setStart(state2);
                }
            }
            array[fst.getStart().getId()].setFinalWeight(semiring.one());
            for (int i = 0; i < numStates; i++)
            {
                State state   = fst.getState(i);
                State state2  = array[state.getId()];
                int   numArcs = state.getNumArcs();
                for (int j = 0; j < numArcs; j++)
                {
                    Arc   arc    = state.getArc(j);
                    State state3 = array[arc.getNextState().getId()];
                    Arc   arc2   = new Arc(arc.getIlabel(), arc.getOlabel(), semiring.reverse(arc.getWeight()), state2);
                    state3.addArc(arc2);
                }
            }
            ExtendFinal.undo(fst);
            return(fst2);
        }
Exemplo n.º 16
0
        public static float[] shortestDistance(Fst fst)
        {
            Fst fst2 = Reverse.get(fst);

            float[]  array    = new float[fst2.getNumStates()];
            float[]  array2   = new float[fst2.getNumStates()];
            Semiring semiring = fst2.getSemiring();

            Arrays.fill(array, semiring.zero());
            Arrays.fill(array2, semiring.zero());
            LinkedHashSet linkedHashSet = new LinkedHashSet();

            linkedHashSet.add(fst2.getStart());
            array[fst2.getStart().getId()]  = semiring.one();
            array2[fst2.getStart().getId()] = semiring.one();
            while (!linkedHashSet.isEmpty())
            {
                State state = (State)linkedHashSet.iterator().next();
                linkedHashSet.remove(state);
                float f = array2[state.getId()];
                array2[state.getId()] = semiring.zero();
                for (int i = 0; i < state.getNumArcs(); i++)
                {
                    Arc   arc       = state.getArc(i);
                    State nextState = arc.getNextState();
                    float num       = array[arc.getNextState().getId()];
                    float num2      = semiring.plus(num, semiring.times(f, arc.getWeight()));
                    if (num != num2)
                    {
                        array[arc.getNextState().getId()]  = num2;
                        array2[arc.getNextState().getId()] = semiring.plus(array2[arc.getNextState().getId()], semiring.times(f, arc.getWeight()));
                        if (!linkedHashSet.contains(nextState))
                        {
                            linkedHashSet.add(nextState);
                        }
                    }
                }
            }
            return(array);
        }
Exemplo n.º 17
0
        public static Fst getFilter(string[] syms, Semiring semiring)
        {
            Fst fst  = new Fst(semiring);
            int num  = syms.Length;
            int num2 = syms.Length + 1;

            fst.setIsyms(syms);
            fst.setOsyms(syms);
            State state = new State(syms.Length + 3);

            state.setFinalWeight(semiring.one());
            State state2 = new State(syms.Length);

            state2.setFinalWeight(semiring.one());
            State state3 = new State(syms.Length);

            state3.setFinalWeight(semiring.one());
            fst.addState(state);
            state.addArc(new Arc(num2, num, semiring.one(), state));
            state.addArc(new Arc(num, num, semiring.one(), state2));
            state.addArc(new Arc(num2, num2, semiring.one(), state3));
            for (int i = 1; i < syms.Length; i++)
            {
                state.addArc(new Arc(i, i, semiring.one(), state));
            }
            fst.setStart(state);
            fst.addState(state2);
            state2.addArc(new Arc(num, num, semiring.one(), state2));
            for (int i = 1; i < syms.Length; i++)
            {
                state2.addArc(new Arc(i, i, semiring.one(), state));
            }
            fst.addState(state3);
            state3.addArc(new Arc(num2, num2, semiring.one(), state3));
            for (int i = 1; i < syms.Length; i++)
            {
                state3.addArc(new Arc(i, i, semiring.one(), state));
            }
            return(fst);
        }
Exemplo n.º 18
0
        public virtual ArrayList phoneticize(ArrayList entry, int nbest)
        {
            Fst      fst      = this.entryToFSA(entry);
            Semiring semiring = fst.getSemiring();

            Compose.augment(1, fst, semiring);
            ArcSort.apply(fst, new OLabelCompare());
            Fst fst2 = Compose.compose(fst, this.epsilonFilter, semiring, true);

            ArcSort.apply(fst2, new OLabelCompare());
            fst2 = Compose.compose(fst2, this.g2pmodel, semiring, true);
            Project.apply(fst2, ProjectType.__OUTPUT);
            if (nbest == 1)
            {
                fst2 = NShortestPaths.get(fst2, 1, false);
            }
            else
            {
                fst2 = NShortestPaths.get(fst2, nbest * 10, false);
            }
            fst2 = RmEpsilon.get(fst2);
            return(this.findAllPaths(fst2, nbest, this.skipSeqs, this.tie));
        }
Exemplo n.º 19
0
        /**
         * /// Calculate the epsilon closure
         */
        private static void CalcClosure(Fst fst, State state, Dictionary <State, float>[] cl, Semiring semiring)
        {
            var s = state;

            float pathWeight;
            var   numArcs = s.GetNumArcs();

            for (var j = 0; j < numArcs; j++)
            {
                var a = s.GetArc(j);
                if ((a.Ilabel == 0) && (a.Olabel == 0))
                {
                    if (cl[a.NextState.GetId()] == null)
                    {
                        CalcClosure(fst, a.NextState, cl, semiring);
                    }
                    if (cl[a.NextState.GetId()] != null)
                    {
                        foreach (var pathFinalState in cl[a.NextState.GetId()].Keys)
                        {
                            pathWeight = semiring.Times(
                                GetPathWeight(a.NextState, pathFinalState,
                                              cl), a.Weight);
                            Add(state, pathFinalState, pathWeight, cl, semiring);
                        }
                    }
                    Add(state, a.NextState, a.Weight, cl, semiring);
                }
            }
        }
Exemplo n.º 20
0
        /**
         * /// Add a state in the epsilon closure
         */
        private static void Add(State fromState, State toState, float weight, Dictionary <State, float>[] cl, Semiring semiring)
        {
            var old = GetPathWeight(fromState, toState, cl);

            if (old == float.NaN)
            {
                Put(fromState, toState, weight, cl);
            }
            else
            {
                Put(fromState, toState, semiring.Plus(weight, old), cl);
            }
        }
Exemplo n.º 21
0
        /**
         * /// Determinizes an fst. The result will be an equivalent fst that has the
         * /// property that no state has two transitions with the same input label. For
         * /// this algorithm, epsilon transitions are treated as regular symbols.
         * ///
         * /// @param fst the fst to determinize
         * /// @return the determinized fst
         */
        public static Fst Get(Fst fst)
        {
            if (fst.Semiring == null)
            {
                // semiring not provided
                return(null);
            }

            // initialize the queue and new fst
            Semiring semiring = fst.Semiring;
            Fst      res      = new Fst(semiring);

            res.Isyms = fst.Isyms;
            res.Osyms = fst.Osyms;

            // stores the queue (item in index 0 is next)
            Queue <List <Pair <State, float> > > queue = new Queue <List <Pair <State, float> > >();

            Dictionary <String, State> stateMapper = new Dictionary <String, State>();

            State  s           = new State(semiring.Zero);
            string stateString = "(" + fst.Start + "," + semiring.One + ")";

            queue.Enqueue(new List <Pair <State, float> >());
            queue.Peek().Add(new Pair <State, float>(fst.Start, semiring.One));
            res.AddState(s);
            stateMapper.Add(stateString, s);
            res.SetStart(s);

            while (queue.Count != 0)
            {
                List <Pair <State, float> > p = queue.Dequeue();
                State pnew = GetStateLabel(p, stateMapper);
                //queueRemoveAt(0);
                List <int> labels = GetUniqueLabels(fst, p);
                foreach (int label in labels)
                {
                    float wnew = semiring.Zero;
                    // calc w'
                    foreach (Pair <State, float> ps in p)
                    {
                        State old     = ps.GetLeft();
                        float u       = ps.GetRight();
                        int   numArcs = old.GetNumArcs();
                        for (int j = 0; j < numArcs; j++)
                        {
                            Arc arc = old.GetArc(j);
                            if (label == arc.Ilabel)
                            {
                                wnew = semiring.Plus(wnew,
                                                     semiring.Times(u, arc.Weight));
                            }
                        }
                    }

                    // calc new states
                    // keep residual weights to variable forQueue
                    List <Pair <State, float> > forQueue = new List <Pair <State, float> >();
                    foreach (Pair <State, float> ps in p)
                    {
                        State old        = ps.GetLeft();
                        float u          = ps.GetRight();
                        float wnewRevert = semiring.Divide(semiring.One, wnew);
                        int   numArcs    = old.GetNumArcs();
                        for (int j = 0; j < numArcs; j++)
                        {
                            Arc arc = old.GetArc(j);
                            if (label == arc.Ilabel)
                            {
                                State oldstate           = arc.NextState;
                                Pair <State, float> pair = GetPair(forQueue,
                                                                   oldstate, semiring.Zero);
                                pair.SetRight(semiring.Plus(
                                                  pair.GetRight(),
                                                  semiring.Times(wnewRevert,
                                                                 semiring.Times(u, arc.Weight))));
                            }
                        }
                    }

                    // build new state's id and new elements for queue
                    string qnewid = "";
                    foreach (Pair <State, float> ps in forQueue)
                    {
                        State old  = ps.GetLeft();
                        float unew = ps.GetRight();
                        if (!qnewid.Equals(""))
                        {
                            qnewid = qnewid + ",";
                        }
                        qnewid = qnewid + "(" + old + "," + unew + ")";
                    }

                    if (stateMapper.Get(qnewid) == null)
                    {
                        State qnew = new State(semiring.Zero);
                        res.AddState(qnew);
                        stateMapper.Add(qnewid, qnew);
                        // update new state's weight
                        float fw = qnew.FinalWeight;
                        foreach (Pair <State, float> ps in forQueue)
                        {
                            fw = semiring.Plus(fw, semiring.Times(ps.GetLeft().FinalWeight, ps.GetRight()));
                        }
                        qnew.FinalWeight = fw;

                        queue.Enqueue(forQueue);
                    }
                    pnew.AddArc(new Arc(label, label, wnew, stateMapper[qnewid]));
                }
            }

            return(res);
        }
Exemplo n.º 22
0
 public Fst(Semiring s) : this()
 {
     this.semiring = s;
 }
Exemplo n.º 23
0
 public virtual void setSemiring(Semiring semiring)
 {
     this.semiring = semiring;
 }
Exemplo n.º 24
0
        public static Fst importFst(string basename, Semiring semiring)
        {
            Fst     fst     = new Fst(semiring);
            HashMap hashMap = Convert.importSymbols(new StringBuilder().append(basename).append(".input.syms").toString());

            if (hashMap == null)
            {
                hashMap = new HashMap();
                hashMap.put("<eps>", Integer.valueOf(0));
            }
            HashMap hashMap2 = Convert.importSymbols(new StringBuilder().append(basename).append(".output.syms").toString());

            if (hashMap2 == null)
            {
                hashMap2 = new HashMap();
                hashMap2.put("<eps>", Integer.valueOf(0));
            }
            HashMap         hashMap3        = Convert.importSymbols(new StringBuilder().append(basename).append(".states.syms").toString());
            FileInputStream fileInputStream = new FileInputStream(new StringBuilder().append(basename).append(".fst.txt").toString());
            DataInputStream dataInputStream = new DataInputStream(fileInputStream);
            BufferedReader  bufferedReader  = new BufferedReader(new InputStreamReader(dataInputStream, "UTF-8"));
            int             num             = 1;
            HashMap         hashMap4        = new HashMap();
            string          text;

            while ((text = bufferedReader.readLine()) != null)
            {
                string[] array = String.instancehelper_split(text, "\\t");
                Integer  integer;
                if (hashMap3 == null)
                {
                    integer = Integer.valueOf(Integer.parseInt(array[0]));
                }
                else
                {
                    integer = (Integer)hashMap3.get(array[0]);
                }
                State state = (State)hashMap4.get(integer);
                if (state == null)
                {
                    state = new State(semiring.zero());
                    fst.addState(state);
                    hashMap4.put(integer, state);
                }
                if (num != 0)
                {
                    num = 0;
                    fst.setStart(state);
                }
                if (array.Length > 2)
                {
                    Integer integer2;
                    if (hashMap3 == null)
                    {
                        integer2 = Integer.valueOf(Integer.parseInt(array[1]));
                    }
                    else
                    {
                        integer2 = (Integer)hashMap3.get(array[1]);
                    }
                    State state2 = (State)hashMap4.get(integer2);
                    if (state2 == null)
                    {
                        state2 = new State(semiring.zero());
                        fst.addState(state2);
                        hashMap4.put(integer2, state2);
                    }
                    if (hashMap.get(array[2]) == null)
                    {
                        hashMap.put(array[2], Integer.valueOf(hashMap.size()));
                    }
                    int iLabel = ((Integer)hashMap.get(array[2])).intValue();
                    if (hashMap2.get(array[3]) == null)
                    {
                        hashMap2.put(array[3], Integer.valueOf(hashMap2.size()));
                    }
                    int   oLabel = ((Integer)hashMap2.get(array[3])).intValue();
                    float weight;
                    if (array.Length > 4)
                    {
                        weight = Float.parseFloat(array[4]);
                    }
                    else
                    {
                        weight = 0f;
                    }
                    Arc arc = new Arc(iLabel, oLabel, weight, state2);
                    state.addArc(arc);
                }
                else if (array.Length > 1)
                {
                    float finalWeight = Float.parseFloat(array[1]);
                    state.setFinalWeight(finalWeight);
                }
                else
                {
                    state.setFinalWeight(0f);
                }
            }
            dataInputStream.close();
            fst.setIsyms(Utils.toStringArray(hashMap));
            fst.setOsyms(Utils.toStringArray(hashMap2));
            return(fst);
        }
Exemplo n.º 25
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);
        }
Exemplo n.º 26
0
 /**
  * /// Constructor specifying the fst's semiring
  * ///
  * /// @param s
  * ///            the fst's semiring
  */
 public Fst(Semiring s) : this()
 {
     Semiring = s;
 }
Exemplo n.º 27
0
        private ArrayList findAllPaths(Fst fst, int num, HashSet hashSet, string text)
        {
            Semiring   semiring   = fst.getSemiring();
            HashMap    hashMap    = new HashMap();
            HashMap    hashMap2   = new HashMap();
            LinkedList linkedList = new LinkedList();
            Path       path       = new Path(fst.getSemiring());

            path.setCost(semiring.one());
            hashMap2.put(fst.getStart(), path);
            linkedList.add(fst.getStart());
            string[] osyms = fst.getOsyms();
            while (!linkedList.isEmpty())
            {
                State state = (State)linkedList.remove();
                Path  path2 = (Path)hashMap2.get(state);
                if (state.getFinalWeight() != semiring.zero())
                {
                    string text2 = path2.getPath().toString();
                    if (hashMap.containsKey(text2))
                    {
                        Path path3 = (Path)hashMap.get(text2);
                        if (path3.getCost() > path2.getCost())
                        {
                            hashMap.put(text2, path2);
                        }
                    }
                    else
                    {
                        hashMap.put(text2, path2);
                    }
                }
                int i = state.getNumArcs();
                for (int j = 0; j < i; j++)
                {
                    Arc arc = state.getArc(j);
                    path = new Path(fst.getSemiring());
                    Path path4 = (Path)hashMap2.get(state);
                    path.setCost(path4.getCost());
                    path.setPath((ArrayList)path4.getPath().clone());
                    string text3 = osyms[arc.getOlabel()];
                    foreach (string text4 in String.instancehelper_split(text3, new StringBuilder().append("\\").append(text).toString()))
                    {
                        if (!hashSet.contains(text4))
                        {
                            path.getPath().add(text4);
                        }
                    }
                    path.setCost(semiring.times(path.getCost(), arc.getWeight()));
                    State nextState = arc.getNextState();
                    hashMap2.put(nextState, path);
                    if (!linkedList.contains(nextState))
                    {
                        linkedList.add(nextState);
                    }
                }
            }
            ArrayList arrayList = new ArrayList();
            Iterator  iterator  = hashMap.values().iterator();

            while (iterator.hasNext())
            {
                Path path5 = (Path)iterator.next();
                arrayList.add(path5);
            }
            Collections.sort(arrayList, new PathComparator());
            int num2 = arrayList.size();

            for (int i = num; i < num2; i++)
            {
                arrayList.remove(arrayList.size() - 1);
            }
            return(arrayList);
        }
Exemplo n.º 28
0
        public static Fst compose(Fst fst1, Fst fst2, Semiring semiring, bool sorted)
        {
            if (!Arrays.equals(fst1.getOsyms(), fst2.getIsyms()))
            {
                return(null);
            }
            Fst        fst3       = new Fst(semiring);
            HashMap    hashMap    = new HashMap();
            LinkedList linkedList = new LinkedList();
            State      state      = fst1.getStart();
            State      state2     = fst2.getStart();

            if (state == null || state2 == null)
            {
                java.lang.System.err.println("Cannot find initial state.");
                return(null);
            }
            Pair  pair   = new Pair(state, state2);
            State state3 = new State(semiring.times(state.getFinalWeight(), state2.getFinalWeight()));

            fst3.addState(state3);
            fst3.setStart(state3);
            hashMap.put(pair, state3);
            linkedList.add(pair);
            while (!linkedList.isEmpty())
            {
                pair   = (Pair)linkedList.remove();
                state  = (State)pair.getLeft();
                state2 = (State)pair.getRight();
                state3 = (State)hashMap.get(pair);
                int numArcs  = state.getNumArcs();
                int numArcs2 = state2.getNumArcs();
                for (int i = 0; i < numArcs; i++)
                {
                    Arc arc = state.getArc(i);
                    for (int j = 0; j < numArcs2; j++)
                    {
                        Arc arc2 = state2.getArc(j);
                        if (sorted && arc.getOlabel() < arc2.getIlabel())
                        {
                            break;
                        }
                        if (arc.getOlabel() == arc2.getIlabel())
                        {
                            State nextState  = arc.getNextState();
                            State nextState2 = arc2.getNextState();
                            Pair  pair2      = new Pair(nextState, nextState2);
                            State state4     = (State)hashMap.get(pair2);
                            if (state4 == null)
                            {
                                state4 = new State(semiring.times(nextState.getFinalWeight(), nextState2.getFinalWeight()));
                                fst3.addState(state4);
                                hashMap.put(pair2, state4);
                                linkedList.add(pair2);
                            }
                            Arc arc3 = new Arc(arc.getIlabel(), arc2.getOlabel(), semiring.times(arc.getWeight(), arc2.getWeight()), state4);
                            state3.addArc(arc3);
                        }
                    }
                }
            }
            fst3.setIsyms(fst1.getIsyms());
            fst3.setOsyms(fst2.getOsyms());
            return(fst3);
        }
Exemplo n.º 29
0
        public static Fst get(Fst fst)
        {
            if (fst == null)
            {
                return(null);
            }
            if (fst.getSemiring() == null)
            {
                return(null);
            }
            Semiring semiring = fst.getSemiring();
            Fst      fst2     = new Fst(semiring);

            HashMap[] array     = new HashMap[fst.getNumStates()];
            State[]   array2    = new State[fst.getNumStates()];
            State[]   array3    = new State[fst.getNumStates()];
            int       numStates = fst.getNumStates();

            for (int i = 0; i < numStates; i++)
            {
                State state  = fst.getState(i);
                State state2 = new State(state.getFinalWeight());
                fst2.addState(state2);
                array2[state.getId()]  = state2;
                array3[state2.getId()] = state;
                if (state2.getId() == fst.getStart().getId())
                {
                    fst2.setStart(state2);
                }
            }
            for (int i = 0; i < numStates; i++)
            {
                State state   = fst.getState(i);
                State state2  = array2[state.getId()];
                int   numArcs = state.getNumArcs();
                for (int j = 0; j < numArcs; j++)
                {
                    Arc arc = state.getArc(j);
                    if (arc.getIlabel() != 0 || arc.getOlabel() != 0)
                    {
                        state2.addArc(new Arc(arc.getIlabel(), arc.getOlabel(), arc.getWeight(), array2[arc.getNextState().getId()]));
                    }
                }
                if (array[state.getId()] == null)
                {
                    RmEpsilon.calcClosure(fst, state, array, semiring);
                }
            }
            numStates = fst2.getNumStates();
            for (int i = 0; i < numStates; i++)
            {
                State state  = fst2.getState(i);
                State state2 = array3[state.getId()];
                if (array[state2.getId()] != null)
                {
                    Iterator iterator = array[state2.getId()].keySet().iterator();
                    while (iterator.hasNext())
                    {
                        State state3 = (State)iterator.next();
                        State state4 = state3;
                        if (state4.getFinalWeight() != semiring.zero())
                        {
                            state.setFinalWeight(semiring.plus(state.getFinalWeight(), semiring.times(RmEpsilon.getPathWeight(state2, state4, array).floatValue(), state4.getFinalWeight())));
                        }
                        int numArcs2 = state4.getNumArcs();
                        for (int k = 0; k < numArcs2; k++)
                        {
                            Arc arc2 = state4.getArc(k);
                            if (arc2.getIlabel() != 0 || arc2.getOlabel() != 0)
                            {
                                Arc arc3 = new Arc(arc2.getIlabel(), arc2.getOlabel(), semiring.times(arc2.getWeight(), RmEpsilon.getPathWeight(state2, state4, array).floatValue()), array2[arc2.getNextState().getId()]);
                                state.addArc(arc3);
                            }
                        }
                    }
                }
            }
            fst2.setIsyms(fst.getIsyms());
            fst2.setOsyms(fst.getOsyms());
            Connect.apply(fst2);
            return(fst2);
        }
Exemplo n.º 30
0
        private static void add(State state, State state2, float num, HashMap[] array, Semiring semiring)
        {
            Float pathWeight = RmEpsilon.getPathWeight(state, state2, array);

            if (pathWeight == null)
            {
                RmEpsilon.put(state, state2, num, array);
            }
            else
            {
                RmEpsilon.put(state, state2, semiring.plus(num, pathWeight.floatValue()), array);
            }
        }