1 | public static Expression Polynomial(IRandom uniformRandom, Expression[] variables, bool useLog, bool useExp) {
|
---|
2 | var sumTemplate = new RandomArityTemplate(Sum, new UniformDistributedRandom(uniformRandom, 1, variables.Length)) { Label = "+" };
|
---|
3 | sumTemplate.AddArguments(variables);
|
---|
4 |
|
---|
5 | var productTemplate = new RandomArityTemplate(Product, new UniformDistributedRandom(uniformRandom, 1, variables.Length)) { Label = "*" };
|
---|
6 | productTemplate.AddArguments(variables);
|
---|
7 |
|
---|
8 | const int count = 10; // how many instances of each template should be produced?
|
---|
9 | int i = 1;
|
---|
10 |
|
---|
11 | var logTemplate = new FixedArityTemplate(Log, 1) { Label = "log" };
|
---|
12 | logTemplate.AddArguments(variables);
|
---|
13 | logTemplate.AddArguments(Enumerable.Range(1, count).Select(x => sumTemplate.Instantiate(string.Format("sum{0}", i++), uniformRandom)));
|
---|
14 |
|
---|
15 | var expTemplate = new FixedArityTemplate(Exp, 1) { Label = "exp" };
|
---|
16 | expTemplate.AddArguments(variables);
|
---|
17 | expTemplate.AddArguments(Enumerable.Range(1, count).Select(x => productTemplate.Instantiate(string.Format("prod{0}", i++), uniformRandom)));
|
---|
18 |
|
---|
19 | var inverseTemplate = new FixedArityTemplate(Division, 1) { Label = "/" };
|
---|
20 | inverseTemplate.AddArguments(variables);
|
---|
21 | inverseTemplate.AddArguments(Enumerable.Range(1, count).Select(x => sumTemplate.Instantiate(string.Format("sum{0}", i++), uniformRandom)));
|
---|
22 | inverseTemplate.AddArguments(Enumerable.Range(1, count).Select(x => productTemplate.Instantiate(string.Format("prod{0}", i++), uniformRandom)));
|
---|
23 | inverseTemplate.AddArguments(Enumerable.Range(1, count).Select(x => logTemplate.Instantiate(string.Format("log{0}", i++), uniformRandom)));
|
---|
24 | inverseTemplate.AddArguments(Enumerable.Range(1, count).Select(x => expTemplate.Instantiate(string.Format("exp{0}", i++), uniformRandom)));
|
---|
25 |
|
---|
26 | var template = new RandomArityTemplate(Sum, new UniformDistributedRandom(uniformRandom, 2, count)) { Label = "+" };
|
---|
27 | template.AddArguments(variables);
|
---|
28 | template.AddArguments(Enumerable.Range(1, count).Select(x => logTemplate.Instantiate(string.Format("log{0}", i++), uniformRandom)));
|
---|
29 | template.AddArguments(Enumerable.Range(1, count).Select(x => expTemplate.Instantiate(string.Format("exp{0}", i++), uniformRandom)));
|
---|
30 | template.AddArguments(Enumerable.Range(1, count).Select(x => inverseTemplate.Instantiate(string.Format("inv{0}", i++), uniformRandom)));
|
---|
31 |
|
---|
32 | return template.Instantiate("polynomial", uniformRandom);
|
---|
33 | }
|
---|