@@ -49,6 +49,13 @@ function diff(arg::UnaryOperation{Cos}, wrt::Variable)
4949 return BinaryOperation {Mult} (- UnaryOperation {Sin} (arg. arg), diff (arg. arg, wrt))
5050end
5151
52+ function diff (arg:: Log , wrt:: Variable )
53+ return BinaryOperation {Mult} (
54+ BinaryOperation {Div} (Literal (1 , get_free_indices (arg)... ), arg. arg),
55+ diff (arg. arg, wrt),
56+ )
57+ end
58+
5259function diff (arg:: Power , wrt:: Variable )
5360 outer = replace_bound_letters (arg. base, wrt)
5461
@@ -287,6 +294,20 @@ function evaluate(::Mult, arg1::KrD, arg2::BinaryOperation{Mult})
287294 return evaluate (Mult (), arg2, arg1)
288295end
289296
297+ function evaluate (:: Mult , arg1:: BinaryOperation{Div} , arg2:: KrD )
298+ attempt = BinaryOperation {Div} (
299+ evaluate (Mult (), evaluate (arg1. arg1), evaluate (arg2)),
300+ evaluate (Mult (), evaluate (arg1. arg2), evaluate (arg2)),
301+ )
302+
303+ # This ensures that arg1.base and arg2 can contract and that the contraction is simple
304+ if length (get_free_indices (attempt)) == length (get_free_indices (arg1))
305+ return attempt
306+ end
307+
308+ return BinaryOperation {Mult} (arg1, arg2)
309+ end
310+
290311function evaluate (:: Mult , arg1:: BinaryOperation{Mult} , arg2:: KrD )
291312 ci = indices_in_common (arg1. arg1, arg1. arg2)
292313
@@ -377,6 +398,17 @@ function evaluate(::Mult, arg1::KrD, arg2::UnaryOp) where {UnaryOp<:UnaryOperati
377398 return BinaryOperation {Mult} (evaluate (arg2), evaluate (arg1))
378399end
379400
401+ function evaluate (:: Mult , arg1:: Log , arg2:: KrD )
402+ attempt = Log (evaluate (Mult (), evaluate (arg1. arg), evaluate (arg2)))
403+
404+ # This ensures that arg1.base and arg2 can contract and that the contraction is simple
405+ if length (get_free_indices (attempt)) == length (get_free_indices (arg1))
406+ return attempt
407+ end
408+
409+ return BinaryOperation {Mult} (evaluate (arg1), evaluate (arg2))
410+ end
411+
380412function evaluate (:: Mult , arg1:: Power , arg2:: KrD )
381413 attempt = Power (evaluate (Mult (), evaluate (arg1. base), evaluate (arg2)), arg1. exponent)
382414
@@ -874,6 +906,10 @@ function _sub_from_product(arg1::BinaryOperation{Mult}, arg2::Value)
874906 return BinaryOperation {Sub} (evaluate (arg1), evaluate (arg2))
875907end
876908
909+ function evaluate (op:: Log )
910+ return Log (evaluate (op. arg))
911+ end
912+
877913function evaluate (op:: Power )
878914 if op. exponent == 1
879915 return evaluate (op. base)
0 commit comments