00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <basix/mmx_syntax.hpp>
00014 #include <mblad/bav.hpp>
00015 #include <bad.h>
00016
00018 namespace mmx {
00019 #define Coordinate multivariate_coordinate<>
00020
00021 static bav_symbol*
00022 bav_independent_symbol (const string& s, nat i, nat j) {
00023 bav_symbol* x= ::bav_new_symbol ();
00024 char* c= as_charp (s);
00025 x -> ident= ::ba0_strdup (c);
00026 free_charp (c);
00027 x -> type= ::bav_independent_symbol;
00028 x -> index= i;
00029 x -> derivation_index= j;
00030 return x; }
00031
00032 static bav_symbol*
00033 bav_dependent_symbol (const string& s, nat i) {
00034 bav_symbol* x= ::bav_new_symbol ();
00035 char* c= as_charp (s);
00036 x -> ident= ::ba0_strdup (c);
00037 free_charp (c);
00038 x -> type= ::bav_dependent_symbol;
00039 x -> index= i;
00040
00041 return x; }
00042
00043 static bav_variable*
00044 bav_independent_variable (const string& s, nat i, nat j) {
00045 bav_variable* x= ::bav_new_variable ();
00046 x -> root= bav_independent_symbol (s, i, j);
00047 x -> index= i;
00048 ba0_insert_table ((ba0_table*) &(x -> number), 0, (void*) 2);
00049 return x; }
00050
00051 static bav_variable*
00052 bav_dependent_variable (const string& s, nat i, nat r) {
00053 bav_variable* x= ::bav_new_variable ();
00054 x -> root= bav_dependent_symbol (s, i);
00055 x -> index= i;
00056 ba0_insert_table ((ba0_table*) &(x -> number), 0, (void*) 2);
00057 for (nat k= 0; k < r; k++)
00058 ba0_insert_table ((ba0_table*) &(x -> order), k, (void*) 0);
00059 return x; }
00060
00061 blad_session::blad_session (const vector<Coordinate>& indeps2,
00062 const vector<Coordinate>& deps2)
00063 : indeps (indeps2), deps (deps2) {
00064 bad_restart (0, 0);
00065 bav_R_init ();
00066
00067 nat r= N(indeps), s= N(deps);
00068 bav_ordering* ord= ::bav_new_ordering ();
00069 bav_block* blk= ::bav_new_block ();
00070 bav_variable* var;
00071 for (nat i= 0; i < r; i++) {
00072 var= bav_independent_variable (as_mmx (**indeps[i]), i, i);
00073 bav_indeps << (void*) var;
00074 ba0_insert_table ((ba0_table*) &(bav_R.strs), i,
00075 (void*) var -> root -> ident);
00076 ba0_insert_table ((ba0_table*) &(bav_R.syms), i,
00077 (void*) var -> root);
00078 ba0_insert_table ((ba0_table*) &(bav_R.vars), i,
00079 (void*) var);
00080 ba0_insert_table ((ba0_table*) &(bav_R.ders), i,
00081 (void*) i);
00082 ba0_insert_table ((ba0_table*) &(ord -> ders), i,
00083 (void*) var-> root);
00084 }
00085 for (nat i= 0; i < s; i++) {
00086 var= bav_dependent_variable (as_mmx (**deps[i]), r + i, r);
00087 bav_deps << (void*) var;
00088 ba0_insert_table ((ba0_table*) &(bav_R.strs), r + i,
00089 (void*) var -> root -> ident);
00090 ba0_insert_table ((ba0_table*) &(bav_R.syms), r + i,
00091 (void*) var -> root);
00092 ba0_insert_table ((ba0_table*) &(bav_R.vars), r + i,
00093 (void*) var);
00094 ba0_insert_table ((ba0_table*) &(bav_R.deps), i, (void*) (r + i));
00095 ba0_insert_table ((ba0_table*) &(blk -> indices), i, (void*) (r + i));
00096 ba0_insert_table ((ba0_table*) &(blk -> strs), i,
00097 (void*) var -> root -> ident);
00098 }
00099 ba0_insert_table ((ba0_table*) &(ord -> blocks), 0, (void*) blk);
00100 ba0_insert_table ((ba0_table*) &(bav_R.ords), 0, (void*) ord);
00101 ba0_insert_table ((ba0_table*) &(bav_R.ord_stack), 0, (void*) 0);
00102 bav_R.opra= 0;
00103 bav_R.empty= false;
00104
00105 }
00106
00107 blad_session::~blad_session () {
00108
00109 bad_terminate (ba0_init_level); }
00110
00111 }
00112