This file is indexed.

/usr/share/octave/packages/tisean-0.2.3/poincare.m is in octave-tisean 0.2.3-3.

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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
## Copyright (C) 1996-2015 Piotr Held
##
## 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} {@var{output} =} poincare (@var{X})
## @deftypefnx{Function File} {@var{output} =} poincare (@var{X}, @var{m}, @var{paramName}, @var{paramValue}, @dots{})
## @deftypefnx{Function File} {@var{output} =} poincare (@dots{}, 'FromAbove', @dots{})
##
## Make a Poincare section for time continuous scalar data sets
## along one of the coordinates of the embedding vector.
##
## @strong{Input}
##
## @table @var
## @item X
## Must be realvector. If it is a row vector then the output will 
## be a matrix that consists of row vectors as well. 
## @end table
##
##
## @strong {Parameters}
##
## @table @var
## @item m
## The embedding dimension used. It is synonymous to 
## flag '-m' from TISEAN [default = 2].
## @item d
## Delay used for the embedding [default = 1].
## @item q
## Component for the crossing [default = value of parameter 'm' (last one)].
## @item a
## @end table
##
## @strong {Switch}
##
## @table @var
## @item FromAbove
## If this switch is set the crossing will occur from above, instead of
## from below. This is equivalent to setting flag '-C1' from TISEAN.
## @end table
##
## @strong{Output}
##
## The output consists of the as many components as the value of parameter
## @var{m} (columns or rows depending on input). The first @code{M-1} are
## the coordinates of the vector at the crossing and the last component
## is the time between the last two crossings.
##
## @strong{Algorithms}
##
## The algorithms for this functions have been taken from the TISEAN package.
## @end deftypefn

## Author: Piotr Held <pjheld@gmail.com>.
## This function is based on poincare of TISEAN 3.0.1
## https://github.com/heggus/Tisean"

function output = poincare (X, varargin)

  # Initial input validation
  if (nargin < 1)
    print_usage;
  endif

  if ((isvector (X) == false) || (isreal(X) == false))
    error ('Octave:invalid-input-arg', "X must be a realvector");
  endif

  # Default values
  embdim    = 2;
  delay     = 1;
  comp      = embdim;
  where     = sum (X) / length (X);

  #### Parse the input
  p = inputParser ();
  p.FunctionName = "poincare";

  isPositiveIntScalar = @(x) isreal(x) && isscalar (x) && ...
                             (x > 0) && (x-round(x) == 0);
  isNumericScalar     = @(x) isreal(x) && isscalar (x);

  p.addParamValue ("m", embdim, isPositiveIntScalar);
  p.addParamValue ("d", delay, isPositiveIntScalar);
  p.addParamValue ("q", comp, isPositiveIntScalar);
  p.addParamValue ("a", where, isNumericScalar);
  p.addSwitch ("FromAbove");

  p.parse (varargin{:});

  # Assign inputs
  embdim    = p.Results.m;
  dimset    = !ismember ('m', p.UsingDefaults);
  delay     = p.Results.d;
  comp      = p.Results.q;
  compset   = !ismember ('q', p.UsingDefaults);
  where     = p.Results.a;
  whereset  = !ismember ('a', p.UsingDefaults);
  direction = p.Results.FromAbove;

  # If the component for the crossing is not set and the 
  # embedding dimension is set then assign then make the component
  # for the crossing the last one.
  if (dimset && !compset)
    comp=embdim;
  endif

  # Input validation from main()
  # Check if the component for the crossing is not larger
  # than the embedding dimension.
  if (comp > embdim)
        error ('Octave:invalid-input-arg', ...
                "Component for the crossing is larger than dimension");
  endif

  # Check whether the set value of where is bigger
  # or smaller of the largest or smallest element of X
  if (whereset && ((where < min (X)) || (where > max (X))))
    error ('Octave:invalid-input-arg', ...
           "You want to cut outside the data interval which is [%e, %e]", ...
            min, max);
  endif

  # Estimating the size of the output based on poincare()
  top         = length (X) - (embdim - comp) * delay - 1;
  bottom      = (comp-1) * delay + 1;
  if (direction == false) # from below
    output_size = sum ((X(bottom:top) < where) & (X((bottom:top)+1) >= where));
  else # from above
    output_size = sum ((X(bottom:top) > where) & (X((bottom:top)+1) <= where));
  endif

  # Correct X to always have more rows than columns
  trnspsd = false;
  if (rows (X) < columns (X))
    X = X.';
    trnspsd = true;
  endif

  output = __poincare__ (X, embdim, delay, comp, where, direction, ...
                                  output_size);

  if (trnspsd)
    output = output.';
  endif

endfunction

%!shared in
%! idx = (1:1500).';
%! in  = (5 + mod (idx, 165) ./15) .* sin (idx.* 2 * pi /32);

%!fail("poincare(ones(1,100), 'a',2)");

%!test
%% res was generated using TISEAN poincare
%! res = [-8.732896 31.99873;-10.86617 31.99921;-12.99946 31.99945;-15.13276 31.9996;-6.266347 32.00327;-8.399575 31.99862;-10.53284 31.99915;-12.66613 31.99942;-14.79943 31.99958;-5.933037 32.00351;-8.066255 31.9985;-10.19952 31.99909;-12.3328 31.99939;-14.4661 31.99956;-5.599729 32.00378;-7.732935 31.99835;-9.866194 31.99903;-11.99948 31.99936;-14.13278 31.99954;-5.266423 32.00409;-7.399617 31.99819;-9.53287 31.99895;-11.66615 31.99932;-13.79945 31.99952;-15.8539 32.00443;-7.066301 31.998;-9.199547 31.99887;-11.33282 31.99927;-13.46612 31.99949;-15.5982 32.00483;-6.732986 31.99777;-8.866225 31.99878;-10.9995 31.99923;-13.13279 31.99947;-15.26609 31.99961;-6.399672 32.00318;-8.532903 31.99867;-10.66617 31.99917;-12.79946 31.99944;-14.93276 31.99959;-6.066361 32.00341;-8.199583 31.99855;-10.33285 31.99912;-12.46614 31.9994;-14.59944 31.99957];
%! out = poincare (in, 'd', 8);
%! assert (out, res, -1e-6);

%!test
%! out1 = poincare (in, 'd', 8, 'a', 5, 'm', 4, 'q',2);
%! out2 = poincare (in.', 'd', 8, 'a', 5, 'm', 4, 'q',2);
%! assert (out1.', out2);

%!test
%% res is generated using TISEAN poincare
%! res = [-5.563829; -5.461439; -5.390335; -1.853666; -6.040217; -5.754689; -5.584079; -5.474914; -5.400042; -1.78616; -5.78973; -5.605601; -5.489201; -5.410223; -1.715693; -5.828184; -5.628599; -5.504373; -5.420839; -5.360583; -5.870574; -5.653412; -5.520517; -5.432019; -5.368852; -5.916176; -5.680265; -5.537728; -5.443809; -5.377509; -5.96597; -5.709419; -5.556116; -5.45626; -5.386582; -1.879881; -6.018371; -5.741184; -5.575807; -5.469431; -5.396102; -1.813507; -5.77533; -5.596867; -5.483384; -5.406102; -1.744247];
%! out = poincare (in, 'd', 8, 'a', 5, 'm', 4, 'q',2);
%! assert (out(:,3), res, -1e-6);