<?xml version="1.0"?>
<!--
   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.
-->

<!--
  This file contains some false positive bugs detected by findbugs. Their
  false positive nature has been analyzed individually and they have been
  put here to instruct findbugs it must ignore them.
-->
<FindBugsFilter>

  <!--  the following equality tests are part of the reference algorithms -->
  <!--  which already know about limited precision of the double numbers -->
  <Match>
    <Class name="org.apache.commons.math.analysis.BrentSolver" />
    <Method name="solve" params="double,double,double,double,double,double" returns="double" />
    <Bug pattern="FE_FLOATING_POINT_EQUALITY" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.analysis.MullerSolver" />
    <Or>
      <Method name="solve"  params="double,double" returns="double" />
      <Method name="solve2" params="double,double" returns="double" />
    </Or>
    <Bug pattern="FE_FLOATING_POINT_EQUALITY" />
  </Match>


  <!-- The following equality test is intentional and needed for rounding purposes -->
  <Match>
    <Class name="org.apache.commons.math.util.MathUtils" />
    <Method name="roundUnscaled" params="double,double,int" returns="double" />
    <Bug pattern="FE_FLOATING_POINT_EQUALITY" />
  </Match>


  <!-- the following expositions of internal representation are intentional and documented -->
  <Match>
    <Class name="org.apache.commons.math.ode.sampling.AbstractStepInterpolator"/>
    <Or>
      <Method name="getInterpolatedState" params="" returns="double[]" />
      <Method name="getInterpolatedDerivatives" params="" returns="double[]" />
    </Or>
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.linear.BigMatrixImpl"/>
    <Method name="&lt;init>" params="java.math.BigDecimal[][],boolean" returns="void" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.linear.BigMatrixImpl"/>
    <Method name="getDataRef" params="" returns="java.math.BigDecimal[][]" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.linear.RealMatrixImpl"/>
    <Method name="&lt;init>" params="double[][],boolean" returns="void" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.linear.RealMatrixImpl"/>
    <Method name="getDataRef" params="" returns="double[][]" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.util.ResizableDoubleArray"/>
    <Method name="getValues" params="" returns="double[]" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.linear.RealVectorImpl"/>
    <Method name="getDataRef" params="" returns="double[]" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>

  <!-- The following cases are intentional unit tests for null parameters -->
  <Match>
    <Class name="org.apache.commons.math.stat.StatUtilsTest" />
    <Method name="testPercentile" params="" returns="void" />
    <Bug pattern="NP_NULL_PARAM_DEREF_NONVIRTUAL" />
  </Match>
  <Match>
    <Class name="org.apache.commons.math.analysis.UnivariateRealSolverFactoryImplTest" />
    <Method name="testNewNewtonSolverNull" params="" returns="void" />
    <Bug pattern="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS" />
  </Match>

</FindBugsFilter>
