public void TextP48()
        {
            var solver = new CharSetSolver(CharacterEncoding.Unicode);
            var alph   = new List <char> {
                'a', 'b'
            };
            var al = new HashSet <char>(alph);

            var moves = new List <Move <CharSet> >();

            var a = solver.MkCharConstraint(false, 'a');
            var b = solver.MkCharConstraint(false, 'b');

            moves.Add(new Move <CharSet>(0, 1, a));
            moves.Add(new Move <CharSet>(0, 4, b));
            moves.Add(new Move <CharSet>(1, 4, a));
            moves.Add(new Move <CharSet>(1, 2, b));
            moves.Add(new Move <CharSet>(2, 3, a));
            moves.Add(new Move <CharSet>(2, 3, b));
            moves.Add(new Move <CharSet>(3, 2, a));
            moves.Add(new Move <CharSet>(3, 2, b));
            moves.Add(new Move <CharSet>(4, 4, a));
            moves.Add(new Move <CharSet>(4, 4, b));

            var dfa = Automaton <CharSet> .Create(0, new int[] { 2 }, moves).Determinize(solver).Minimize(solver);

            var sb = new StringBuilder();

            DFAUtilities.printDFA(dfa, al, sb);
            System.Console.WriteLine(sb);
        }
        private static void GradeMetric(int probId, long timeout)
        {
            string      dir     = "C:/Users/Dileep/Desktop/Attempts/" + probId + "/";
            string      ansFile = "C:/Users/Dileep/Desktop/Answers/ans-" + probId + ".xml";
            List <char> alph    = new List <char> {
                'a', 'b'
            };
            HashSet <char> al          = new HashSet <char>(alph);
            CharSetSolver  solver      = new CharSetSolver(BitWidth.BV64);
            var            dfa_correct = DFAUtilities.parseDFAfromTutor(ansFile, solver);

            using (StreamReader reader = new StreamReader(dir + "clean.txt"))
                using (StreamWriter writer = new StreamWriter(dir + "Tool-Ind-" + probId + ".txt", false))
                {
                    string   id;
                    string[] file;
                    while ((id = reader.ReadLine()) != null)
                    {
                        //CharSetSolver solver = new CharSetSolver(BitWidth.BV64);
                        file = Directory.GetFiles(dir, id + ".xml", System.IO.SearchOption.AllDirectories);
                        Console.WriteLine(file[0]);
                        var dfa = DFAUtilities.parseDFAfromEvent(file[0], solver);
                        var g1  = Grading.GetGrade(dfa_correct.Second, dfa.Second, al, solver, timeout, 10, FeedbackLevel.Minimal, true, false, false);
                        var g2  = Grading.GetGrade(dfa_correct.Second, dfa.Second, al, solver, timeout, 10, FeedbackLevel.Minimal, false, false, true);
                        var g3  = Grading.GetGrade(dfa_correct.Second, dfa.Second, al, solver, timeout, 10, FeedbackLevel.Minimal, false, true, false);
                        Console.WriteLine("---- {0},{1},{2},{3}", id, g1.First, g2.First, g3.First);
                        writer.WriteLine("{0},{1},{2},{3}", id, g1.First, g2.First, g3.First);
                    }
                }
        }
        //create dotfiles for all attempts
        private static void CreateDotFiles(int probId)
        {
            string fromDir = "C:/Users/Dileep/Desktop/Attempts/" + probId + "/";
            string toDir   = "C:/Users/Dileep/Desktop/Graded/" + probId + "/";

            Directory.CreateDirectory(toDir);
            var    files = Directory.GetFiles(fromDir, "*.xml", System.IO.SearchOption.AllDirectories);
            string outputFile;

            foreach (string inputFile in files)
            {
                outputFile = toDir + Path.GetFileNameWithoutExtension(inputFile);
                var solver = new CharSetSolver(BitWidth.BV64);

                try
                {
                    var aut = DFAUtilities.parseDFAfromEvent(inputFile, solver);
                    solver.SaveAsDot(aut.Second, "second", outputFile);
                }
                catch (System.FormatException e)
                {
                    Console.WriteLine("EXCEPTION: {0}", e);
                    Console.WriteLine("Failed: {0}", Path.GetFileNameWithoutExtension(inputFile));
                }
            }
        }
        public XElement ComputeFeedbackRegexp(XElement regexCorrectDesc, XElement regexAttemptDesc, XElement alphabet, XElement feedbackLevel, XElement enabledFeedbacks, XElement maxGrade)
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);

            try
            {
                var dfaCorrectPair = DFAUtilities.parseRegexFromXML(regexCorrectDesc, alphabet, solver);
                var dfaAttemptPair = DFAUtilities.parseRegexFromXML(regexAttemptDesc, alphabet, solver);

                var level = (FeedbackLevel)Enum.Parse(typeof(FeedbackLevel), feedbackLevel.Value, true);

                var  enabList = (enabledFeedbacks.Value).Split(',').ToList <String>();
                bool dfaedit = false, moseledit = false, density = true;
                int  maxG = int.Parse(maxGrade.Value);

                var feedbackGrade = DFAGrading.GetGrade(dfaCorrectPair.Second, dfaAttemptPair.Second, dfaCorrectPair.First, solver, 1500, maxG, level, dfaedit, moseledit, density);

                var feedString = "<ul>";
                foreach (var feed in feedbackGrade.Second)
                {
                    feedString += string.Format("<li>{0}</li>", feed);
                }
                feedString += "</ul>";


                return(XElement.Parse(string.Format("<div><grade>{0}</grade><feedback>{1}</feedback></div>", feedbackGrade.First, feedString)));
            }
            catch (PDLException pdlex)
            {
                return(XElement.Parse(string.Format("<div>Error: {0} </div>", pdlex.Message)));
            }
        }
        //lookup clean.txt, random grade, print
        private static void RandomGrade(int probId)
        {
            string      dir     = "C:/Users/Dileep/Desktop/Attempts/" + probId + "/";
            string      ansFile = "C:/Users/Dileep/Desktop/Answers/ans-" + probId + ".xml";
            List <char> alph    = new List <char> {
                'a', 'b'
            };
            HashSet <char> al          = new HashSet <char>(alph);
            CharSetSolver  solver      = new CharSetSolver(BitWidth.BV64);
            var            dfa_correct = DFAUtilities.parseDFAfromTutor(ansFile, solver);

            RandomGen.SetSeedFromSystemTime();

            using (StreamReader reader = new StreamReader(dir + "clean.txt"))
                using (StreamWriter writer = new StreamWriter(dir + "Random-" + probId + ".txt"))
                {
                    string id;
                    while ((id = reader.ReadLine()) != null)
                    {
                        //CharSetSolver solver = new CharSetSolver(BitWidth.BV64);
                        //file = Directory.GetFiles(dir, id + ".xml", System.IO.SearchOption.AllDirectories);
                        //Console.WriteLine(file[0]);
                        //var dfa = DFAUtilities.parseDFAfromEvent(file[0], solver);
                        //var g = DFAGrading.GetGrade(dfa_correct.Second, dfa.Second, al, solver, timeout, 10);
                        var g = RandomGen.GetNormal(6.85, 3.00);
                        g = Math.Max(Math.Min(g, 10.00), 0.00);
                        g = Math.Round(g);
                        Console.WriteLine("---- {0},{1}", id, g);
                        writer.WriteLine("{0},{1}", id, g);
                    }
                }
        }
        public XElement ComputeFeedbackNFAXML(XElement nfaCorrectDesc, XElement nfaAttemptDesc, XElement maxGrade, XElement feedbackLevel, XElement enabledFeedbacks, XElement userId)
        {
            #region Check if item is in cache
            StringBuilder key = new StringBuilder();
            key.Append("feed");
            key.Append(nfaCorrectDesc.ToString());
            key.Append(nfaAttemptDesc.ToString());
            key.Append(feedbackLevel.ToString());
            key.Append(enabledFeedbacks.ToString());
            string keystr = key.ToString();

            var cachedValue = HttpContext.Current.Cache.Get(key.ToString());
            if (cachedValue != null)
            {
                HttpContext.Current.Cache.Remove(keystr);
                HttpContext.Current.Cache.Add(keystr, cachedValue, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30), System.Web.Caching.CacheItemPriority.Normal, null);
                return((XElement)cachedValue);
            }
            #endregion

            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);

            //Read input
            var nfaCorrectPair = DFAUtilities.parseNFAFromXML(nfaCorrectDesc, solver);
            var nfaAttemptPair = DFAUtilities.parseNFAFromXML(nfaAttemptDesc, solver);

            var level    = (FeedbackLevel)Enum.Parse(typeof(FeedbackLevel), feedbackLevel.Value, true);
            var enabList = (enabledFeedbacks.Value).Split(',').ToList <String>();

            var maxG = int.Parse(maxGrade.Value);

            //Use this for generating 2 classes of feedback for reyjkiavik study
            var studentIdModule = int.Parse(userId.Value) % 2;
            //if (studentIdModule == 0)
            //    level = FeedbackLevel.Minimal;
            //else
            //    level = FeedbackLevel.Hint;
            //Give hints to everyone
            level = FeedbackLevel.Hint;

            //Compute feedback
            var feedbackGrade = NFAGrading.GetGrade(nfaCorrectPair.Second, nfaAttemptPair.Second, nfaCorrectPair.First, solver, 1500, maxG, level);

            //Pretty print feedback
            var feedString = "<ul>";
            foreach (var feed in feedbackGrade.Second)
            {
                feedString += string.Format("<li>{0}</li>", feed);
            }
            feedString += "</ul>";

            var output = string.Format("<div><grade>{0}</grade><feedString>{1}</feedString></div>", feedbackGrade.First, feedString);

            XElement outXML = XElement.Parse(output);
            //Add this element to chace and return it
            HttpContext.Current.Cache.Add(key.ToString(), outXML, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30), System.Web.Caching.CacheItemPriority.Normal, null);

            return(outXML);
        }
예제 #7
0
        private static Pair <HashSet <char>, Automaton <BDD> > ReadDFA(string name, CharSetSolver solver)
        {
            System.IO.StreamReader file = new System.IO.StreamReader(@"../../../TestPDL/DFAs/" + name + ".txt");
            string res = file.ReadToEnd();

            file.Close();
            return(DFAUtilities.parseDFAFromString(res, solver));
        }
예제 #8
0
        private static void PrintDFA(Automaton <BDD> dfa, string name, HashSet <char> al)
        {
            var sb = new StringBuilder();

            DFAUtilities.printDFA(dfa, al, sb);

            System.IO.StreamWriter file = new System.IO.StreamWriter(@"../../../TestPDL/DFAs/" + name + ".txt");
            file.WriteLine(sb);
            file.Close();
        }
        public XElement ComputeFeedbackXML(XElement dfaCorrectDesc, XElement dfaAttemptDesc, XElement maxGrade, XElement feedbackLevel, XElement enabledFeedbacks)
        {
            #region Check if item is in cache
            StringBuilder key = new StringBuilder();
            key.Append("feed");
            key.Append(dfaCorrectDesc.ToString());
            key.Append(dfaAttemptDesc.ToString());
            key.Append(feedbackLevel.ToString());
            key.Append(enabledFeedbacks.ToString());
            string keystr = key.ToString();

            var cachedValue = HttpContext.Current.Cache.Get(key.ToString());
            if (cachedValue != null)
            {
                HttpContext.Current.Cache.Remove(keystr);
                HttpContext.Current.Cache.Add(keystr, cachedValue, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30), System.Web.Caching.CacheItemPriority.Normal, null);
                return((XElement)cachedValue);
            }
            #endregion

            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);

            //Read input
            var dfaCorrectPair = DFAUtilities.parseDFAFromXML(dfaCorrectDesc, solver);
            var dfaAttemptPair = DFAUtilities.parseDFAFromXML(dfaAttemptDesc, solver);

            var level    = (FeedbackLevel)Enum.Parse(typeof(FeedbackLevel), feedbackLevel.Value, true);
            var enabList = (enabledFeedbacks.Value).Split(',').ToList <String>();
            //bool dfaedit = enabList.Contains("dfaedit"), moseledit = enabList.Contains("moseledit"), density = enabList.Contains("density");
            bool dfaedit = true, moseledit = true, density = true;

            var maxG = int.Parse(maxGrade.Value);

            //Compute feedback
            var feedbackGrade = DFAGrading.GetGrade(dfaCorrectPair.Second, dfaAttemptPair.Second, dfaCorrectPair.First, solver, 1500, maxG, level, dfaedit, density, moseledit);

            //Pretty print feedback
            var feedString = "<ul>";
            foreach (var feed in feedbackGrade.Second)
            {
                feedString += string.Format("<li>{0}</li>", feed);
                break;
            }
            feedString += "</ul>";

            //var output = string.Format("<result><grade>{0}</grade><feedString>{1}</feedString></result>", feedbackGrade.First, feedString);
            var outXML = new XElement("result",
                                      new XElement("grade", feedbackGrade.First),
                                      new XElement("feedString", XElement.Parse(feedString)));
            //XElement outXML = XElement.Parse(output);
            //Add this element to chace and return it
            HttpContext.Current.Cache.Add(key.ToString(), outXML, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30), System.Web.Caching.CacheItemPriority.Normal, null);

            return(outXML);
        }
예제 #10
0
        //private static void Grade

        private static int GradeSingle(string file1, string file2)
        {
            List <char> alph = new List <char> {
                'a', 'b'
            };
            HashSet <char> al = new HashSet <char>(alph);
            CharSetSolver  solver = new CharSetSolver(BitWidth.BV64);
            var            aut1 = DFAUtilities.parseDFAfromTutor(file1, solver);
            var            aut2 = DFAUtilities.parseDFAfromEvent(file2, solver);
            var            dfa1 = aut1.Second; var dfa2 = aut2.Second;

            return(Grading.GetGrade(dfa1, dfa2, al, solver, 20000, 10).First);
        }
 public void ParseRegex()
 {
     try
     {
         CharSetSolver solver = new CharSetSolver(BitWidth.BV64);
         var           al     = new HashSet <char>(new char[] { 'a', 'b' });
         DFAUtilities.parseRegexFromXML(XElement.Parse("<reg>-?</reg>"), XElement.Parse("<alphabet><symbol>a</symbol><symbol>b</symbol></alphabet>"), solver);
     }
     catch (PDLException e)
     {
         Console.WriteLine(e.Message);
     }
 }
예제 #12
0
        //Cleaning Attempts of isomorphic consecutive submission
        //for each user if consecutively numbered mappedevents are IsEventEqual then keep a running max, when no next print
        private static int Clean()
        {
            // for each problem
            //  for each user
            //   look at file names in ascending int order
            //    (if the current != last ( save last) ) update last

            int count = 0;

            string dir = "C:/Users/Dileep/Desktop/Attempts";

            foreach (string p in Directory.GetDirectories(dir))
            {
                var cleanWriter = new StreamWriter(p + "/clean.txt", false);

                foreach (string u in Directory.GetDirectories(p))
                {
                    string[] att    = Directory.GetFiles(u);
                    int[]    attInt = att.Select(path => Convert.ToInt32(Path.GetFileNameWithoutExtension(path))).ToArray();
                    Array.Sort(attInt);
                    int?last = null;

                    foreach (int current in attInt)
                    {
                        if (last != null)
                        {
                            if (current == last + 1 && DFAUtilities.IsEventEqual(u + "/" + current + ".xml", u + "/" + last + ".xml"))
                            {
                                //dont save last
                            }
                            else
                            {
                                //save last
                                cleanWriter.WriteLine(last);
                                count++;
                            }
                        }
                        last = current;
                    }
                    if (last != null)
                    {
                        cleanWriter.WriteLine(last);
                        count++;
                    }
                }

                cleanWriter.Close();
            }

            return(count);
        }
        public XElement CheckRegexp(XElement regexDesc, XElement alphabet)
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);

            try
            {
                var dfaCorrectPair = DFAUtilities.parseRegexFromXML(regexDesc, alphabet, solver);
                return(XElement.Parse(string.Format("<div>CorrectRegex</div>")));
            }
            catch (PDLException pdlex)
            {
                return(XElement.Parse(string.Format("<div>Error: {0} </div>", pdlex.Message)));
            }
        }
        public XElement ComputeFeedbackNfaToDfa(XElement nfaCorrectDesc, XElement dfaAttemptDesc, XElement maxGrade)
        {
            #region Check if item is in cache
            StringBuilder key = new StringBuilder();
            key.Append("feedNFADFA");
            key.Append(nfaCorrectDesc.ToString());
            key.Append(dfaAttemptDesc.ToString());
            string keystr = key.ToString();

            var cachedValue = HttpContext.Current.Cache.Get(key.ToString());
            if (cachedValue != null)
            {
                HttpContext.Current.Cache.Remove(keystr);
                HttpContext.Current.Cache.Add(keystr, cachedValue, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30), System.Web.Caching.CacheItemPriority.Normal, null);
                return((XElement)cachedValue);
            }
            #endregion

            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);

            //Read input
            var nfaCorrectPair = DFAUtilities.parseNFAFromXML(nfaCorrectDesc, solver);
            var dfaCorrect     = nfaCorrectPair.Second.RemoveEpsilons(solver.MkOr).Determinize(solver).Minimize(solver);

            var dfaAttemptPair = DFAUtilities.parseDFAFromXML(dfaAttemptDesc, solver);

            var level = FeedbackLevel.Hint;

            var maxG = int.Parse(maxGrade.Value);

            //Compute feedback
            var feedbackGrade = DFAGrading.GetGrade(dfaCorrect, dfaAttemptPair.Second, nfaCorrectPair.First, solver, 1500, maxG, level);

            //Pretty print feedback
            var feedString = "<ul>";
            foreach (var feed in feedbackGrade.Second)
            {
                feedString += string.Format("<li>{0}</li>", feed);
            }
            feedString += "</ul>";

            var output = string.Format("<div><grade>{0}</grade><feedString>{1}</feedString></div>", feedbackGrade.First, feedString);

            XElement outXML = XElement.Parse(output);
            //Add this element to chace and return it
            HttpContext.Current.Cache.Add(key.ToString(), outXML, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30), System.Web.Caching.CacheItemPriority.Normal, null);

            return(outXML);
        }
예제 #15
0
        private static int GradeTest(int probId, long timeout)
        {
            string fromDir = "C:/Users/Dileep/Desktop/Attempts/" + probId + "/";
            string toDir   = "C:/Users/Dileep/Desktop/Graded/" + probId + "/";

            Directory.CreateDirectory(toDir);
            var    files = Directory.GetFiles(fromDir, "*.xml", System.IO.SearchOption.AllDirectories);
            string outputFile;
            string ansFile = "C:/Users/Dileep/Desktop/Answers/" + "ans-" + probId + ".xml";

            var solver = new CharSetSolver(BitWidth.BV64);
            var alph   = new List <char> {
                'a', 'b'
            };
            var al = new HashSet <char>(alph);

            var ans_aut     = DFAUtilities.parseDFAfromTutor(ansFile, solver);
            var dfa_correct = ans_aut.Second;

            TextWriter tmp = Console.Out;

            var count = 0;

            foreach (string inputFile in files)
            {
                outputFile = toDir + Path.GetFileNameWithoutExtension(inputFile) + "-grade.txt";

                var aut = DFAUtilities.parseDFAfromEvent(inputFile, solver);
                var dfa = aut.Second;

                //var writer = new StreamWriter(outputFile, false);
                //Console.SetOut(writer);
                var gradeFeedback = Grading.GetGrade(dfa_correct, dfa, al, solver, timeout, 10);
                var grade         = gradeFeedback.First;
                var feedback      = gradeFeedback.Second;
                if (grade < 10)
                {
                    count++;
                }
                Console.WriteLine("Wrong: #{0}", count);

                //writer.Close();
            }

            return(count);

            //Console.SetOut(tmp);
        }
예제 #16
0
        public void DileepTest3()
        {
            //XElement dfaCorrectDesc = XElement.Parse("<automaton xmlns=\"http://automatagrader.com/\">        <alphabet type=\"basic\">      <symbol>a</symbol><symbol>b</symbol>      </alphabet>        <stateSet>          <state sid=\"0\"><label>0</label></state><state sid=\"1\"><label>1</label></state>        </stateSet>        <transitionSet>          <transition tid=\"0\">                          <from>0</from>                          <to>0</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"1\">                          <from>0</from>                          <to>1</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"2\">                          <from>1</from>                          <to>1</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"3\">                          <from>1</from>                          <to>0</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition>        </transitionSet>        <acceptingSet>          <state sid=\"1\"></state>        </acceptingSet>        <initState>          <state sid=\"0\"></state>        </initState>      </automaton>");
            XElement dfaCorrectDesc   = XElement.Parse("<automaton xmlns=\"http://automatagrader.com/\">        <alphabet type=\"basic\">      <symbol>a</symbol><symbol>b</symbol>      </alphabet>        <stateSet>          <state sid=\"0\"><label>0</label></state><state sid=\"1\"><label>1</label></state><state sid=\"2\"><label>2</label></state><state sid=\"3\"><label>3</label></state><state sid=\"4\"><label>4</label></state><state sid=\"5\"><label>5</label></state><state sid=\"6\"><label>6</label></state>        </stateSet>        <transitionSet>          <transition tid=\"0\">                          <from>0</from>                          <to>0</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"1\">                          <from>0</from>                          <to>1</to>                          <read>a</read>                          <edgeDistance>0</edgeDistance>                        </transition><transition tid=\"2\">                          <from>1</from>                          <to>1</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"3\">                          <from>1</from>                          <to>2</to>                          <read>b</read>                          <edgeDistance>0</edgeDistance>                        </transition><transition tid=\"4\">                          <from>2</from>                          <to>2</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"5\">                          <from>2</from>                          <to>3</to>                          <read>a</read>                          <edgeDistance>0</edgeDistance>                        </transition><transition tid=\"6\">                          <from>3</from>                          <to>3</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"7\">                          <from>3</from>                          <to>4</to>                          <read>b</read>                          <edgeDistance>0</edgeDistance>                        </transition><transition tid=\"8\">                          <from>4</from>                          <to>4</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"9\">                          <from>4</from>                          <to>5</to>                          <read>a</read>                          <edgeDistance>0</edgeDistance>                        </transition><transition tid=\"10\">                          <from>5</from>                          <to>5</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"11\">                          <from>5</from>                          <to>6</to>                          <read>b</read>                          <edgeDistance>0</edgeDistance>                        </transition><transition tid=\"12\">                          <from>6</from>                          <to>6</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"13\">                          <from>6</from>                          <to>6</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition>        </transitionSet>        <acceptingSet>          <state sid=\"4\"></state><state sid=\"5\"></state>        </acceptingSet>        <initState>          <state sid=\"0\"></state>        </initState>      </automaton>");
            XElement dfaAttemptDesc   = XElement.Parse("<automaton xmlns=\"http://automatagrader.com/\">        <alphabet type=\"basic\">      <symbol>a</symbol><symbol>b</symbol>      </alphabet>        <stateSet>          <state sid=\"0\"><label>0</label></state>        </stateSet>        <transitionSet>          <transition tid=\"0\">                          <from>0</from>                          <to>0</to>                          <read>a</read>                          <edgeDistance>30</edgeDistance>                        </transition><transition tid=\"1\">                          <from>0</from>                          <to>0</to>                          <read>b</read>                          <edgeDistance>30</edgeDistance>                        </transition>        </transitionSet>        <acceptingSet>                  </acceptingSet>        <initState>          <state sid=\"0\"></state>        </initState>      </automaton>");
            XElement feedbackLevel    = XElement.Parse("<level xmlns=\"http://automatagrader.com/\">smallhint</level>");
            XElement enabledFeedbacks = XElement.Parse("<metrics xmlns=\"http://automatagrader.com/\">dfaedit,moseledit,density</metrics>");

            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);

            //XElement dfaAttemptDesc = dfaAttemptHint.Element("Automaton");
            //FeedbackLevel level = (FeedbackLevel)Convert.ToInt32(dfaAttemptHint.Element("FeedbackLevel").Value);

            var dfaCorrectPair = DFAUtilities.parseDFAFromXML(dfaCorrectDesc, solver);

            Console.WriteLine(feedbackLevel);
            Console.WriteLine(enabledFeedbacks);

            var dfaAttemptPair = DFAUtilities.parseDFAFromXML(dfaAttemptDesc, solver);

            //var sb = new StringBuilder();


            var level = (FeedbackLevel)Enum.Parse(typeof(FeedbackLevel), feedbackLevel.Value, true);

            var enabList = (enabledFeedbacks.Value).Split(',').ToList <String>();

            bool dfaedit = enabList.Contains("dfaedit"), moseledit = enabList.Contains("moseledit"), density = enabList.Contains("density");



            var feedbackGrade = DFAGrading.GetGrade(dfaCorrectPair.Second, dfaAttemptPair.Second, dfaCorrectPair.First, solver, 2000, 10, level, dfaedit, moseledit, density);

            var feedString = "<ul>";

            foreach (var feed in feedbackGrade.Second)
            {
                feedString += string.Format("<li>{0}</li>", feed);
            }
            feedString += "</ul>";

            Console.WriteLine(string.Format("<div>Grade: {0} <br /> Feedback: {1}</div>", feedbackGrade.First, feedString));
        }
예제 #17
0
        private static void LazyGrade(int probId)
        {
            string      dir     = "C:/Users/Dileep/Desktop/Attempts/" + probId + "/";
            string      ansFile = "C:/Users/Dileep/Desktop/Answers/ans-" + probId + ".xml";
            List <char> alph    = new List <char> {
                'a', 'b'
            };
            HashSet <char> al          = new HashSet <char>(alph);
            CharSetSolver  solver      = new CharSetSolver(BitWidth.BV64);
            var            dfa_correct = DFAUtilities.parseDFAfromTutor(ansFile, solver);

            using (StreamReader reader = new StreamReader(dir + "clean.txt"))
                using (StreamWriter writer = new StreamWriter(dir + "Lazy-" + probId + ".txt", false))
                {
                    string   id;
                    string[] file;
                    int      g;
                    RandomGen.SetSeedFromSystemTime();
                    while ((id = reader.ReadLine()) != null)
                    {
                        //CharSetSolver solver = new CharSetSolver(BitWidth.BV64);
                        file = Directory.GetFiles(dir, id + ".xml", System.IO.SearchOption.AllDirectories);
                        Console.WriteLine(file[0]);
                        var dfa = DFAUtilities.parseDFAfromEvent(file[0], solver);
                        if (dfa_correct.Second.IsEquivalentWith(dfa.Second, solver))
                        {
                            g = (RandomGen.GetUniform() > 0.5 ? 10 : 9);
                        }
                        else
                        {
                            g = (int)Math.Max(Math.Min(8.0 - Math.Abs(dfa_correct.Second.StateCount - dfa.Second.StateCount) * 2.0 + RandomGen.GetNormal(0, 2), 10.0), 0.0);
                        }
                        //var g = DFAGrading.GetGrade(dfa_correct.Second, dfa.Second, al, solver, timeout, 10);
                        Console.WriteLine("---- {0},{1}", id, g);
                        writer.WriteLine("{0},{1}", id, g);
                    }
                }
        }
예제 #18
0
        private IEnumerable <Automaton <BDD> > readDFAs(CharSetSolver solver)
        {
            int      c          = 0;
            XElement autcontent = null;

            using (XmlReader reader = XmlReader.Create("C:/temp/feedback/group2hints-formatted.xml"))
            {
                reader.MoveToContent();
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == "automaton")
                    {
                        autcontent = XElement.ReadFrom(reader) as XElement;
                        String line = autcontent.ToString();
                        c++;
                        //if (c > 10000000)
                        //    yield break;
                        yield return(DFAUtilities.parseForTest(line, solver));
                    }
                }
            }
        }
        private List <Pair <int, Pair <PDLPred, long> > > SynthTimer(PDLPred phi, HashSet <char> al, StringBuilder sb)
        {
            PDLEnumerator pdlEnumerator = new PDLEnumerator();
            var           solver        = new CharSetSolver(BitWidth.BV64);
            Stopwatch     sw            = new Stopwatch();
            var           dfa           = DFAUtilities.normalizeDFA(phi.GetDFA(al, solver)).First;

            List <Pair <int, Pair <PDLPred, long> > > predList = new List <Pair <int, Pair <PDLPred, long> > >();
            List <PDLPred> phiList = new List <PDLPred>();

            PDLPred v;
            var     func = new Func <PDLPred>(() =>
            {
                foreach (var state in dfa.States)
                {
                    var dfaSt = Automaton <BDD> .Create(dfa.InitialState, new int[] { state }, dfa.GetMoves());
                    dfaSt     = dfaSt.Determinize(solver).Minimize(solver);
                    sw.Reset();
                    sw.Start();
                    foreach (var p in pdlEnumerator.SynthesizePDL(al, dfaSt, solver, new StringBuilder(), 3000))
                    {
                        sw.Stop();
                        predList.Add(new Pair <int, Pair <PDLPred, long> >(state, new Pair <PDLPred, long>(p, sw.ElapsedMilliseconds)));
                        break;
                    }
                }
                return(null);
            });


            var test = TryExecute(func, timeout, out v);

            sb.Append("Language: ");
            phi.ToString(sb);
            sb.AppendLine();
            //sb.AppendLine("States: "+dfa.StateCount);
            sb.AppendLine();
            sb.AppendLine("---------------------------");
            sb.AppendLine("STATE SUMMARY");
            sb.AppendLine("---------------------------");
            var coveredStates = new HashSet <int>();

            foreach (var pair in predList)
            {
                sb.AppendLine();
                coveredStates.Add(pair.First);
                sb.AppendLine("State " + pair.First + (((dfa.GetFinalStates()).Contains(pair.First))?(" is final"):("")));
                sb.AppendLine("Elapsed Time: " + pair.Second.Second + " ms");
                sb.AppendLine("Formula: ");
                pair.Second.First.ToString(sb);
                sb.AppendLine();
            }
            sb.AppendLine();
            foreach (var state in dfa.States)
            {
                if (!coveredStates.Contains(state))
                {
                    sb.AppendLine(string.Format("description for state {0} not found", state));
                }
            }
            return(predList);
        }
예제 #20
0
        //A test to see how many isomorphic solutions are graded differently by the same grader
        private static void IsoTest(int prob, string grader)
        {
            //get grader score, get DFA from XML for that id ,check if printDFA in Dictionary and add score to that list
            string dir     = "C:/Users/Dileep/Desktop/Attempts/" + prob + "/";
            var    ret     = new Dictionary <string, List <Pair <int, int> > >();
            var    score   = new Dictionary <int, int>();
            string outFile = dir + "Iso-" + grader + ".txt";

            List <char> alph = new List <char> {
                'a', 'b'
            };
            HashSet <char> al     = new HashSet <char>(alph);
            var            solver = new CharSetSolver(BitWidth.BV64);

            using (TextFieldParser parser = new TextFieldParser(dir + grader + "-" + prob + ".txt"))
            {
                parser.Delimiters = new string[] { "," };
                while (true)
                {
                    string[] parts = parser.ReadFields();
                    if (parts == null)
                    {
                        break;
                    }
                    score.Add(Convert.ToInt32(parts[0]), Convert.ToInt32(parts[1])); // has also unclean problems
                }
            }
            List <int> clean = new List <int>(); // will have ids of clean problems

            using (StreamReader reader = new StreamReader(dir + "/clean.txt"))
            {
                string line; int id;
                while ((line = reader.ReadLine()) != null)
                {
                    id = Convert.ToInt32(line);
                    clean.Add(id);
                }
            }
            // go through clean, put a list for printDFA if not present, put score in that list.
            string[] file;
            var      sb = new StringBuilder();
            int      ex = 0;
            string   dfaString;

            foreach (int i in clean)
            {
                file = Directory.GetFiles(dir, i + ".xml", System.IO.SearchOption.AllDirectories);
                try
                {
                    DFAUtilities.printDFA(DFAUtilities.parseDFAfromEvent(file[0], solver).Second, al, sb);
                    dfaString = sb.ToString();
                    if (!ret.ContainsKey(dfaString))
                    {
                        ret.Add(dfaString, new List <Pair <int, int> >());
                    }
                    ret[dfaString].Add(new Pair <int, int>(i, score[i]));
                }
                catch (Exception e)
                {
                    Console.WriteLine("EXCEPTION: " + e);
                    ex++;
                }
                sb.Clear();
            }
            using (var writer = new StreamWriter(outFile, false))
            {
                writer.WriteLine("# of string/list pairs: {0}", ret.Count);
                writer.WriteLine("# of exceptions: {0}", ex);
                Console.WriteLine("# of string/list pairs: {0}", ret.Count);
                Console.WriteLine("# of exceptions: {0}", ex);
                foreach (KeyValuePair <string, List <Pair <int, int> > > pair in ret)
                {
                    if (pair.Value.Count != 1)
                    {
                        foreach (Pair <int, int> p in pair.Value)
                        {
                            Console.Write("({0},{1})", p.First, p.Second);
                            writer.Write("({0},{1})", p.First, p.Second);
                        }
                        Console.WriteLine("");
                        writer.WriteLine("");
                    }
                }
            }
        }