Orbiter 2022
Combinatorial Objects
syntax_tree.cpp
Go to the documentation of this file.
1/*
2 * syntax_tree.cpp
3 *
4 * Created on: Feb 16, 2021
5 * Author: betten
6 */
7
8
9
10
11#include "foundations.h"
12
13using namespace std;
14
15
16namespace orbiter {
17namespace layer1_foundations {
18namespace expression_parser {
19
20
22{
24 //std::vector<std::string> managed_variables;
25 Root = NULL;
26}
27
28void syntax_tree::print(std::ostream &ost)
29{
30 Root->print(ost);
31}
32
33void syntax_tree::print_monomial(std::ostream &ost, int *monomial)
34{
35 int i;
36
37 for (i = 0; i < managed_variables.size(); i++) {
38 if (monomial[i]) {
39 ost << "*" << managed_variables[i];
40 if (monomial[i] > 1) {
41 ost << "^" << monomial[i];
42 }
43 }
44 }
45}
46
47int syntax_tree::identify_single_literal(std::string &single_literal)
48{
49 int i;
50
51 //cout << "syntax_tree::identify_single_literal trying to identify " << single_literal << endl;
52 for (i = 0; i < managed_variables.size(); i++) {
53 if (strcmp(single_literal.c_str(), managed_variables[i].c_str()) == 0) {
54 //cout << "syntax_tree::identify_single_literal literal identified as managed variable " << i << endl;
55 return i;
56 }
57 }
58 return -1;
59}
60
61int syntax_tree::is_homogeneous(int &degree, int verbose_level)
62{
63 int f_v = (verbose_level >= 1);
64
65 if (f_v) {
66 cout << "syntax_tree::is_homogeneous" << endl;
67 }
68 int ret;
69
71 ret = FALSE;
72 }
73 else {
74 degree = -1;
75
76 ret = Root->is_homogeneous(degree, verbose_level);
77 }
78 if (f_v) {
79 cout << "syntax_tree::is_homogeneous done" << endl;
80 }
81 return ret;
82}
83
84
86 syntax_tree_node **&Subtrees, int verbose_level)
87{
88 int f_v = (verbose_level >= 1);
89
90 if (f_v) {
91 cout << "syntax_tree::split_by_monomials" << endl;
92 }
94 cout << "syntax_tree::split_by_monomials !f_has_managed_variables" << endl;
95 exit(1);
96 }
97
98
99 int nb_monomials;
100 int i;
101
102 nb_monomials = Poly->get_nb_monomials();
103 Subtrees = (syntax_tree_node **) NEW_pvoid(nb_monomials);
104
105 for (i = 0; i < nb_monomials; i++) {
106 Subtrees[i] = NULL;
107 }
108 Root->split_by_monomials(Poly, Subtrees, verbose_level);
109
110 if (f_v) {
111 for (i = 0; i < nb_monomials; i++) {
112 cout << "Monomial " << i << " has subtree:" << endl;
113 if (Subtrees[i]) {
114 Subtrees[i]->print(cout);
115 }
116 else {
117 cout << "no subtree" << endl;
118 }
119 }
120 }
121 if (f_v) {
122 cout << "syntax_tree::split_by_monomials done" << endl;
123 }
124
125}
126
127
128
129}}}
130
131
void split_by_monomials(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **Subtrees, int verbose_level)
void split_by_monomials(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **&Subtrees, int verbose_level)
Definition: syntax_tree.cpp:85
int is_homogeneous(int &degree, int verbose_level)
Definition: syntax_tree.cpp:61
void print_monomial(std::ostream &ost, int *monomial)
Definition: syntax_tree.cpp:33
int identify_single_literal(std::string &single_literal)
Definition: syntax_tree.cpp:47
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
#define NEW_pvoid(n)
Definition: foundations.h:637
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects