1 2 #include "Cleanup.hh" 3 #include "algorithms/tab_dimension.hh" 4 5 using namespace cadabra; 6 tabdimension(const Kernel & k,Ex & ex)7tabdimension::tabdimension(const Kernel& k, Ex& ex) 8 : Algorithm(k, ex) 9 { 10 } 11 can_apply(iterator it)12bool tabdimension::can_apply(iterator it) 13 { 14 dimension=-1; 15 16 tab=kernel.properties.get<Tableau>(it); 17 if(tab) { 18 dimension=tab->dimension; 19 if(dimension>0) 20 return true; 21 } 22 23 ftab=kernel.properties.get<FilledTableau>(it); 24 if(ftab) { 25 dimension=ftab->dimension; 26 // std::cerr << "dimension " << dimension << std::endl; 27 if(dimension>0) 28 return true; 29 } 30 31 return false; 32 } 33 apply(iterator & it)34Algorithm::result_t tabdimension::apply(iterator& it) 35 { 36 // std::cerr << "applying at " << it << std::endl; 37 if(ftab) { 38 yngtab::filled_tableau<Ex> one; 39 40 sibling_iterator sib=tr.begin(it); 41 unsigned int currow=0; 42 while(sib!=tr.end(it)) { 43 if(*sib->name=="\\comma") { 44 sibling_iterator sib2=tr.begin(sib); 45 while(sib2!=tr.end(sib)) { 46 one.add_box(currow, Ex(sib2)); 47 ++sib2; 48 } 49 } 50 else one.add_box(currow, Ex(sib)); 51 ++sib; 52 ++currow; 53 } 54 auto tmp=it->multiplier; 55 node_one(it); 56 it->multiplier=tmp; 57 multiply(it->multiplier, one.dimension(dimension)); 58 } 59 else { 60 yngtab::tableau one; 61 sibling_iterator sib=tr.begin(it); 62 while(sib!=tr.end(it)) { 63 one.add_row(to_long(*sib->multiplier)); 64 ++sib; 65 } 66 auto tmp=it->multiplier; 67 node_one(it); 68 it->multiplier=tmp; 69 multiply(it->multiplier, one.dimension(dimension)); 70 } 71 cleanup_dispatch(kernel, tr, it); 72 return result_t::l_applied; 73 } 74 75