1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#include "properties/Integer.hh"
#include "Cleanup.hh"
#include "Kernel.hh"
#include "algorithms/collect_terms.hh"
using namespace cadabra;
std::string Integer::name() const
{
return "Integer";
}
bool Integer::parse(Kernel& kernel, keyval_t& keyvals)
{
keyval_t::iterator kv=keyvals.find("range");
if(kv!=keyvals.end()) {
from=Ex(Ex::child(kv->second,0));
to =Ex(Ex::child(kv->second,1));
// tr.subtree(from, tr.child(seq,0), tr.child(seq,1));
// tr.subtree(to, tr.child(seq,1), tr.end(seq));
// from=to_long(*(tr.child(seq,0)->multiplier));
// to =to_long(*(tr.child(seq,1)->multiplier));
Ex::iterator sm=difference.set_head(str_node("\\sum"));
difference.append_child(sm,to.begin())->fl.bracket=str_node::b_round;
Ex::iterator term2=difference.append_child(sm,from.begin());
flip_sign(term2->multiplier);
term2->fl.bracket=str_node::b_round;
difference.append_child(sm,str_node("1"))->fl.bracket=str_node::b_round;
Ex::sibling_iterator sib=difference.begin(sm);
while(sib!=difference.end(sm)) {
if(*sib->name=="\\sum") {
difference.flatten(sib);
sib=difference.erase(sib);
}
else ++sib;
}
collect_terms ct(kernel, difference);
ct.apply(sm);
}
// Ex::iterator top=difference.begin();
// cleanup_dispatch(kernel, difference, top);
return true;
}
void Integer::display(std::ostream& str) const
{
str << "Integer";
if(from.begin()!=from.end()) {
str << "(" << *(from.begin()->multiplier) << ".."
<< *(to.begin()->multiplier) << ")";
}
}
|