#include "IndexIterator.hh" #include "algorithms/young_project.hh" using namespace cadabra; young_project::young_project(const Kernel& k, Ex& tr) : Algorithm(k,tr), remove_traces(false) { // For internal use in which one fills the young tableau structures directly. } young_project::young_project(const Kernel& k, Ex& tr, const std::vector& shape, const std::vector& indices) : Algorithm(k,tr), remove_traces(false) { int count=0; for(unsigned int row=0; rowname!="\\prod") { if(!is_single_term(it)) { return false; } } prod_wrap_single_term(it); if(nametab.number_of_rows()>0) { // have to convert names to numbers tab.copy_shape(nametab); pos_tab_t::iterator pi=tab.begin(); name_tab_t::iterator ni=nametab.begin(); while(ni!=nametab.end()) { index_iterator ii=index_iterator::begin(kernel.properties, it); unsigned int indexnum=0; while(ii!=index_iterator::end(kernel.properties, it)) { if(subtree_exact_equal(&kernel.properties, ii, *ni)) { *pi=indexnum; break; } ++indexnum; ++ii; } if(indexnum==number_of_indices(kernel.properties, it)) { prod_unwrap_single_term(it); return false; // cannot find indicated index in expression } ++pi; ++ni; } } prod_unwrap_single_term(it); return true; } Ex::iterator young_project::nth_index_node(iterator it, unsigned int num) { Ex::fixed_depth_iterator indname=tr.begin_fixed(it, 2); indname+=num; return indname; } Algorithm::result_t young_project::apply(iterator& it) { prod_wrap_single_term(it); sym.clear(); if(asym_ranges.size()>0) { // Convert index locations to box numbers. combin::range_vector_t sublengths_scattered; // txtout << "asym_ranges: "; for(unsigned int i=0; imultiplier, sym.signature(i)); multiply(repfac.begin()->multiplier, tab.projector_normalisation()); iterator repfactop=repfac.begin(); prod_unwrap_single_term(repfactop); rep.append_child(rep.begin(), repfac.begin()); } traceterm: ; } it=tr.replace(it,rep.begin()); sym.remove_multiplicity_zero(); return result_t::l_applied; }