- if (level == 0)
- return random_symbol(x,y,z,rational);
- switch (abs(rand()) % 7) {
- case 0:
- case 1:
- return add(sparse_tree(x,y,z,level-1, trig, rational),
- sparse_tree(x,y,z,level-1, trig, rational));
- case 2:
- case 3:
- return mul(sparse_tree(x,y,z,level-1, trig, rational),
- sparse_tree(x,y,z,level-1, trig, rational));
- case 4:
- case 5:
- return power(sparse_tree(x,y,z,level-1, trig, rational),
- abs(rand() % 4));
- case 6:
- if (trig) {
- switch (abs(rand()) % 4) {
- case 0:
- return sin(sparse_tree(x,y,z,level-1, trig, rational));
- case 1:
- return cos(sparse_tree(x,y,z,level-1, trig, rational));
- case 2:
- return exp(sparse_tree(x,y,z,level-1, trig, rational));
- case 3:
- return log(sparse_tree(x,y,z,level-1, trig, rational));
- }
- } else
- return random_symbol(x,y,z,rational);
- }
+ if (level == 0)
+ return random_symbol(x,y,z,rational,complex);
+ switch (abs(rand()) % 10) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ return add(sparse_tree(x,y,z,level-1, trig, rational),
+ sparse_tree(x,y,z,level-1, trig, rational));
+ case 4:
+ case 5:
+ case 6:
+ return mul(sparse_tree(x,y,z,level-1, trig, rational),
+ sparse_tree(x,y,z,level-1, trig, rational));
+ case 7:
+ case 8: {
+ ex powbase;
+ do {
+ powbase = sparse_tree(x,y,z,level-1, trig, rational);
+ } while (powbase.is_zero());
+ return pow(powbase, abs(rand() % 4));
+ break;
+ }
+ case 9:
+ if (trig) {
+ switch (abs(rand()) % 4) {
+ case 0:
+ return sin(sparse_tree(x,y,z,level-1, trig, rational));
+ case 1:
+ return cos(sparse_tree(x,y,z,level-1, trig, rational));
+ case 2:
+ return exp(sparse_tree(x,y,z,level-1, trig, rational));
+ case 3: {
+ ex logex;
+ do {
+ ex logarg;
+ do {
+ logarg = sparse_tree(x,y,z,level-1, trig, rational);
+ } while (logarg.is_zero());
+ // Keep the evaluator from accidentally plugging an
+ // unwanted I in the tree:
+ if (!complex && logarg.info(info_flags::negative))
+ logarg = -logarg;
+ logex = log(logarg);
+ } while (logex.is_zero());
+ return logex;
+ break;
+ }
+ }
+ } else
+ return random_symbol(x,y,z,rational,complex);
+ }
+
+ return 0;