Ejemplo n.º 1
0
    public double Satisfy (State s, Finally @finally)
    {
        // Search states such that enclosed in finally is true
        var validStates = States.Where (x => Satisfy(x, @finally.Enclosed) > 0);
        if (validStates.Contains (s)) 
            return 1;
        else if (validStates.Count () == 0)
            return 0;
        
        Console.WriteLine ("---------- [States satisfying enclosed]");
        Console.WriteLine (string.Join (", ", validStates.Select (x => x.Identifier)));
        Console.WriteLine ("----------");
        
        var smToValidStates = new MarkovChain ();
        foreach (var state in validStates) {
            DFS (validStates, smToValidStates);
        }
        
        Console.WriteLine ("---------- [States in S tilde]");
        Console.WriteLine (string.Join (", ", smToValidStates.States.Select (x => x.Identifier)));
        Console.WriteLine ("----------");
        
        var table = smToValidStates.BuildConversionTable ();
        var transitions = smToValidStates.GetTransitionMatrix(table);
        
        /*
            Console.WriteLine ("---------- [Conversion Table]");
            Console.WriteLine (string.Join ("\n", table.Select (x => x.Key + ":" + x.Value)));
            Console.WriteLine ("----------");

            Console.WriteLine ("---------- [Transitions]");
            Console.WriteLine (transitions);
            Console.WriteLine ("----------");
            */
        
        // Build the transition matrix for this sub state-machine
        
        var system = new DiagonalMatrix (transitions.RowCount, transitions.ColumnCount, 1)
            - transitions;
        
        /*
            Console.WriteLine ("---------- [System]");
            Console.WriteLine (system);
            Console.WriteLine ("----------");
            */
        
        var vector = new DenseVector (
            smToValidStates.States.Select (x => 
                                       Transitions.Where (y => y.From.Equals (x))
                                       .Where (y => validStates.Contains (y.To))
                                       .Select (y => y.Probability).Sum ()
                                       ).ToArray ()
            );
        /*
            Console.WriteLine ("---------- [Vector]");
            Console.WriteLine (vector);
            Console.WriteLine ("----------");
            */
        
        var result = system.LU ().Solve (vector);
        
        /*
            Console.WriteLine ("---------- [Result]");
            Console.WriteLine (result);
            Console.WriteLine ("----------");
            */
        
        return table.ContainsKey (s.Identifier) ? result[table[s.Identifier]] : 0;
    }