public NextCNF ( int numNonterminals, int numProductions, IList |
||
numNonterminals | int | |
numProductions | int | |
terminals | IList |
|
useNull | bool | |
return |
public CNFGrammar NextCNF(int numNonterminals, int numProductions, IList<Terminal> terminals, bool useNull = true) {
if (numNonterminals < 1) {
throw new ArgumentOutOfRangeException("Need at least one nonterminal");
}
var start = RandomNonterminal(1);
double producesEmptyWeight = 0.0;
if (useNull) {
if (numProductions > 0) {
if (_rand.Next(2) == 1) {
producesEmptyWeight = 100 * _rand.NextDouble();
numProductions--;
}
}
}
var numNontermProductions = _rand.Next(numProductions);
var numTermProductions = numProductions - numNontermProductions;
var productions = new List<Production>();
for (int i = 0; i < numNontermProductions; i++) {
productions.Add(NextCNFNonterminalProduction(numNonterminals));
}
for (int i = 0; i < numTermProductions; i++) {
var terminal = RandomTerminal(terminals);
productions.Add(NextCNFTerminalProduction(numNonterminals, terminals, terminal));
}
productions.Add(new Production(start, new Sentence(), producesEmptyWeight));
return new CNFGrammar(productions, start);
}
public void RandomTesting() { var randg = new GrammarGenerator(); int _maxNonterminals = 8; int _maxProductions = 8; int _maxTerminals = 20; int _step = 1; for (int numProductions = 0; numProductions < _maxProductions; numProductions += _step) { for (int numNonterminals = 1; numNonterminals < _maxNonterminals; numNonterminals += _step) { for (int numTerminals = 1; numTerminals < _maxTerminals; numTerminals += _step) { var range = Enumerable.Range(0, numTerminals); var terminals = new List <Terminal>(range.Select((x) => Terminal.Of("x" + x))); Console.WriteLine("{0}, {1}, {2}", numNonterminals, numProductions, numTerminals); var rg = randg.NextCNF(numNonterminals, numProductions, terminals); TestGrammar(rg); } } } }