1d9b3ff7e224aacc9d5d210326d285f1bd0a8f2f
[occt.git] / src / Expr / Expr_LogOfe.cxx
1 //static const char* sccsid = "@(#)Expr_LogOfe.cxx      3.2 95/01/10"; // Do not delete this line. Used by sccs.
2 // Copyright:   Matra-Datavision 1991
3 // File:        Expr_LogOfe.cxx
4 // Created:     Tue May 28 12:33:48 1991
5 // Author:      Arnaud BOUZY
6 //              <adn>
7
8 #include <Expr_LogOfe.ixx>
9 #include <Expr_NumericValue.hxx>
10 #include <Expr_Division.hxx>
11 #include <Expr_Exponential.hxx>
12 #include <Expr_Operators.hxx>
13 #include <Expr.hxx>
14
15 Expr_LogOfe::Expr_LogOfe(const Handle(Expr_GeneralExpression)& exp)
16 {
17   CreateOperand(exp);
18 }
19
20 Handle(Expr_GeneralExpression) Expr_LogOfe::ShallowSimplified () const
21 {
22   Handle(Expr_GeneralExpression) myexp = Operand();
23   if (myexp->IsKind(STANDARD_TYPE(Expr_NumericValue))) {
24     Handle(Expr_NumericValue) myNVexp = Handle(Expr_NumericValue)::DownCast(myexp);
25     return new Expr_NumericValue(Log(myNVexp->GetValue()));
26   }
27   if (myexp->IsKind(STANDARD_TYPE(Expr_Exponential))) {
28     return myexp->SubExpression(1);
29   }
30   Handle(Expr_LogOfe) me = this;
31   return me;
32 }
33
34 Handle(Expr_GeneralExpression) Expr_LogOfe::Copy () const
35 {
36   return new Expr_LogOfe(Expr::CopyShare(Operand()));
37 }
38
39 Standard_Boolean Expr_LogOfe::IsIdentical (const Handle(Expr_GeneralExpression)& Other) const
40 {
41   if (Other->IsKind(STANDARD_TYPE(Expr_LogOfe))) {
42     Handle(Expr_GeneralExpression) myexp = Operand();
43     return myexp->IsIdentical(Other->SubExpression(1));
44   }
45   return Standard_False;
46 }
47
48 Standard_Boolean Expr_LogOfe::IsLinear () const
49 {
50   return !ContainsUnknowns();
51 }
52
53 Handle(Expr_GeneralExpression) Expr_LogOfe::Derivative (const Handle(Expr_NamedUnknown)& X) const
54 {
55   if (!Contains(X)) {
56     return new Expr_NumericValue(0.0);
57   }
58   Handle(Expr_GeneralExpression) myexp = Operand();
59   Handle(Expr_GeneralExpression) myder = myexp->Derivative(X);
60   Handle(Expr_Division) thediv = myder / Expr::CopyShare(myexp);
61   return thediv->ShallowSimplified();
62 }
63
64 Standard_Real Expr_LogOfe::Evaluate(const Expr_Array1OfNamedUnknown& vars, const TColStd_Array1OfReal& vals) const
65 {
66   return ::Log(Operand()->Evaluate(vars,vals));
67 }
68
69 TCollection_AsciiString Expr_LogOfe::String() const
70 {
71   TCollection_AsciiString str("Ln(");
72   str += Operand()->String();
73   str += ")";
74   return str;
75 }