' Licensed to the Apache Software Foundation (ASF) under one or more ' contributor license agreements. See the NOTICE file distributed with ' this work for additional information regarding copyright ownership. ' The ASF licenses this file to You under the Apache License, Version 2.0 ' (the "License"); you may not use this file except in compliance with ' the License. You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. @startuml skinparam svek true skinparam ClassBackgroundColor #F3EFEB skinparam ClassArrowColor #691616 skinparam ClassBorderColor #691616 skinparam NoteBackgroundColor #F3EFEB skinparam NoteBorderColor #691616 skinparam NoteFontColor #691616 skinparam ClassFontSize 11 package org.apache.commons.math3 #ECEBD8 interface "FieldElement" as FieldElement_T_ { T add(T a) T subtract(T a) T negate() T multiply(int n) T multiply(T a) T divide(T a) T reciprocal() Field getField() } package analysis #DDEBD8 interface UnivariateFunction { double value(double x) } package differentiation #DDDBD8 class DerivativeStructure { -DerivativeStructure(DSCompiler compiler) +DerivativeStructure(int parameters, int order, double value) +DerivativeStructure(int parameters, int order, int index, double value) +int getFreeParameters() +int getOrder() +double getValue() +double getPartialDerivative(int[] orders) +double taylor(double[] delta) +int getExponent() +DerivativeStructure compose(double[] f) +DerivativeStructure cos() +DerivativeStructure sin() +DerivativeStructure exp() +DerivativeStructure sqrt() } note bottom lots of mathematical methods and constructors ommitted for clarity end note class DSCompiler { {static} +DSCompiler getCompiler(int parameters, int order) +int getPartialDerivativeIndex(int[] orders) +int[] getPartialDerivativeOrders(int index) +int getFreeParameters() +int getOrder() +int getSize() +void checkCompatibility(DSCompiler compiler) +void compose(double[] operand, int operandOffset, double[] f, double[] result, int resultOffset) +double taylor(double[] ds, int dsOffset, double[] delta) +void add(double[] lhs, int lhsOffset, double[] rhs, int rhsOffset, double[] result, int resultOffset) +void exp(double[] operand, int operandOffset, double[] result, int resultOffset) } note bottom one compiler is built for each pair (number of parameters, derivation order) they are cached for efficiency end note interface UnivariateDifferentiable { DerivativeStructure value(DerivativeStructure t) } interface UnivariateDifferentiator { UnivariateDifferentiable differentiate(UnivariateFunction function) } FieldElement_T_ <.. DerivativeStructure DerivativeStructure o--> "1" DSCompiler : delegates computation UnivariateFunction <|.. UnivariateDifferentiable UnivariateDifferentiable <-- UnivariateDifferentiator : creates UnivariateDifferentiable --> DerivativeStructure : uses end package end package end package @enduml