From 9a763fcb9358fa02ab21cdd2ea10f70354937af8 Mon Sep 17 00:00:00 2001 From: phannebohm Date: Sat, 10 Feb 2024 13:54:52 +0100 Subject: [PATCH] [NB] Differentiate delay (#11945) --- .../Compiler/NBackEnd/Util/NBDifferentiate.mo | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/OMCompiler/Compiler/NBackEnd/Util/NBDifferentiate.mo b/OMCompiler/Compiler/NBackEnd/Util/NBDifferentiate.mo index a2b415a5266..12a1b551cb0 100644 --- a/OMCompiler/Compiler/NBackEnd/Util/NBDifferentiate.mo +++ b/OMCompiler/Compiler/NBackEnd/Util/NBDifferentiate.mo @@ -846,6 +846,30 @@ public Expression ret, ret1, ret2, arg1, arg2, arg3, diffArg1, diffArg2, diffArg3; list rest; Type ty; + DifferentiationType diffType; + + // DELAY + // d/dz delay(x, delta) = (dt/dz - d delta/dz) * delay(der(x), delta) + case (Expression.CALL()) guard(name == "delay") + algorithm + {arg1, arg2, arg3} := Call.arguments(exp.call); + // if z = t then dt/dz = 1 else dt/dz = 0 + ret1 := Expression.REAL(if diffArguments.diffType == DifferentiationType.TIME then 1.0 else 0.0); + // d delta/dz + (ret2, diffArguments) := differentiateExpression(arg2, diffArguments); + // dt/dz - d delta/dz + ret2 := SimplifyExp.simplify(Expression.MULTARY({ret1}, {ret2}, addOp)); + if Expression.isZero(ret2) then + ret := Expression.makeZero(Expression.typeOf(arg1)); + else + diffType := diffArguments.diffType; + diffArguments.diffType := DifferentiationType.TIME; + (ret1, diffArguments) := differentiateExpression(arg1, diffArguments); + diffArguments.diffType := diffType; + exp.call := Call.setArguments(exp.call, {ret1, arg2, arg3}); + ret := Expression.MULTARY({ret2, exp}, {}, mulOp); + end if; + then ret; // SMOOTH case (Expression.CALL()) guard(name == "smooth")