This file is indexed.

/usr/share/octave/packages/optim-1.5.2/private/__null_optim__.m is in octave-optim 1.5.2-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
## Copyright (C) 1994-2011 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/>.

## -*- texinfo -*-
## @deftypefn  {Function File} {} null (@var{A})
## @deftypefnx {Function File} {} null (@var{A}, @var{tol})
## Return an orthonormal basis of the null space of @var{A}.
##
## The dimension of the null space is taken as the number of singular
## values of @var{A} not greater than @var{tol}.  If the argument @var{tol}
## is missing, it is computed as
##
## @example
## max (size (@var{A})) * max (svd (@var{A})) * eps
## @end example
## @seealso{orth}
## @end deftypefn

## Author: KH <Kurt.Hornik@wu-wien.ac.at>
## Created: 24 December 1993.
## Adapted-By: jwe
## Adapted-By: Olaf Till <i7tiol@t-online.de>

## This function has also been submitted to Octave (bug #33503).

function retval = __null_optim__ (A, tol)

  if (isempty (A))
    retval = [];
  else
    [U, S, V] = svd (A);

    [rows, cols] = size (A);

    [S_nr, S_nc] = size (S);

    if (S_nr == 1 || S_nc == 1)
      s = S(1);
    else
      s = diag (S);
    endif

    if (nargin == 1)
      if (isa (A, "single"))
        tol = max (size (A)) * s (1) * (meps = eps ("single"));
      else
        tol = max (size (A)) * s (1) * (meps = eps);
      endif
    elseif (nargin != 2)
      print_usage ();
    endif

    rank = sum (s > tol);

    if (rank < cols)
      retval = V (:, rank+1:cols);

      if (rows >= cols)
        cb = columns (retval);

        if (cb > 1)

          ## For multidimensional null spaces LAPACK seems to return
          ## very large error angles (> pi/2) for the basis vectors, so
          ## we cannot use these angles to determine which elements of
          ## the basis vectors could be zero. In some of such cases
          ## LAPACK seems to set elements "meant" to be zero exactly to
          ## zero in the basis vectors, so we don't need to do anything.
          ## In the other cases, we can't do anything.

        else

          ## Set those elements of each vector to zero whose absolute
          ## values are smallest and which together could be zero
          ## without making the angle to the originally computed vector
          ## larger than given by the error bound. Do this in an
          ## approximative but numerically feasible way.

          ## The following code still treats the multidimensional case
          ## though it currently doesn't arrive here.

          ## error bounds of basis vectors in radians, see LAPACK user
          ## guide, http://www.netlib.org/lapack/lug/node96.html
	  if (true)  # test for Octave version once submitted patch is
                                # applied to Octave (bug #33503)
	    __disna__ = @ __disna_optim__;
	  endif
          ## This deviates from the LAPACK reference by the factor "2 *
          ## max(size(A))". This deviation is chosen because the results
          ## in setting elements to zero are better so. ("tol" used
          ## above for the rank test also seems to deviate from LAPACK
          ## reference, by factor "max(size(A))".
          ebnd = 2 * tol ./ (__disna__ ("R", s, rows, cols)(rank+1:cols));

          ## sort elements by magnitude
          sb = conj (retval) .* retval;
          [sb, idx] = sort (sb);
          idx += repmat (0:cols:cols*(cb-1), cols, 1); # for un-sorting

          ## norms of vectors made by all elements up to this
          sb = sqrt (cumsum (sb));

          ## The norm of the vectors made up by elements settable to
          ## zero is small enough to be approximately equal to the angle
          ## between the full vectors before and after setting these
          ## elements to zero (considering the norms of the full vectors
          ## being 1). Index of approximated angles not exceeding error
          ## bound.
          zidx = sb <= repmat (ebnd.', cols, 1);

          ## set indexed elements to zero in original basis
          retval(idx(zidx)) = 0;

        endif

      else
        ## no error bounds computable with LAPACK

        ## this is from original null.m
        retval(abs (retval) < meps) = 0;
      endif
    else
        retval = zeros (cols, 0);
    endif
  endif

endfunction