static DisjunctiveExamplesSpec WitnessPositionPair(GrammarRule rule, int parameter, ExampleSpec spec)
 {
     var result = new Dictionary<State, IEnumerable<object>>();
     foreach (var example in spec.Examples)
     {
         State inputState = example.Key;
         var inp = (string)inputState[rule.Body[0]];
         var substring = (string)example.Value;
         var occurrences = new List<Tuple<int?, int?>>();
         for (int i = inp.IndexOf(substring); i >= 0; i = inp.IndexOf(substring, i + 1))
         {
             occurrences.Add(Tuple.Create((int?)i, (int?)i + substring.Length));
         }
         if (occurrences.Count == 0) return null;
         result[inputState] = occurrences;
     }
     return new DisjunctiveExamplesSpec(result);
 }
 public static DisjunctiveExamplesSpec WitnessPositionPair(GrammarRule rule, int parameter,
                                                           ExampleSpec spec)
 {
     var ppExamples = new Dictionary<State, IEnumerable<object>>();
     foreach (State input in spec.ProvidedInputs)
     {
         var v = (StringRegion) input[rule.Body[0]];
         var desiredOutput = (StringRegion) spec.Examples[input];
         var occurrences = new List<object>();
         for (int i = v.Value.IndexOf(desiredOutput.Value, StringComparison.Ordinal);
              i >= 0;
              i = v.Value.IndexOf(desiredOutput.Value, i + 1, StringComparison.Ordinal))
         {
             occurrences.Add(Tuple.Create(v.Start + (uint?) i, v.Start + (uint?) i + desiredOutput.Length));
         }
         ppExamples[input] = occurrences;
     }
     return DisjunctiveExamplesSpec.From(ppExamples);
 }
Exemple #3
0
 private static void TestFlashFillBenchmark(Grammar grammar, string benchmark, int exampleCount = 2)
 {
     string[] lines = File.ReadAllLines($"benchmarks/{benchmark}.tsv");
     Tuple<string, string>[] data = lines.Select(l =>
     {
         var parts = l.Split(new[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
         return Tuple.Create(parts[0], parts[1]);
     }).ToArray();
     var examples = data.Take(exampleCount)
                        .ToDictionary(t => State.Create(grammar.InputSymbol, StringRegion.Create(t.Item1)),
                                      t => (object) StringRegion.Create(t.Item2));
     var spec = new ExampleSpec(examples);
     ProgramNode program = Learn(grammar, spec);
     foreach (Tuple<string, string> row in data.Skip(exampleCount))
     {
         State input = State.Create(grammar.InputSymbol, StringRegion.Create(row.Item1));
         var output = (StringRegion) program.Invoke(input);
         WriteColored(ConsoleColor.DarkCyan, $"{row.Item1} => {output.Value}");
     }
 }
Exemple #4
0
    static void testSynthesis(Grammar grammar, Dictionary<State, object> examples)
    {
        var spec = new ExampleSpec(examples);
        var engine = new SynthesisEngine(grammar);
        ProgramSet learned = engine.LearnGrammar(spec);

        Console.WriteLine("Examples:");
        foreach (KeyValuePair<State, object> ex in examples)
            Console.WriteLine("(Input: " + ex.Key + ", Output: " + ex.Value + ")");

        Console.WriteLine("These are the programs that I learned");
        foreach (ProgramNode p in learned.RealizedPrograms)
        {
            Console.WriteLine(p);
            foreach (State inputExample in examples.Keys)
            {
                Console.WriteLine("Test: (Input: " + inputExample + ", Output: " + p.Invoke(inputExample) + ")");
            }
        }
        Console.WriteLine();

    }
        public void TestLearnDiv()
        {
            var grammar = DSLCompiler.LoadGrammarFromFile("../../../ProseDSLModels.grammar");

            printGrammar(grammar);
            SynthesisEngine prose = new SynthesisEngine(grammar.Value);

            double[] inp1 = new double[4] {
                10.9, 15.0, -14.5, 12.3
            };
            double[] out1 = new double[4] {
                2.725, 0.0, 0.0, 0.0
            };
            var input = State.Create(grammar.Value.InputSymbol, inp1);

            var examples = new Dictionary <State, object> {
                { input, out1 }
            };
            var spec       = new ExampleSpec(examples);
            var learnedSet = prose.LearnGrammar(spec);
            var output     = (double[])learnedSet.RealizedPrograms.First().Invoke(input);

            Assert.AreEqual(2.725, output[0], 0.001d);
        }
Exemple #6
0
        public void TestLearnSubstringPositiveAbsPos()
        {
            //parse grammar file
            var grammar = CompileGrammar();
            //configure the prose engine
            var prose = ConfigureSynthesis(grammar.Value);

            //create the example
            var input    = State.CreateForExecution(grammar.Value.InputSymbol, "19-Feb-1960");
            var examples = new Dictionary <State, object> {
                { input, "Feb" }
            };
            var spec = new ExampleSpec(examples);

            //learn the set of programs that satisfy the spec
            var learnedSet = prose.LearnGrammar(spec);

            //run the first synthesized program in the same input and check if
            //the output is correct
            var programs = learnedSet.RealizedPrograms;
            var output   = programs.First().Invoke(input) as string;

            Assert.AreEqual("Feb", output);
        }
Exemple #7
0
        public DisjunctiveExamplesSpec WitnessStartPosition(GrammarRule rule, ExampleSpec spec)
        {
            var result = new Dictionary <State, IEnumerable <object> >();

            foreach (KeyValuePair <State, object> example in spec.Examples)
            {
                State inputState  = example.Key;
                var   input       = inputState[rule.Body[0]] as string;
                var   output      = example.Value as string;
                var   occurrences = new List <int>();

                for (int i = input.IndexOf(output); i >= 0; i = input.IndexOf(output, i + 1))
                {
                    occurrences.Add(i);
                }

                if (occurrences.Count == 0)
                {
                    return(null);
                }
                result[inputState] = occurrences.Cast <object>();
            }
            return(new DisjunctiveExamplesSpec(result));
        }
Exemple #8
0
        public void TestLearnSubstringOneExample()
        {
            var grammar = CompileGrammar();
            var prose   = ConfigureSynthesis(grammar.Value);

            var input    = State.CreateForExecution(grammar.Value.InputSymbol, "Gustavo Soares");
            var examples = new Dictionary <State, object> {
                { input, "Soares" }
            };

            var spec = new ExampleSpec(examples);

            var scoreFeature = new RankingScore(grammar.Value);
            var topPrograms  = prose.LearnGrammarTopK(spec, scoreFeature, 1, null);
            var topProgram   = topPrograms.RealizedPrograms.First();
            var output       = topProgram.Invoke(input) as string;

            Assert.AreEqual("Soares", output);

            var input2  = State.CreateForExecution(grammar.Value.InputSymbol, "Sumit Gulwani");
            var output2 = topProgram.Invoke(input2) as string;

            Assert.AreEqual("Gulwani", output2);
        }
        public static ExampleSpec WitnessContextTemplate(GrammarRule rule, int parameter,
                                                         DisjunctiveExamplesSpec spec, ExampleSpec dSpec)
        {
            var result = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var outerSpec = spec.DisjunctiveExamples[input] as IEnumerable <Tuple <int, PythonNode> >;
                var d         = (int)dSpec.Examples[input];
                var deepSpec  = (int)dSpec.Examples[input];
                if (outerSpec != null)
                {
                    var node = outerSpec.Where(e => e.Item1 == d).First().Item2;
                    result[input] = new TreeTemplate(GetAncestor(node, d), node);
                }
                else
                {
                    return(null);
                }
            }
            return(new ExampleSpec(result));
        }
        internal DisjunctiveExamplesSpec WitnessSelectWithWhereCondition(GrammarRule rule, ExampleSpec spec)
        {
            var ppExamples = new Dictionary <State, IEnumerable <object> >();

            foreach (State input in spec.ProvidedInputs)
            {
                var        inputTable           = ((DataTable[])input[rule.Grammar.InputSymbol])[0];
                var        outputTable          = (DataTable)spec.Examples[input];
                var        allPossibleSolutions = new List <object>();
                var        selectQuery          = outputTable.PrimaryKey.Select(c => c.ColumnName).ToArray();
                var        completeRowsList     = new List <DataRow[]>();
                DataView   view            = new DataView(outputTable);
                List <int> outputCountList = new List <int>();
                DataTable  distinctValues  = view.ToTable(true, selectQuery);
                foreach (DataRow row in distinctValues.Rows)
                {
                    var query = string.Join(" AND ", selectQuery.Select(c => (inputTable.Columns[c].DataType == typeof(string))? $"{c}='{row[c]}'":$"{c}={row[c]}"));
                    completeRowsList.Add(inputTable.Select(query));
                    outputCountList.Add(outputTable.Select(query).Count());
                }
                var conditionTables = Utils.Utils.GetAllPossibleTables(completeRowsList, outputCountList, inputTable);
                allPossibleSolutions.AddRange(conditionTables);
                ppExamples[input] = allPossibleSolutions;
            }
            //Complete the rows
            return(DisjunctiveExamplesSpec.From(ppExamples));
        }
Exemple #11
0
        public static ExampleSpec WitnessK(GrammarRule rule, int parameter, ExampleSpec spec, ExampleSpec patternSpec)
        {
            var result = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var inp     = (PythonNode)input[rule.Body[0]];
                var pattern = patternSpec.Examples[input] as Pattern;
                var node    = spec.Examples[input] as PythonNode;
                if (pattern != null && node != null)
                {
                    var magicK = new MagicK(inp, node);
                    var k      = magicK.GetK(pattern);
                    result[input] = k;
                }
                else
                {
                    return(null);
                }
            }
            return(new ExampleSpec(result));
        }
Exemple #12
0
        public static ExampleSpec WitnessTemplateChildrenTail(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var outerSpec = spec.Examples[input] as List <PythonNode>;
                if (outerSpec == null || outerSpec.Count < 2)
                {
                    return(null);
                }
                var newList = new List <PythonNode>();
                newList.AddRange(outerSpec);
                newList.RemoveAt(0);
                result[input] = newList;
            }
            return(new ExampleSpec(result));
        }
Exemple #13
0
        public static ExampleSpec WitnessTemplateChild(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var children = spec.Examples[input] as List <PythonNode>;
                if (children == null || children.Count > 1)
                {
                    return(null);
                }
                if (children.Count.Equals(1))
                {
                    result[input] = children.First();
                }
            }
            return(new ExampleSpec(result));
        }
Exemple #14
0
        public static ExampleSpec WitnessPatternToken(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (State input in spec.ProvidedInputs)
            {
                var outerSpec = spec.Examples[input] as TreeTemplate;
                if (outerSpec == null)
                {
                    return(null);
                }
                var innerSpec = new List <PythonNode>();
                var pnode     = outerSpec.PythonNode;
                if (pnode.Children.Any())
                {
                    innerSpec.Add(pnode);
                }
                result[input] = innerSpec;
            }
            return(new ExampleSpec(result));
        }
        public static ExampleSpec WitnessStartPosition(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            //a result of a witness function is a refined example-based specication
            //Each example is a map from an input state (State) to an output value (object)
            var result = new Dictionary <State, object>();

            //iterate over the input-output examples for Substring operator and refine them to the pos operator
            foreach (var example in spec.Examples)
            {
                State inputState = example.Key;
                //Get the input string value from the input state.
                var input = inputState[rule.Body[0]] as string;
                //Get the output value
                var output         = example.Value as string;
                var refinedExample = input.IndexOf(output);
                result[inputState] = refinedExample;
            }
            return(new ExampleSpec(result));
        }
        public ExampleSpec WitnessMultiplyEndPosition(GrammarRule rule, ExampleSpec spec, ExampleSpec startSpec)
        {
            var result = new Dictionary <State, object>();

            foreach (KeyValuePair <State, object> example in spec.Examples)
            {
                State inputState = example.Key;
                var   input      = (Dictionary <uint?, uint?>)inputState[rule.Body[0]];
                var   output     = example.Value as uint?;
                var   start      = (uint?)startSpec.Examples[inputState];
                if (output % start == 0 && input.ContainsKey(output / start))
                {
                    result[inputState] = output / start;
                }
            }
            return(new ExampleSpec(result));
        }
        public DisjunctiveExamplesSpec WitnessMultiplyStartPosition(GrammarRule rule, ExampleSpec spec)
        {
            var result = new Dictionary <State, IEnumerable <object> >();

            foreach (KeyValuePair <State, object> example in spec.Examples)
            {
                State inputState  = example.Key;
                var   input       = (Dictionary <uint?, uint?>)inputState[rule.Body[0]];
                var   output      = example.Value as uint?;
                var   occurrences = new List <uint?>();
                foreach (uint?i in input.Keys)
                {
                    if (i < output)
                    {
                        occurrences.Add(i);
                    }
                }
                if (occurrences.Count == 0)
                {
                    return(null);
                }
                result[inputState] = occurrences.Cast <object>();
            }
            return(new DisjunctiveExamplesSpec(result));
        }
        private static void LearnFromNewExample()
        {
            Console.Out.Write("Provide a new input-output example all integers only (e.g., {[1, 2, 3, 4], 7}:"); //\"(Sumit Gulwani)\",\"Gulwani\"): ");
            try
            {
                string input = Console.ReadLine();
                if (input != null)
                {
                    int      startpos     = input.IndexOf("[");
                    int      endpos       = input.IndexOf("]");
                    int      final_endpos = input.IndexOf("}");
                    int      num_char_res = final_endpos - (endpos + 3);
                    int      des_result   = int.Parse(input.Substring(endpos + 3, num_char_res).ToString());
                    int      num_char     = endpos - startpos;
                    string   substr       = input.Substring(startpos + 1, num_char - 1);
                    char[]   separator    = { ',' };
                    string[] substrlist   = substr.Split(separator);
                    var      numbers      = new List <int>();

                    foreach (string x in substrlist)
                    {
                        string temp = x.Trim();
                        numbers.Add(int.Parse(temp));
                    }


                    if (input[0] != '{' || input[1] != '[')
                    {
                        throw new Exception(
                                  "Invalid example format. Please try again. Follow exact format, including presense/absence of whitespaces");
                    }

                    int[] inputExample  = numbers.ToArray();
                    int   outputExample = des_result;

                    State inputState = State.CreateForExecution(Grammar.InputSymbol, inputExample);
                    Examples.Add(inputState, outputExample);
                }
            }
            catch (Exception)
            {
                throw new Exception("Invalid example format. Please try again. Follow exact format, including presense/absence of whitespaces");
            }

            var spec = new ExampleSpec(Examples);

            Console.Out.WriteLine("Learning a program for examples:");
            foreach (KeyValuePair <State, object> example in Examples)
            {
                int[] temp = (int[])example.Key.Bindings.First().Value;
                Console.WriteLine("\"{0}\" -> \"{1}\"", example.Key.Bindings.First().Value, example.Value);
            }

            var        scoreFeature = new RankingScore(Grammar);
            ProgramSet topPrograms  = _prose.LearnGrammarTopK(spec, scoreFeature, 50, null);

            if (topPrograms.IsEmpty)
            {
                throw new Exception("No program was found for this specification.");
            }

            _topProgram = topPrograms.RealizedPrograms.First();
            Console.Out.WriteLine("Top 4 learned programs:");
            var counter = 1;

            foreach (ProgramNode program in topPrograms.RealizedPrograms)
            {
                if (counter > 50)
                {
                    break;
                }
                Console.Out.WriteLine("==========================");
                Console.Out.WriteLine("Program {0}: ", counter);
                Console.Out.WriteLine(program.PrintAST(ASTSerializationFormat.HumanReadable));
                counter++;
            }
        }
Exemple #19
0
        public static DisjunctiveExamplesSpec WitnessRelativeToken(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.ProvidedInputs)
            {
                var example = spec.DisjunctiveExamples[input].First() as Tuple <PythonNode, PythonNode>;
                if (example != null)
                {
                    //if the anchor node is the target node, we don't generate relative paths
                    //just the root path "0"
                    if (AnchorAndTargetAreEqual(example))
                    {
                        return(null);
                    }
                    var node         = example.Item1;
                    var treeTemplate = new TreeTemplate(node.GetType().Name);
                    if (node.Value != null)
                    {
                        treeTemplate.Value = node.Value;
                    }

                    result[input] = new List <TreeTemplate>()
                    {
                        treeTemplate, new Wildcard(node.GetType().Name)
                    };
                }
                else
                {
                    return(null);
                }
            }
            return(DisjunctiveExamplesSpec.From(result));
        }
        public static ExampleSpec WitnessEndPosition(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (var example in spec.Examples)
            {
                State inputState     = example.Key;
                var   input          = inputState[rule.Body[0]] as string;
                var   output         = example.Value as string;
                var   refinedExample = input.IndexOf(output) + output.Length;
                result[inputState] = refinedExample;
            }
            return(new ExampleSpec(result));
        }
Exemple #21
0
        public static ExampleSpec WitnessLeafPatternToken(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (State input in spec.ProvidedInputs)
            {
                var outerSpec = spec.Examples[input] as TreeTemplate;
                if (outerSpec == null)
                {
                    return(null);
                }
                result[input] = outerSpec.PythonNode;
            }
            return(new ExampleSpec(result));
        }
        public static DisjunctiveExamplesSpec WitnessRegexPair(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, IEnumerable <object> >();

            foreach (var example in spec.Examples)
            {
                State inputState = example.Key;
                var   input      = inputState[rule.Body[0]] as string;
                var   output     = (int)example.Value;

                List <Tuple <Match, Regex> >[] leftMatches, rightMatches;
                BuildStringMatches(input, out leftMatches, out rightMatches);

                var leftRegex  = leftMatches[output];
                var rightRegex = rightMatches[output];
                if (leftRegex.Count == 0 || rightRegex.Count == 0)
                {
                    return(null);
                }
                var regexes = new List <Tuple <Regex, Regex> >();
                regexes.AddRange(from l in leftRegex
                                 from r in rightRegex
                                 select Tuple.Create(l.Item2, r.Item2));
                result[inputState] = regexes;
            }
            return(DisjunctiveExamplesSpec.From(result));
        }
Exemple #23
0
        public static ExampleSpec WitnessPatternChildren(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (State input in spec.ProvidedInputs)
            {
                var nodes = spec.Examples[input] as TreeTemplate;
                if (nodes == null)
                {
                    return(null);
                }
                var examples = new List <IEnumerable <PythonNode> >();
                if (nodes.PythonNode.Children.Any())
                {
                    examples.Add(nodes.PythonNode.Children);
                }

                result[input] = examples;
            }
            return(new ExampleSpec(result));
        }
 static DisjunctiveExamplesSpec WitnessKForRegexPair(GrammarRule rule, int parameter,  DisjunctiveExamplesSpec spec, ExampleSpec rrSpec)
 {
     var result = new Dictionary<State, IEnumerable<object>>();
     foreach (var example in spec.DisjunctiveExamples)
     {
         State inputState = example.Key;
         var inp = (string)inputState[rule.Body[0]];
         var regexPair = (Tuple<Regex, Regex>)rrSpec.Examples[inputState];
         Regex left = regexPair.Item1;
         Regex right = regexPair.Item2;
         var rightMatches = right.Matches(inp).Cast<Match>().ToDictionary(m => m.Index);
         var matchPositions = new List<int>();
         foreach (Match m in left.Matches(inp))
         {
             if (rightMatches.ContainsKey(m.Index + m.Length))
                 matchPositions.Add(m.Index + m.Length);
         }
         var ks = new HashSet<int?>();
         foreach (int? pos in example.Value)
         {
             int occurrence = matchPositions.BinarySearch(pos.Value);
             if (occurrence < 0) continue;
             ks.Add(occurrence);
             ks.Add(occurrence - matchPositions.Count);
         }
         if (ks.Count == 0) return null;
         result[inputState] = ks.Cast<object>();
     }
     return new DisjunctiveExamplesSpec(result);
 }
Exemple #25
0
        public static ExampleSpec WitnessTemplateChildrenHead(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var result = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var outerSpec = spec.Examples[input] as List <PythonNode>;
                if (outerSpec == null || outerSpec.Count < 2)
                {
                    return(null);
                }
                result[input] = outerSpec.First();
            }
            return(new ExampleSpec(result));
        }
        [WitnessFunction(nameof(Semantics.Substring), parameterSymbolName: "startPos", DependsOnParameters = new[] { 0, 2 })]// <- name nach .grammar-Datei erwartet. So richtig!
        DisjunctiveExamplesSpec WitnessSubstring_startPos(GrammarRule rule, ExampleSpec spec, ExampleSpec spec0, ExampleSpec spec2)
        {
            var innerSpec = new Dictionary <State, IEnumerable <object> >();

            foreach (var example in spec.Examples)
            {
                //Get the output of this operator
                var operatorOutput = (string)example.Value;
                var operatorInputs = example.Key;
                var completeString = (string)operatorInputs[rule.Body[0]]; //gets the first inputparameter, here string sr

                //Find all possible start-positions of operatoroutput in completestring
                var possibleStartPositions = new List <int?>();
                for (int i = completeString.IndexOf(operatorOutput); i >= 0; i = completeString.IndexOf(operatorOutput, i + 1))
                {
                    possibleStartPositions.Add(i);
                }
                if (possibleStartPositions.Count == 0)
                {
                    return(null);
                }
                innerSpec[operatorInputs] = possibleStartPositions.Cast <object>();
            }
            return(new DisjunctiveExamplesSpec(innerSpec));
        }
Exemple #27
0
        public static DisjunctiveExamplesSpec WitnessContext(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var templateExamples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.ProvidedInputs)
            {
                var node = spec.Examples[input] as PythonNode;
                var ast  = (PythonNode)input[rule.Body[0]];
                if (ast.ContainsByBinding(node))
                {
                    node = ast.GetCorrespondingNodeByBinding(node);
                }
                else
                {
                    return(null);
                }
                var innerSpec = new List <Tuple <int, PythonNode> >()
                {
                    Tuple.Create(0, node)
                };
                if (node.Parent != null)
                {
                    innerSpec.Add(Tuple.Create(1, node));
                }
                templateExamples[input] = innerSpec;
            }
            return(new DisjunctiveExamplesSpec(templateExamples));
        }
        public static FunctionalDisjunctiveOutputSpec WitnessSortKey(GrammarRule rule, ExampleSpec spec)
        {
            var fExamples = new Dictionary <State, MultiValueDictionary <object, object> >();

            foreach (State input in spec.ProvidedInputs)
            {
                var inputArray = (string[])input[rule.Body[0]];
                var outArray   = (string[])spec.Examples[input];
                int len        = inputArray.Length;



                // Get positions for each item in sorted list
                var indexes = new int[len];
                for (var i = 0; i < len; i++)
                {
                    var item = inputArray[i];
                    var idx  = Array.IndexOf(outArray, item);
                    if (idx < 0)
                    {
                        throw new Exception("Cannot find index in output array");
                    }
                    indexes[i] = idx;
                }

                // Create a dictionary for comparisons spec
                var fMap = new MultiValueDictionary <object, object>();


                // Loop through all possible pairs
                for (var i = 0; i < len - 1; i++)
                {
                    for (var j = i + 1; j < len; j++)
                    {
                        var item1     = inputArray[i];
                        var item2     = inputArray[j];
                        var idx1      = indexes[i];
                        var idx2      = indexes[j];
                        var itemTuple = (Tuple <string, string>)Tuple.Create(item1, item2);
                        // Two cases are interesting, swaps and splices:
                        // (1) idx1 > idx2 ==> item1 > item2
                        // (2) (idx2 - idx1) > (j - i) ==> item2 > item1

                        if (idx1 > idx2)
                        {
                            fMap.Add(itemTuple, 1);
                        }
                        else if ((idx2 - idx1) > (j - i))
                        {
                            fMap.Add(itemTuple, -1);
                        }
                        else
                        {
                            // If strict ordering is not found, then
                            // idx1 < idx2 ==> (item1 <= item2)
                            fMap.Add(itemTuple, -1);
                            fMap.Add(itemTuple, 0);
                        }
                    }
                }

                // Add comparisons for this list in the functional spec
                fExamples[input] = fMap;
            }
            return(new FunctionalDisjunctiveOutputSpec(fExamples));
        }
Exemple #29
0
        public static ExampleSpec WitnessSingleChild(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var childrenExamples = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var children = spec.Examples[input] as IEnumerable <PythonNode>;
                if (children.Count().Equals(1))
                {
                    childrenExamples[input] = children.First();
                }
                else
                {
                    return(null);
                }
            }
            return(new ExampleSpec(childrenExamples));
        }
        internal DisjunctiveExamplesSpec WitnessSelectWithWhereColumnArray(GrammarRule rule, DisjunctiveExamplesSpec spec, ExampleSpec conditionSpec)
        {
            var ppExamples     = new Dictionary <State, IEnumerable <object> >();
            var conditionTable = (DataTable)conditionSpec.Examples.Values.First();

            foreach (State input in spec.ProvidedInputs)
            {
                DataTable inputTable           = ((DataTable[])input[rule.Grammar.InputSymbol])[0];
                var       desiredOutput        = (DataTable)spec.DisjunctiveExamples[input].First(); // conditionTable;
                var       allPossibleSolutions = new List <object>();
                allPossibleSolutions.Add(desiredOutput.Columns.Cast <DataColumn>().ToArray());

                ppExamples[input] = allPossibleSolutions;
            }
            //Complete the rows
            return(DisjunctiveExamplesSpec.From(ppExamples));
        }
        DisjunctiveExamplesSpec WitnessRegexFunction_iTH(GrammarRule rule, ExampleSpec spec, ExampleSpec regexSpec)
        {
            var result = new Dictionary <State, IEnumerable <object> >();

            // Die erste Spec ist die "äußere spec", die die beispiele enthält
            foreach (var example in spec.Examples)
            {
                var functionInput  = (string)example.Key[rule.Body[2]]; //TODO funktioniert das so? 0 -> der index zeigt die position in der ganzen grammatik an, und 0 ist der input. oder muss hier eine 2 hin? -> index zeigt die position in der parameterliste an. TESTEN!
                var regex          = new Regex("");                     // (Regex)regexSpec.Examples[example.Key];
                var completeString = "";
                var programOutput  = (string)example.Value;             // TODO ?

                //TODO match regex to input and write back, which match-indices have a match, where the output starts, too
                var possibleNs = new HashSet <int>();
                var matches    = regex.Matches(functionInput);

                var possibleStartPositions = new List <int?>();
                for (int i = functionInput.IndexOf(programOutput); i >= 0; i = completeString.IndexOf(programOutput, i + 1))
                {
                    possibleStartPositions.Add(i);
                }


                if (possibleNs.Count == 0)
                {
                    return(null);
                }
                result[example.Key] = possibleNs.Cast <object>();
            }
            return(new DisjunctiveExamplesSpec(result));
        }
        public DisjunctiveExamplesSpec WitnessFilterByProcessProcess(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.ProvidedInputs)
            {
                var before   = (Node)input[rule.Body[0]];
                var after    = (List <int>)spec.Examples[input];
                var children = before.GetProcesses();
                foreach (var child in children)
                {
                    if (Semantics.FilterByProcess(before, child).OrderBy(i => i)
                        .SequenceEqual(after.OrderBy(i => i)))
                    {
                        if (!examples.ContainsKey(input))
                        {
                            examples[input] = new List <string>();
                        }
                        ((List <string>)examples[input]).Add(child);
                    }
                }
            }

            return(new DisjunctiveExamplesSpec(examples));
        }
        public DisjunctiveExamplesSpec WitnessMoveLeft(GrammarRule rule, ExampleSpec spec, ExampleSpec positionSpec)
        {
            var examples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.Examples)
            {
                var inputState = input.Key;
                var before     = (Node)inputState[rule.Body[0]];
                var position   = (int)positionSpec.Examples[inputState];
                var after      = (Node)spec.Examples[inputState];
                if (Semantics.Move(before, position, true).IsEqualTo(after))
                {
                    if (!examples.ContainsKey(inputState))
                    {
                        examples[inputState] = new List <object>();
                    }

                    if (!(examples[inputState]).Contains(true))
                    {
                        ((List <object>)examples[inputState]).Add(true);
                    }
                }

                if (Semantics.Move(before, position, false).IsEqualTo(after))
                {
                    if (!examples.ContainsKey(inputState))
                    {
                        examples[inputState] = new List <object>();
                    }

                    if (!(examples[inputState]).Contains(false))
                    {
                        ((List <object>)examples[inputState]).Add(false);
                    }
                }
            }

            return(new DisjunctiveExamplesSpec(examples));
        }
 public static DisjunctiveExamplesSpec WitnessRegexCount(GrammarRule rule, int parameter,
                                                         DisjunctiveExamplesSpec spec,
                                                         ExampleSpec regexBinding)
 {
     var kExamples = new Dictionary<State, IEnumerable<object>>();
     foreach (State input in spec.ProvidedInputs)
     {
         var v = (StringRegion) input[rule.Body[0]];
         var rr = (Tuple<RegularExpression, RegularExpression>) regexBinding.Examples[input];
         var ks = new List<object>();
         foreach (uint pos in spec.DisjunctiveExamples[input])
         {
             var ms = rr.Item1.Run(v).Where(m => rr.Item2.MatchesAt(v, m.Right)).ToArray();
             int index = ms.BinarySearchBy(m => m.Right.CompareTo(pos));
             if (index < 0) return null;
             ks.Add(index + 1);
             ks.Add(index - ms.Length);
         }
         kExamples[input] = ks;
     }
     return DisjunctiveExamplesSpec.From(kExamples);
 }
Exemple #35
0
        private static void LearnFromNewExample()
        {
            Console.Out.Write("Provide a new input-output example (e.g., \"(Sumit Gulwani)\",\"Gulwani\"): ");
            try
            {
                string input = Console.ReadLine();
                if (input != null)
                {
                    int startFirstExample  = input.IndexOf("\"", StringComparison.Ordinal) + 1;
                    int endFirstExample    = input.IndexOf("\"", startFirstExample + 1, StringComparison.Ordinal) + 1;
                    int startSecondExample = input.IndexOf("\"", endFirstExample + 1, StringComparison.Ordinal) + 1;
                    int endSecondExample   = input.IndexOf("\"", startSecondExample + 1, StringComparison.Ordinal) + 1;

                    if (startFirstExample >= endFirstExample || startSecondExample >= endSecondExample)
                    {
                        throw new Exception(
                                  "Invalid example format. Please try again. input and out should be between quotes");
                    }

                    string inputExample  = input.Substring(startFirstExample, endFirstExample - startFirstExample - 1);
                    string outputExample =
                        input.Substring(startSecondExample, endSecondExample - startSecondExample - 1);

                    State inputState = State.CreateForExecution(Grammar.InputSymbol, inputExample);
                    Examples.Add(inputState, outputExample);
                }
            }
            catch (Exception)
            {
                throw new Exception("Invalid example format. Please try again. input and out should be between quotes");
            }

            var spec = new ExampleSpec(Examples);

            Console.Out.WriteLine("Learning a program for examples:");
            foreach (KeyValuePair <State, object> example in Examples)
            {
                Console.WriteLine("\"{0}\" -> \"{1}\"", example.Key.Bindings.First().Value, example.Value);
            }

            var        scoreFeature = new RankingScore(Grammar);
            ProgramSet topPrograms  = _prose.LearnGrammarTopK(spec, scoreFeature, 4, null);

            if (topPrograms.IsEmpty)
            {
                throw new Exception("No program was found for this specification.");
            }

            _topProgram = topPrograms.RealizedPrograms.First();
            Console.Out.WriteLine("Top 4 learned programs:");
            var counter = 1;

            foreach (ProgramNode program in topPrograms.RealizedPrograms)
            {
                if (counter > 4)
                {
                    break;
                }
                Console.Out.WriteLine("==========================");
                Console.Out.WriteLine("Program {0}: ", counter);
                Console.Out.WriteLine(program.PrintAST(ASTSerializationFormat.HumanReadable));
                counter++;
            }
        }
Exemple #36
0
        public static DisjunctiveExamplesSpec WitnessMoveK(GrammarRule rule, int parameter, ExampleSpec spec)
        {
            var contextExamples = new Dictionary <State, IEnumerable <object> >();

            foreach (State input in spec.ProvidedInputs)
            {
                var operation = spec.Examples[input] as Move;
                if (operation == null)
                {
                    return(null);
                }
                var positions = new List <int>();
                positions.Add(operation.Index);
                if (operation.Index == operation.TargetNode.Children.Count)
                {
                    positions.Add(-1);
                }
                contextExamples[input] = positions.Cast <object>();
            }
            return(DisjunctiveExamplesSpec.From(contextExamples));
        }