From: Richard Kreckel Date: Wed, 15 Mar 2000 21:22:41 +0000 (+0000) Subject: - The status_flags::expanded is now used on some occasions. X-Git-Tag: release_0-5-4~5 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=f6f99c4d47762da9e3d73a2f5ec6f062e82505b8 - The status_flags::expanded is now used on some occasions. --- diff --git a/ginac/add.cpp b/ginac/add.cpp index aa8ff64f..717279b5 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -528,12 +528,16 @@ ex add::recombine_pair_to_ex(const expair & p) const ex add::expand(unsigned options) const { + if (flags & status_flags::expanded) + return *this; + epvector * vp = expandchildren(options); if (vp==0) { return *this; } - return (new add(vp,overall_coeff))->setflag(status_flags::expanded | - status_flags::dynallocated ); + return (new add(vp,overall_coeff))-> + setflag(status_flags::expanded | + status_flags::dynallocated); } ////////// diff --git a/ginac/ex.cpp b/ginac/ex.cpp index 6c51fe6e..4eb3d15d 100644 --- a/ginac/ex.cpp +++ b/ginac/ex.cpp @@ -250,7 +250,10 @@ unsigned ex::nops() const ex ex::expand(unsigned options) const { GINAC_ASSERT(bp!=0); - return bp->expand(options); + if (bp->flags & status_flags::expanded) + return *bp; + else + return bp->expand(options); } bool ex::has(const ex & other) const diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index e1b4852c..5c72362b 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -539,7 +539,7 @@ unsigned expairseq::calchash(void) const ex expairseq::expand(unsigned options) const { - epvector * vp=expandchildren(options); + epvector * vp = expandchildren(options); if (vp==0) { return *this; } diff --git a/ginac/matrix.cpp b/ginac/matrix.cpp index e5a9459f..1f4ed18b 100644 --- a/ginac/matrix.cpp +++ b/ginac/matrix.cpp @@ -943,7 +943,7 @@ ex matrix::determinant_minor(void) const else det += m[Pkey[r]*this->col+c]*A[Mkey]; } - // prevent build-up of deep nesting of expressions saves some time: + // prevent build-up of deep nesting of expressions saves time: det = det.expand(); // store the new determinant at its place in B: B.insert(Rmap_value(Pkey,det)); diff --git a/ginac/mul.cpp b/ginac/mul.cpp index b0caa52d..860fb10a 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -301,7 +301,7 @@ typedef vector intvector; int mul::degree(const symbol & s) const { - int deg_sum=0; + int deg_sum = 0; for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { deg_sum+=(*cit).rest.degree(s) * ex_to_numeric((*cit).coeff).to_int(); } @@ -310,7 +310,7 @@ int mul::degree(const symbol & s) const int mul::ldegree(const symbol & s) const { - int deg_sum=0; + int deg_sum = 0; for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) { deg_sum+=(*cit).rest.ldegree(s) * ex_to_numeric((*cit).coeff).to_int(); } @@ -418,7 +418,7 @@ ex mul::eval(int level) const return (new add(distrseq, ex_to_numeric(addref.overall_coeff). mul_dyn(ex_to_numeric(overall_coeff)))) - ->setflag(status_flags::dynallocated | + ->setflag(status_flags::dynallocated | status_flags::evaluated ); } return this->hold(); @@ -473,7 +473,7 @@ ex mul::derivative(const symbol & s) const // D(a*b*c)=D(a)*b*c+a*D(b)*c+a*b*D(c) for (unsigned i=0; i!=seq.size(); i++) { - epvector sub_seq=seq; + epvector sub_seq = seq; sub_seq[i] = split_ex_to_pair(sub_seq[i].coeff* power(sub_seq[i].rest,sub_seq[i].coeff-1)* sub_seq[i].rest.diff(s)); @@ -499,7 +499,7 @@ unsigned mul::return_type(void) const return return_types::commutative; } - bool all_commutative=1; + bool all_commutative = 1; unsigned rt; epvector::const_iterator cit_noncommutative_element; // point to first found nc element @@ -508,8 +508,8 @@ unsigned mul::return_type(void) const if (rt==return_types::noncommutative_composite) return rt; // one ncc -> mul also ncc if ((rt==return_types::noncommutative)&&(all_commutative)) { // first nc element found, remember position - cit_noncommutative_element=cit; - all_commutative=0; + cit_noncommutative_element = cit; + all_commutative = 0; } if ((rt==return_types::noncommutative)&&(!all_commutative)) { // another nc element found, compare type_infos @@ -652,20 +652,23 @@ bool mul::can_make_flat(const expair & p) const ex mul::expand(unsigned options) const { + if (flags & status_flags::expanded) + return *this; + exvector sub_expanded_seq; intvector positions_of_adds; intvector number_of_add_operands; - + epvector * expanded_seqp = expandchildren(options); - + const epvector & expanded_seq = expanded_seqp==0 ? seq : *expanded_seqp; - + positions_of_adds.resize(expanded_seq.size()); number_of_add_operands.resize(expanded_seq.size()); - + int number_of_adds = 0; int number_of_expanded_terms = 1; - + unsigned current_position = 0; epvector::const_iterator last = expanded_seq.end(); for (epvector::const_iterator cit=expanded_seq.begin(); cit!=last; ++cit) { @@ -680,19 +683,19 @@ ex mul::expand(unsigned options) const } current_position++; } - + if (number_of_adds==0) { if (expanded_seqp==0) { return this->setflag(status_flags::expanded); } return (new mul(expanded_seqp,overall_coeff))-> - setflag(status_flags::dynallocated || - status_flags::expanded); + setflag(status_flags::dynallocated | + status_flags::expanded); } - + exvector distrseq; distrseq.reserve(number_of_expanded_terms); - + intvector k; k.resize(number_of_adds); @@ -700,49 +703,31 @@ ex mul::expand(unsigned options) const for (l=0; l - setflag(status_flags::dynallocated | - status_flags::expanded)); - + setflag(status_flags::dynallocated | + status_flags::expanded)); + // increment k[] l=number_of_adds-1; - while ((l>=0)&&((++k[l])>=number_of_add_operands[l])) { + while ((l>=0) && ((++k[l])>=number_of_add_operands[l])) { k[l]=0; l--; } if (l<0) break; } - - if (expanded_seqp!=0) { + + if (expanded_seqp!=0) delete expanded_seqp; - } - /* - cout << "mul::expand() distrseq begin" << endl; - for (exvector::const_iterator cit=distrseq.begin(); cit!=distrseq.end(); ++cit) { - (*cit).printtree(cout); - } - cout << "mul::expand() distrseq end" << endl; - */ - + return (new add(distrseq))->setflag(status_flags::dynallocated | status_flags::expanded); } @@ -765,11 +750,11 @@ epvector * mul::expandchildren(unsigned options) const const ex & factor = recombine_pair_to_ex(*cit); const ex & expanded_factor = factor.expand(options); if (!are_ex_trivially_equal(factor,expanded_factor)) { - + // something changed, copy seq, eval and return it epvector *s=new epvector; s->reserve(seq.size()); - + // copy parts of seq which are known not to have changed epvector::const_iterator cit2 = seq.begin(); while (cit2!=cit) { diff --git a/ginac/numeric.cpp b/ginac/numeric.cpp index e4124f7c..94012384 100644 --- a/ginac/numeric.cpp +++ b/ginac/numeric.cpp @@ -94,9 +94,10 @@ numeric::numeric() : basic(TINFO_numeric) { debugmsg("numeric default constructor", LOGLEVEL_CONSTRUCT); value = new cl_N; - *value=cl_I(0); + *value = cl_I(0); calchash(); - setflag(status_flags::evaluated| + setflag(status_flags::evaluated | + status_flags::expanded | status_flags::hash_calculated); } diff --git a/ginac/power.cpp b/ginac/power.cpp index 49ee5c59..2baa08d9 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -329,11 +329,10 @@ ex power::eval(int level) const debugmsg("power eval",LOGLEVEL_MEMBER_FUNCTION); - if ((level==1)&&(flags & status_flags::evaluated)) { + if ((level==1) && (flags & status_flags::evaluated)) return *this; - } else if (level == -max_recursion_level) { + else if (level == -max_recursion_level) throw(std::runtime_error("max recursion level reached")); - } const ex & ebasis = level==1 ? basis : basis.eval(level-1); const ex & eexponent = level==1 ? exponent : exponent.eval(level-1); @@ -554,20 +553,24 @@ unsigned power::return_type_tinfo(void) const ex power::expand(unsigned options) const { + if (flags & status_flags::expanded) + return *this; + ex expanded_basis = basis.expand(options); - if (!is_ex_exactly_of_type(exponent,numeric)|| + if (!is_ex_exactly_of_type(exponent,numeric) || !ex_to_numeric(exponent).is_integer()) { if (are_ex_trivially_equal(basis,expanded_basis)) { return this->hold(); } else { return (new power(expanded_basis,exponent))-> - setflag(status_flags::dynallocated); + setflag(status_flags::dynallocated | + status_flags::expanded); } } // integer numeric exponent - const numeric & num_exponent=ex_to_numeric(exponent); + const numeric & num_exponent = ex_to_numeric(exponent); int int_exponent = num_exponent.to_int(); if (int_exponent > 0 && is_ex_exactly_of_type(expanded_basis,add)) { @@ -583,7 +586,8 @@ ex power::expand(unsigned options) const return this->hold(); } else { return (new power(expanded_basis,exponent))-> - setflag(status_flags::dynallocated); + setflag(status_flags::dynallocated | + status_flags::expanded); } } @@ -613,20 +617,20 @@ ex power::expand_add(const add & a, int n) const int l; for (int l=0; lsetflag(status_flags::dynallocated); + return (new add(sum))->setflag(status_flags::dynallocated | + status_flags::expanded ); } -/** Special case of power::expand. Expands a^2 where a is an add. +/** Special case of power::expand_add. Expands a^2 where a is an add. * @see power::expand_add */ ex power::expand_add_2(const add & a) const { @@ -753,10 +758,11 @@ ex power::expand_add_2(const add & a) const GINAC_ASSERT(sum.size()==(a_nops*(a_nops+1))/2); - return (new add(sum))->setflag(status_flags::dynallocated); + return (new add(sum))->setflag(status_flags::dynallocated | + status_flags::expanded ); } -/** Expand m^n where m is a mul and n is and integer +/** Expand factors of m in m^n where m is a mul and n is and integer * @see power::expand */ ex power::expand_mul(const mul & m, const numeric & n) const { @@ -765,8 +771,8 @@ ex power::expand_mul(const mul & m, const numeric & n) const epvector distrseq; distrseq.reserve(m.seq.size()); - epvector::const_iterator last=m.seq.end(); - epvector::const_iterator cit=m.seq.begin(); + epvector::const_iterator last = m.seq.end(); + epvector::const_iterator cit = m.seq.begin(); while (cit!=last) { if (is_ex_exactly_of_type((*cit).rest,numeric)) { distrseq.push_back(m.combine_pair_with_coeff_to_pair(*cit,n)); @@ -779,7 +785,7 @@ ex power::expand_mul(const mul & m, const numeric & n) const ++cit; } return (new mul(distrseq,ex_to_numeric(m.overall_coeff).power_dyn(n))) - ->setflag(status_flags::dynallocated); + ->setflag(status_flags::dynallocated); } /* @@ -803,9 +809,8 @@ ex power::expand_commutative_3(const ex & basis, const numeric & exponent, distrseq.push_back(binomial(n,k)*power(first_operands,numeric(k))* power(last_operand,numeric(n-k))); } - return ex((new add(distrseq))->setflag(status_flags::sub_expanded | - status_flags::expanded | - status_flags::dynallocated )). + return ex((new add(distrseq))->setflag(status_flags::expanded | + status_flags::dynallocated )). expand(options); } */ diff --git a/ginac/symbol.cpp b/ginac/symbol.cpp index 1a8ef59c..7dd1c522 100644 --- a/ginac/symbol.cpp +++ b/ginac/symbol.cpp @@ -43,9 +43,9 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(symbol, basic) symbol::symbol() : inherited(TINFO_symbol) { debugmsg("symbol default constructor", LOGLEVEL_CONSTRUCT); - serial=next_serial++; - name=autoname_prefix()+ToString(serial); - asexinfop=new assigned_ex_info; + serial = next_serial++; + name = autoname_prefix()+ToString(serial); + asexinfop = new assigned_ex_info; setflag(status_flags::evaluated); } @@ -64,9 +64,9 @@ symbol::symbol(const symbol & other) void symbol::copy(const symbol & other) { inherited::copy(other); - name=other.name; - serial=other.serial; - asexinfop=other.asexinfop; + name = other.name; + serial = other.serial; + asexinfop = other.asexinfop; ++asexinfop->refcount; } @@ -95,9 +95,9 @@ void symbol::destroy(bool call_parent) symbol::symbol(const string & initname) : inherited(TINFO_symbol) { debugmsg("symbol constructor from string", LOGLEVEL_CONSTRUCT); - name=initname; - serial=next_serial++; - asexinfop=new assigned_ex_info; + name = initname; + serial = next_serial++; + asexinfop = new assigned_ex_info; setflag(status_flags::evaluated); }