24 # pragma warning (disable: 4786)
25 # pragma warning (disable: 4243)
27 # pragma warning (disable: 4355)
57 std::set<CNormalItemPower*, compareItemPowers >::const_iterator it;
58 std::set<CNormalItemPower*, compareItemPowers >::const_iterator itEnd = product1->
getItemPowers().end();
59 std::set<CNormalItemPower*, compareItemPowers >::const_iterator it2;
60 std::set<CNormalItemPower*, compareItemPowers >::const_iterator it2End = product2->
getItemPowers().end();
62 for (it = product1->
getItemPowers().begin(), it2 = product2->
getItemPowers().begin(); (it != itEnd) && (it2 != it2End); ++it, ++it2)
64 if (**it < **it2)
return true;
66 if (**it2 < **it)
return false;
83 std::set<CNormalProduct*, compareProducts >::const_iterator it;
84 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd = src.
mProducts.end();
87 for (it = src.
mProducts.begin(); it != itEnd; ++it)
92 assert(tmpRes ==
true);
95 std::set<CNormalFraction*>::const_iterator it2;
96 std::set<CNormalFraction*>::const_iterator it2End = src.
mFractions.end();
98 for (it2 = src.
mFractions.begin(); it2 != it2End; ++it2)
101 assert(tmpRes ==
true);
110 std::set<CNormalProduct*, compareProducts >::const_iterator it;
111 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd = src.
mProducts.end();
113 for (it = src.
mProducts.begin(); it != itEnd; ++it)
116 std::set<CNormalFraction*>::const_iterator it2;
117 std::set<CNormalFraction*>::const_iterator it2End = src.
mFractions.end();
119 for (it2 = src.
mFractions.begin(); it2 != it2End; ++it2)
130 std::set<CNormalProduct*, compareProducts >::const_iterator it;
131 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd =
mProducts.end();
133 for (it =
mProducts.begin(); it != itEnd; ++it)
136 std::set<CNormalFraction*>::const_iterator it2;
137 std::set<CNormalFraction*>::const_iterator it2End =
mFractions.end();
139 for (it2 =
mFractions.begin(); it2 != it2End; ++it2)
158 if (fabs(product.
getFactor()) < 1.0E-100)
163 std::set<CNormalProduct*, compareProducts >::iterator it =
mProducts.begin();
164 std::set<CNormalProduct*, compareProducts >::iterator itEnd =
mProducts.end();
168 if ((*it)->checkSamePowerList(product))
170 (*it)->setFactor((*it)->getFactor() + product.
getFactor());
173 if (fabs((*it)->getFactor()) < 1.0E-100)
201 std::set<CNormalFraction*>::iterator it;
202 std::set<CNormalFraction*>::iterator itEnd =
mFractions.end();
204 for (it =
mFractions.begin(); it != itEnd; ++it)
206 if (**it == fraction)
208 (*it)->multiply(2.0);
224 std::set<CNormalProduct*, compareProducts >::const_iterator itProduct = sum.
mProducts.begin();
225 std::set<CNormalProduct*, compareProducts >::const_iterator itProductEnd = sum.
mProducts.end();
227 while (itProduct != itProductEnd)
233 std::set<CNormalFraction*>::const_iterator itFraction = sum.
getFractions().begin();
234 std::set<CNormalFraction*>::const_iterator itFractionEnd = sum.
getFractions().end();
236 while (itFraction != itFractionEnd)
251 if (fabs(number) < 1.0E-100)
253 std::set<CNormalProduct*, compareProducts >::iterator it3;
254 std::set<CNormalProduct*, compareProducts >::iterator it3End =
mProducts.end();
256 for (it3 =
mProducts.begin(); it3 != it3End; ++it3)
259 std::set<CNormalFraction*>::iterator it4;
260 std::set<CNormalFraction*>::iterator it4End =
mFractions.end();
262 for (it4 =
mFractions.begin(); it4 != it4End; ++it4)
268 std::set<CNormalProduct*, compareProducts >::iterator it;
269 std::set<CNormalProduct*, compareProducts >::iterator itEnd =
mProducts.end();
271 for (it =
mProducts.begin(); it != itEnd; ++it)
272 (*it)->multiply(number);
274 std::set<CNormalFraction*>::iterator it2;
275 std::set<CNormalFraction*>::iterator it2End =
mFractions.end();
277 for (it2 =
mFractions.begin(); it2 != it2End; ++it2)
278 (*it2)->multiply(number);
289 std::set<CNormalProduct*, compareProducts >::iterator it;
290 std::set<CNormalProduct*, compareProducts >::iterator itEnd =
mProducts.end();
292 for (it =
mProducts.begin(); it != itEnd; ++it)
293 (*it)->multiply(itemPower);
295 std::set<CNormalFraction*>::iterator it2;
296 std::set<CNormalFraction*>::iterator it2End =
mFractions.end();
298 for (it2 =
mFractions.begin(); it2 != it2End; ++it2)
299 (*it2)->multiply(itemPower);
310 std::set<CNormalProduct*, compareProducts > tmpProducts =
mProducts;
312 std::set<CNormalProduct*, compareProducts >::iterator it;
313 std::set<CNormalProduct*, compareProducts >::iterator itEnd = tmpProducts.end();
316 for (it = tmpProducts.begin(); it != itEnd; ++it)
319 assert(pSum != NULL);
336 std::set<CNormalProduct*, compareProducts > tmpProducts =
mProducts;
338 std::set<CNormalProduct*, compareProducts >::const_iterator it2;
339 std::set<CNormalProduct*, compareProducts >::const_iterator it2End = tmpProducts.end();
341 for (it2 = tmpProducts.begin(); it2 != it2End; ++it2)
349 std::set<CNormalFraction*>::const_iterator it;
350 std::set<CNormalFraction*>::const_iterator itEnd =
mFractions.end();
352 for (it =
mFractions.begin(); it != itEnd; ++it)
356 assert(summand2 != NULL);
373 std::set<CNormalProduct*, compareProducts >::iterator it;
374 std::set<CNormalProduct*, compareProducts >::iterator itEnd =
mProducts.end();
376 for (it =
mProducts.begin(); it != itEnd; ++it)
377 (*it)->remove(itemPower);
386 std::set<CNormalProduct*, compareProducts >::const_iterator it;
387 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd = mProducts.end();
389 for (it = mProducts.begin(); it != itEnd; ++it)
391 bool containsFactor =
false;
392 std::set<CNormalItemPower*, compareItemPowers >::const_iterator it2;
393 std::set<CNormalItemPower*, compareItemPowers >::const_iterator it2End = (*it)->getItemPowers().end();
395 for (it2 = (*it)->getItemPowers().begin(); it2 != it2End; ++it2)
397 if ((*it2)->getItem().areEqual(itemPower.getItem()))
399 exp = (*it2)->getExp() < exp ? (*it2)->getExp() : exp;
400 containsFactor =
true;
405 if (containsFactor ==
false)
442 std::set<CNormalProduct*, compareProducts >::const_iterator it;
443 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd = this->
mProducts.end();
444 std::set<CNormalProduct*, compareProducts >::const_iterator it2;
449 if (!(**it == **it2))
453 std::set<CNormalFraction*>::const_iterator it3;
454 std::set<CNormalFraction*>::const_iterator it3End = this->
mFractions.end();
455 std::set<CNormalFraction*>::const_iterator it4;
460 if (!(**it3 == **it4))
475 std::ostringstream os;
479 bool firstSummand =
true;
480 std::set<CNormalProduct*, compareProducts >::const_iterator it;
481 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd = this->
mProducts.end();
483 for (it = this->
mProducts.begin(); it != itEnd; ++it)
485 if (firstSummand ==
false)
489 firstSummand =
false;
492 std::set<CNormalFraction*>::const_iterator it2;
493 std::set<CNormalFraction*>::const_iterator it2End = this->
mFractions.end();
495 for (it2 = this->
mFractions.begin(); it2 != it2End; ++it2)
497 if (firstSummand ==
false)
501 firstSummand =
false;
525 std::set<CNormalFraction*>::const_iterator it = this->
mFractions.begin(), endit = this->
mFractions.end();
526 std::set<CNormalFraction*>::const_iterator it2 = rhs.
mFractions.begin();
528 while (result ==
false && it != endit)
530 if ((**it) < (**it2))
536 else if (!((**it) == (**it2)))
546 if (result ==
false && it == endit)
554 std::set<CNormalProduct*, compareProducts>::const_iterator it3 = this->
mProducts.begin(), endit3 = this->
mProducts.end();
555 std::set<CNormalProduct*, compareProducts>::const_iterator it4 = rhs.
mProducts.begin();
560 while (result ==
false && it3 != endit3)
562 if ((**it3) < (**it4))
568 else if (!((**it3) == (**it4)))
585 std::set<CNormalProduct*, compareProducts>::const_iterator it = this->
mProducts.begin(), endit = this->
mProducts.end();
593 it = set.begin(), endit = set.end();
605 std::set<CNormalFraction*>::const_iterator it = this->
mFractions.begin(), endit = this->
mFractions.end();
613 it = set.begin(), endit = set.end();
629 std::set<CNormalFraction*> fractionsCopy(this->
mFractions);
631 std::set<CNormalFraction*>::iterator it3 = fractionsCopy.begin(), endit3 = fractionsCopy.end();
634 while (it3 != endit3)
638 this->
add(*pTmpFraction);
643 std::set<CNormalProduct*, compareProducts>::iterator it = this->
mProducts.begin(), endit = this->
mProducts.end();
650 std::vector<CNormalBase*> newProducts;
661 fabs(((*pTmpProduct->
getItemPowers().begin())->getExp() - 1.0) / 1.0) < 1e-12 &&
674 newProducts.push_back(pTmpProduct2);
683 newProducts.push_back(pTmpProduct2);
695 newProducts.push_back(pTmpProduct);
722 pSum->
add(*pTmpProduct);
731 pDenom->
setLeft(*pTmpFraction);
735 pTmpItemPower->
setExp(1.0);
736 pTmpItemPower->
setItem(*pDenom);
737 pTmpProduct->
multiply(*pTmpItemPower);
738 delete pTmpItemPower;
740 pTmpSum->
add(*pTmpProduct);
747 newProducts.push_back(pFraction);
750 if (pDenom != NULL)
delete pDenom;
757 std::vector<CNormalBase*>::const_iterator it2 = newProducts.begin(), endit2 = newProducts.end();
761 std::set<CNormalSum*> multipliers;
763 while (it2 != endit2)
838 std::set<CNormalSum*>::iterator it4 = multipliers.begin(), endit4 = multipliers.end();
840 while (it4 != endit4)
860 && ((*
mProducts.begin())->getItemPowers().size() == 0)
861 && (fabs((*
mProducts.begin())->getFactor() - 1.0) < 1.E-100)
862 && ((pTmpPow == NULL) || (pTmpPow->
checkIsOne()))
868 if (pTmpPow != NULL)
delete pTmpPow;
880 || (
mProducts.size() == 1 && ((*
mProducts.begin())->getItemPowers().size() == 0) && (fabs((*
mProducts.begin())->getFactor() - 0.0) < 1.E-100)))
893 pSum->
add(*pTmpProduct);
900 std::set<CNormalProduct*, compareProducts >::const_iterator it = pSum->
mProducts.begin();
901 std::set<CNormalProduct*, compareProducts >::const_iterator itEnd = pSum->
mProducts.end();
902 std::cout <<
"products: " << std::endl;
906 std::cout << (*it)->toString() << std::endl;
910 std::cout << std::endl;
911 std::cout << std::endl;
912 std::cout << std::endl;
CNormalSum & getNumerator()
static CNormalProduct * createUnitProduct()
bool operator()(const CNormalProduct *product1, const CNormalProduct *product2) const
virtual std::string toString() const
CNormalFraction & getLeft()
virtual CNormalBase * copy() const
std::set< CNormalProduct *, compareProducts > mProducts
CNormalGeneralPower * getDenominator() const
void setDenominatorsOne()
std::ostream & operator<<(std::ostream &os, const CNormalSum &d)
bool add(const CNormalProduct &product)
C_FLOAT64 checkFactor(const CNormalItemPower &itemPower) const
static CNormalFraction * createUnitFraction()
bool setItem(const CNormalBase &item)
const std::set< CNormalFraction * > & getFractions() const
bool operator==(const CNormalSum &rhs) const
bool divide(const CNormalItemPower &itemPower)
CNormalSum & getDenominator()
bool setDenominator(const CNormalSum &denominator)
const std::set< CNormalItemPower *, compareItemPowers > & getItemPowers() const
CNormalFraction & getRight()
void setFractions(const std::set< CNormalFraction * > &set)
const C_FLOAT64 & getFactor() const
CNormalSum & operator=(const CNormalSum &src)
bool setNumerator(const CNormalSum &numerator)
void setProducts(const std::set< CNormalProduct *, compareProducts > &set)
void setLeft(const CNormalFraction &left)
std::set< CNormalFraction * > mFractions
static CNormalSum * createUnitSum()
static void printProducts(const CNormalSum *pSum)
bool operator<(const CNormalSum &rhs) const
bool multiply(const C_FLOAT64 &number)
virtual CNormalBase * copy() const =0
const std::set< CNormalProduct *, compareProducts > & getProducts() const
bool multiply(const C_FLOAT64 &number)
bool setExp(const C_FLOAT64 &number)