mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-27 01:29:58 +01:00
[poincare] Implement real and shallowReduce of ComplexCartesian on nodes: conjugate, function, symbol
This commit is contained in:
@@ -18,6 +18,7 @@ public:
|
||||
}
|
||||
#endif
|
||||
|
||||
bool isReal(Context & context, Preferences::AngleUnit angleUnit) const override { return childAtIndex(0)->isReal(context, angleUnit); }
|
||||
ComplexCartesian complexCartesian(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
ComplexPolar complexPolar(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
@@ -46,7 +47,7 @@ public:
|
||||
static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); }
|
||||
static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("conj", 1, &UntypedBuilder);;
|
||||
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target);
|
||||
private:
|
||||
explicit Conjugate(Expression child) : Expression(TreePool::sharedPool()->createTreeNode<ConjugateNode>()) {
|
||||
replaceChildAtIndexInPlace(0, child);
|
||||
|
||||
@@ -28,6 +28,7 @@ public:
|
||||
float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
// Complex
|
||||
bool isReal(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
ComplexCartesian complexCartesian(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
ComplexPolar complexPolar(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
// Complex
|
||||
bool isReal(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
ComplexCartesian complexCartesian(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
ComplexPolar complexPolar(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
|
||||
@@ -80,6 +80,7 @@ protected:
|
||||
SymbolAbstractNode * node() const { return static_cast<SymbolAbstractNode *>(Expression::node()); }
|
||||
private:
|
||||
static Expression Expand(const SymbolAbstract & symbol, Context & context, bool clone);
|
||||
static bool isReal(const SymbolAbstract & symbol, Context & context, Preferences::AngleUnit angleUnit);
|
||||
static ComplexCartesian complexCartesian(const SymbolAbstract & symbol, Context & context, Preferences::AngleUnit angleUnit);
|
||||
static ComplexPolar complexPolar(const SymbolAbstract & symbol, Context & context, Preferences::AngleUnit angleUnit);
|
||||
static size_t AlignedNodeSize(size_t nameLength, size_t nodeSize);
|
||||
|
||||
@@ -47,7 +47,7 @@ int ConjugateNode::serialize(char * buffer, int bufferSize, Preferences::PrintFl
|
||||
}
|
||||
|
||||
Expression ConjugateNode::shallowReduce(Context & context, Preferences::AngleUnit angleUnit, ReductionTarget target) {
|
||||
return Conjugate(this).shallowReduce(context, angleUnit);
|
||||
return Conjugate(this).shallowReduce(context, angleUnit, target);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
@@ -55,7 +55,7 @@ Complex<T> ConjugateNode::computeOnComplex(const std::complex<T> c, Preferences:
|
||||
return Complex<T>(std::conj(c));
|
||||
}
|
||||
|
||||
Expression Conjugate::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) {
|
||||
Expression Conjugate::shallowReduce(Context & context, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) {
|
||||
{
|
||||
Expression e = Expression::defaultShallowReduce(context, angleUnit);
|
||||
if (e.isUndefined()) {
|
||||
@@ -68,6 +68,18 @@ Expression Conjugate::shallowReduce(Context & context, Preferences::AngleUnit an
|
||||
return SimplificationHelper::Map(*this, context, angleUnit);
|
||||
}
|
||||
#endif
|
||||
if (c.isReal(context, angleUnit)) {
|
||||
replaceWithInPlace(c);
|
||||
return c;
|
||||
}
|
||||
if (c.type() == ExpressionNode::Type::ComplexCartesian) {
|
||||
ComplexCartesian complexChild = static_cast<ComplexCartesian &>(c);
|
||||
Multiplication m(Rational(-1), complexChild.imag());
|
||||
complexChild.replaceChildAtIndexInPlace(1, m);
|
||||
m.shallowReduce(context, angleUnit, target);
|
||||
replaceWithInPlace(complexChild);
|
||||
return complexChild;
|
||||
}
|
||||
if (c.type() == ExpressionNode::Type::Rational) {
|
||||
replaceWithInPlace(c);
|
||||
return c;
|
||||
|
||||
@@ -14,6 +14,11 @@ ComplexCartesian FunctionNode::complexCartesian(Context & context, Preferences::
|
||||
return SymbolAbstract::complexCartesian(f, context, angleUnit);
|
||||
}
|
||||
|
||||
bool FunctionNode::isReal(Context & context, Preferences::AngleUnit angleUnit) const {
|
||||
Function f(this);
|
||||
return SymbolAbstract::isReal(f, context, angleUnit);
|
||||
}
|
||||
|
||||
ComplexPolar FunctionNode::complexPolar(Context & context, Preferences::AngleUnit angleUnit) const {
|
||||
Function f(this);
|
||||
return SymbolAbstract::complexPolar(f, context, angleUnit);
|
||||
|
||||
@@ -77,6 +77,11 @@ float SymbolNode::characteristicXRange(Context & context, Preferences::AngleUnit
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
bool SymbolNode::isReal(Context & context, Preferences::AngleUnit angleUnit) const {
|
||||
Symbol s(this);
|
||||
return SymbolAbstract::isReal(s, context, angleUnit);
|
||||
}
|
||||
|
||||
ComplexCartesian SymbolNode::complexCartesian(Context & context, Preferences::AngleUnit angleUnit) const {
|
||||
Symbol s(this);
|
||||
return SymbolAbstract::complexCartesian(s, context, angleUnit);
|
||||
|
||||
@@ -80,6 +80,14 @@ Expression SymbolAbstract::Expand(const SymbolAbstract & symbol, Context & conte
|
||||
return e;
|
||||
}
|
||||
|
||||
bool SymbolAbstract::isReal(const SymbolAbstract & symbol, Context & context, Preferences::AngleUnit angleUnit) {
|
||||
Expression e = SymbolAbstract::Expand(symbol, context, false);
|
||||
if (e.isUninitialized()) {
|
||||
return true;
|
||||
}
|
||||
return e.isReal(context, angleUnit);
|
||||
}
|
||||
|
||||
ComplexCartesian SymbolAbstract::complexCartesian(const SymbolAbstract & symbol, Context & context, Preferences::AngleUnit angleUnit) {
|
||||
Expression e = SymbolAbstract::Expand(symbol, context, true);
|
||||
if (e.isUninitialized()) {
|
||||
|
||||
Reference in New Issue
Block a user