view libinterp/corefcn/betainc.cc @ 20068:19755f4fc851

maint: Cleanup C++ code to follow Octave coding conventions. Try to wrap long lines to < 80 characters. Use GNU style and don't indent first brace of function definition. "case" statement is aligned flush left with brace of switch stmt. Remove trailing '\' line continuation from the end of #define macros. Use 2 spaces for indent. * files-dock-widget.cc, history-dock-widget.cc, main-window.cc, octave-cmd.cc, octave-dock-widget.cc, octave-gui.cc, resource-manager.cc, settings-dialog.cc, shortcut-manager.cc, welcome-wizard.cc, workspace-view.cc, cellfun.cc, data.cc, debug.cc, debug.h, dirfns.cc, error.h, file-io.cc, gl-render.cc, gl-render.h, gl2ps-renderer.h, graphics.cc, graphics.in.h, help.cc, input.cc, load-path.cc, load-path.h, lookup.cc, lu.cc, oct-stream.cc, octave-default-image.h, ordschur.cc, pr-output.cc, qz.cc, strfns.cc, symtab.cc, symtab.h, sysdep.cc, variables.cc, zfstream.h, __fltk_uigetfile__.cc, __init_fltk__.cc, __magick_read__.cc, __osmesa_print__.cc, audiodevinfo.cc, ov-classdef.cc, ov-classdef.h, ov-fcn.h, ov-float.cc, ov-flt-complex.cc, ov-java.cc, ov-range.cc, ov-re-mat.cc, ov-usr-fcn.h, ov.cc, op-int.h, options-usage.h, pt-eval.cc, Array-C.cc, Array-fC.cc, Array.cc, Array.h, PermMatrix.cc, Sparse.cc, chMatrix.h, dSparse.cc, dim-vector.h, bsxfun-decl.h, bsxfun-defs.cc, oct-norm.cc, Sparse-op-defs.h, oct-inttypes.cc, oct-inttypes.h, main.in.cc, mkoctfile.in.cc: Cleanup C++ code to follow Octave coding conventions.
author Rik <rik@octave.org>
date Wed, 25 Feb 2015 11:55:49 -0800
parents 4197fc428c7d
children 17d647821d61
line wrap: on
line source

/*

Copyright (C) 1997-2015 John W. Eaton

This file is part of Octave.

Octave is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

Octave is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "lo-specfun.h"

#include "defun.h"
#include "error.h"
#include "gripes.h"
#include "oct-obj.h"
#include "utils.h"


DEFUN (betainc, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Mapping Function} {} betainc (@var{x}, @var{a}, @var{b})\n\
Return the regularized incomplete Beta function,\n\
@tex\n\
$$\n\
 I (x, a, b) = {1 \\over {B (a, b)}} \\int_0^x t^{(a-z)} (1-t)^{(b-1)} dt.\n\
$$\n\
@end tex\n\
@ifnottex\n\
@c Set example in small font to prevent overfull line\n\
\n\
@smallexample\n\
@group\n\
                                   x\n\
                          1       /\n\
betainc (x, a, b) = -----------   | t^(a-1) (1-t)^(b-1) dt.\n\
                    beta (a, b)   /\n\
                               t=0\n\
@end group\n\
@end smallexample\n\
\n\
@end ifnottex\n\
\n\
If @var{x} has more than one component, both @var{a} and @var{b} must be\n\
scalars.  If @var{x} is a scalar, @var{a} and @var{b} must be of\n\
compatible dimensions.\n\
@seealso{betaincinv, beta, betaln}\n\
@end deftypefn")
{
  octave_value retval;

  int nargin = args.length ();

  if (nargin == 3)
    {
      octave_value x_arg = args(0);
      octave_value a_arg = args(1);
      octave_value b_arg = args(2);

      // FIXME: Can we make a template version of the duplicated code below
      if (x_arg.is_single_type () || a_arg.is_single_type () ||
          b_arg.is_single_type ())
        {
          if (x_arg.is_scalar_type ())
            {
              float x = x_arg.float_value ();

              if (a_arg.is_scalar_type ())
                {
                  float a = a_arg.float_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          float b = b_arg.float_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<float> b = b_arg.float_array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
              else
                {
                  Array<float> a = a_arg.float_array_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          float b = b_arg.float_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<float> b = b_arg.float_array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
            }
          else
            {
              Array<float> x = x_arg.float_array_value ();

              if (a_arg.is_scalar_type ())
                {
                  float a = a_arg.float_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          float b = b_arg.float_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<float> b = b_arg.float_array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
              else
                {
                  Array<float> a = a_arg.float_array_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          float b = b_arg.float_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<float> b = b_arg.float_array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
            }
        }
      else
        {
          if (x_arg.is_scalar_type ())
            {
              double x = x_arg.double_value ();

              if (a_arg.is_scalar_type ())
                {
                  double a = a_arg.double_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          double b = b_arg.double_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<double> b = b_arg.array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
              else
                {
                  Array<double> a = a_arg.array_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          double b = b_arg.double_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<double> b = b_arg.array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
            }
          else
            {
              Array<double> x = x_arg.array_value ();

              if (a_arg.is_scalar_type ())
                {
                  double a = a_arg.double_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          double b = b_arg.double_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<double> b = b_arg.array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
              else
                {
                  Array<double> a = a_arg.array_value ();

                  if (! error_state)
                    {
                      if (b_arg.is_scalar_type ())
                        {
                          double b = b_arg.double_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                      else
                        {
                          Array<double> b = b_arg.array_value ();

                          if (! error_state)
                            retval = betainc (x, a, b);
                        }
                    }
                }
            }
        }
    }
  else
    print_usage ();

  return retval;
}

/*
## Double precision
%!test
%! a = [1, 1.5, 2, 3];
%! b = [4, 3, 2, 1];
%! v1 = betainc (1,a,b);
%! v2 = [1,1,1,1];
%! x = [.2, .4, .6, .8];
%! v3 = betainc (x, a, b);
%! v4 = 1 - betainc (1.-x, b, a);
%! assert (v1, v2, sqrt (eps));
%! assert (v3, v4, sqrt (eps));

## Single precision
%!test
%! a = single ([1, 1.5, 2, 3]);
%! b = single ([4, 3, 2, 1]);
%! v1 = betainc (1,a,b);
%! v2 = single ([1,1,1,1]);
%! x = single ([.2, .4, .6, .8]);
%! v3 = betainc (x, a, b);
%! v4 = 1 - betainc (1.-x, b, a);
%! assert (v1, v2, sqrt (eps ("single")));
%! assert (v3, v4, sqrt (eps ("single")));

## Mixed double/single precision
%!test
%! a = single ([1, 1.5, 2, 3]);
%! b = [4, 3, 2, 1];
%! v1 = betainc (1,a,b);
%! v2 = single ([1,1,1,1]);
%! x = [.2, .4, .6, .8];
%! v3 = betainc (x, a, b);
%! v4 = 1-betainc (1.-x, b, a);
%! assert (v1, v2, sqrt (eps ("single")));
%! assert (v3, v4, sqrt (eps ("single")));

%!error betainc ()
%!error betainc (1)
%!error betainc (1,2)
%!error betainc (1,2,3,4)
*/

DEFUN (betaincinv, args, ,
       "-*- texinfo -*-\n\
@deftypefn {Mapping Function} {} betaincinv (@var{y}, @var{a}, @var{b})\n\
Compute the inverse of the incomplete Beta function, i.e., @var{x} such that\n\
\n\
@example\n\
@var{y} == betainc (@var{x}, @var{a}, @var{b}) \n\
@end example\n\
@seealso{betainc, beta, betaln}\n\
@end deftypefn")
{
  octave_value retval;

  int nargin = args.length ();

  if (nargin == 3)
    {
      octave_value x_arg = args(0);
      octave_value a_arg = args(1);
      octave_value b_arg = args(2);

      if (x_arg.is_scalar_type ())
        {
          double x = x_arg.double_value ();

          if (a_arg.is_scalar_type ())
            {
              double a = a_arg.double_value ();

              if (! error_state)
                {
                  if (b_arg.is_scalar_type ())
                    {
                      double b = b_arg.double_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                  else
                    {
                      Array<double> b = b_arg.array_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                }
            }
          else
            {
              Array<double> a = a_arg.array_value ();

              if (! error_state)
                {
                  if (b_arg.is_scalar_type ())
                    {
                      double b = b_arg.double_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                  else
                    {
                      Array<double> b = b_arg.array_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                }
            }
        }
      else
        {
          Array<double> x = x_arg.array_value ();

          if (a_arg.is_scalar_type ())
            {
              double a = a_arg.double_value ();

              if (! error_state)
                {
                  if (b_arg.is_scalar_type ())
                    {
                      double b = b_arg.double_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                  else
                    {
                      Array<double> b = b_arg.array_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                }
            }
          else
            {
              Array<double> a = a_arg.array_value ();

              if (! error_state)
                {
                  if (b_arg.is_scalar_type ())
                    {
                      double b = b_arg.double_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                  else
                    {
                      Array<double> b = b_arg.array_value ();

                      if (! error_state)
                        retval = betaincinv (x, a, b);
                    }
                }
            }
        }

      // FIXME: It would be better to have an algorithm for betaincinv which
      // accepted float inputs and returned float outputs.  As it is, we do
      // extra work to calculate betaincinv to double precision and then throw
      // that precision away.
      if (x_arg.is_single_type () || a_arg.is_single_type () ||
          b_arg.is_single_type ())
        {
          retval = Array<float> (retval.array_value ());
        }
    }
  else
    print_usage ();

  return retval;
}

/*
%!assert (betaincinv ([0.875 0.6875], [1 2], 3), [0.5 0.5], sqrt (eps))
%!assert (betaincinv (0.5, 3, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.34375, 4, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.2265625, 5, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.14453125, 6, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.08984375, 7, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.0546875, 8, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.03271484375, 9, 3), 0.5, sqrt (eps))
%!assert (betaincinv (0.019287109375, 10, 3), 0.5, sqrt (eps))

## Test class single as well
%!assert (betaincinv ([0.875 0.6875], [1 2], single (3)), [0.5 0.5], sqrt (eps ("single")))
%!assert (betaincinv (0.5, 3, single (3)), 0.5, sqrt (eps ("single")))
%!assert (betaincinv (0.34375, 4, single (3)), 0.5, sqrt (eps ("single")))

## Extreme values
%!assert (betaincinv (0, 42, 42), 0, sqrt (eps))
%!assert (betaincinv (1, 42, 42), 1, sqrt (eps))

%!error betaincinv ()
%!error betaincinv (1, 2)
*/