GNU Octave  4.2.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ccolamd.cc
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2005-2017 David Bateman
4 
5 This file is part of Octave.
6 
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 // This is the octave interface to ccolamd, which bore the copyright given
24 // in the help of the functions.
25 
26 #if defined (HAVE_CONFIG_H)
27 # include "config.h"
28 #endif
29 
30 #include <cstdlib>
31 
32 #include <string>
33 #include <vector>
34 
35 #include "ov.h"
36 #include "defun-dld.h"
37 #include "errwarn.h"
38 #include "pager.h"
39 #include "ov-re-mat.h"
40 
41 #include "ov-re-sparse.h"
42 #include "ov-cx-sparse.h"
43 
44 #include "oct-sparse.h"
45 #include "oct-locbuf.h"
46 
47 #if defined (OCTAVE_ENABLE_64)
48 # define CCOLAMD_NAME(name) ccolamd_l ## name
49 # define CSYMAMD_NAME(name) csymamd_l ## name
50 #else
51 # define CCOLAMD_NAME(name) ccolamd ## name
52 # define CSYMAMD_NAME(name) csymamd ## name
53 #endif
54 
55 DEFUN_DLD (ccolamd, args, nargout,
56  doc: /* -*- texinfo -*-
57 @deftypefn {} {@var{p} =} ccolamd (@var{S})
58 @deftypefnx {} {@var{p} =} ccolamd (@var{S}, @var{knobs})
59 @deftypefnx {} {@var{p} =} ccolamd (@var{S}, @var{knobs}, @var{cmember})
60 @deftypefnx {} {[@var{p}, @var{stats}] =} ccolamd (@dots{})
61 
62 Constrained column approximate minimum degree permutation.
63 
64 @code{@var{p} = ccolamd (@var{S})} returns the column approximate minimum
65 degree permutation vector for the sparse matrix @var{S}. For a
66 non-symmetric matrix @var{S}, @code{@var{S}(:, @var{p})} tends to have
67 sparser LU@tie{}factors than @var{S}.
68 @code{chol (@var{S}(:, @var{p})' * @var{S}(:, @var{p}))} also tends to be
69 sparser than @code{chol (@var{S}' * @var{S})}.
70 @code{@var{p} = ccolamd (@var{S}, 1)} optimizes the ordering for
71 @code{lu (@var{S}(:, @var{p}))}. The ordering is followed by a column
72 elimination tree post-ordering.
73 
74 @var{knobs} is an optional 1-element to 5-element input vector, with a
75 default value of @code{[0 10 10 1 0]} if not present or empty. Entries not
76 present are set to their defaults.
77 
78 @table @code
79 @item @var{knobs}(1)
80 if nonzero, the ordering is optimized for @code{lu (S(:, p))}. It will be a
81 poor ordering for @code{chol (@var{S}(:, @var{p})' * @var{S}(:, @var{p}))}.
82 This is the most important knob for ccolamd.
83 
84 @item @var{knobs}(2)
85 if @var{S} is m-by-n, rows with more than
86 @code{max (16, @var{knobs}(2) * sqrt (n))} entries are ignored.
87 
88 @item @var{knobs}(3)
89 columns with more than
90 @code{max (16, @var{knobs}(3) * sqrt (min (@var{m}, @var{n})))} entries are
91 ignored and ordered last in the output permutation
92 (subject to the cmember constraints).
93 
94 @item @var{knobs}(4)
95 if nonzero, aggressive absorption is performed.
96 
97 @item @var{knobs}(5)
98 if nonzero, statistics and knobs are printed.
99 
100 @end table
101 
102 @var{cmember} is an optional vector of length @math{n}. It defines the
103 constraints on the column ordering. If @code{@var{cmember}(j) = @var{c}},
104 then column @var{j} is in constraint set @var{c} (@var{c} must be in the
105 range 1 to n). In the output permutation @var{p}, all columns in set 1
106 appear first, followed by all columns in set 2, and so on.
107 @code{@var{cmember} = ones (1,n)} if not present or empty.
108 @code{ccolamd (@var{S}, [], 1 : n)} returns @code{1 : n}
109 
110 @code{@var{p} = ccolamd (@var{S})} is about the same as
111 @code{@var{p} = colamd (@var{S})}. @var{knobs} and its default values
112 differ. @code{colamd} always does aggressive absorption, and it finds an
113 ordering suitable for both @code{lu (@var{S}(:, @var{p}))} and @code{chol
114 (@var{S}(:, @var{p})' * @var{S}(:, @var{p}))}; it cannot optimize its
115 ordering for @code{lu (@var{S}(:, @var{p}))} to the extent that
116 @code{ccolamd (@var{S}, 1)} can.
117 
118 @var{stats} is an optional 20-element output vector that provides data
119 about the ordering and the validity of the input matrix @var{S}. Ordering
120 statistics are in @code{@var{stats}(1 : 3)}. @code{@var{stats}(1)} and
121 @code{@var{stats}(2)} are the number of dense or empty rows and columns
122 ignored by @sc{ccolamd} and @code{@var{stats}(3)} is the number of garbage
123 collections performed on the internal data structure used by @sc{ccolamd}
124 (roughly of size @code{2.2 * nnz (@var{S}) + 4 * @var{m} + 7 * @var{n}}
125 integers).
126 
127 @code{@var{stats}(4 : 7)} provide information if CCOLAMD was able to
128 continue. The matrix is OK if @code{@var{stats}(4)} is zero, or 1 if
129 invalid. @code{@var{stats}(5)} is the rightmost column index that is
130 unsorted or contains duplicate entries, or zero if no such column exists.
131 @code{@var{stats}(6)} is the last seen duplicate or out-of-order row
132 index in the column index given by @code{@var{stats}(5)}, or zero if no
133 such row index exists. @code{@var{stats}(7)} is the number of duplicate
134 or out-of-order row indices. @code{@var{stats}(8 : 20)} is always zero in
135 the current version of @sc{ccolamd} (reserved for future use).
136 
137 The authors of the code itself are @nospell{S. Larimore, T. Davis}
138 (Univ. of Florida) and @nospell{S. Rajamanickam} in collaboration with
139 @nospell{J. Bilbert and E. Ng}. Supported by the National Science Foundation
140 @nospell{(DMS-9504974, DMS-9803599, CCR-0203270)}, and a grant from
141 @nospell{Sandia} National Lab.
142 See @url{http://www.cise.ufl.edu/research/sparse} for
143 ccolamd, csymamd, amd, colamd, symamd, and other related orderings.
144 @seealso{colamd, csymamd}
145 @end deftypefn */)
146 {
147 #if defined (HAVE_CCOLAMD)
148 
149  int nargin = args.length ();
150 
151  if (nargin < 1 || nargin > 3)
152  print_usage ();
153 
154  octave_value_list retval (nargout == 2 ? 2 : 1);
155  int spumoni = 0;
156 
157  // Get knobs
158  OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS);
159  CCOLAMD_NAME (_set_defaults) (knobs);
160 
161  // Check for user-passed knobs
162  if (nargin > 1)
163  {
164  NDArray User_knobs = args(1).array_value ();
165  int nel_User_knobs = User_knobs.numel ();
166 
167  if (nel_User_knobs > 0)
168  knobs[CCOLAMD_LU] = (User_knobs(0) != 0);
169  if (nel_User_knobs > 1)
170  knobs[CCOLAMD_DENSE_ROW] = User_knobs(1);
171  if (nel_User_knobs > 2)
172  knobs[CCOLAMD_DENSE_COL] = User_knobs(2);
173  if (nel_User_knobs > 3)
174  knobs[CCOLAMD_AGGRESSIVE] = (User_knobs(3) != 0);
175  if (nel_User_knobs > 4)
176  spumoni = (User_knobs(4) != 0);
177 
178  // print knob settings if spumoni is set
179  if (spumoni)
180  {
181  octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "."
182  << CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE
183  << ":\nknobs(1): " << User_knobs(0) << ", order for ";
184  if (knobs[CCOLAMD_LU] != 0)
185  octave_stdout << "lu (A)\n";
186  else
187  octave_stdout << "chol (A'*A)\n";
188 
189  if (knobs[CCOLAMD_DENSE_ROW] >= 0)
190  octave_stdout << "knobs(2): " << User_knobs(1)
191  << ", rows with > max (16,"
192  << knobs[CCOLAMD_DENSE_ROW]
193  << "*sqrt (size(A,2)))"
194  << " entries removed\n";
195  else
196  octave_stdout << "knobs(2): " << User_knobs(1)
197  << ", no dense rows removed\n";
198 
199  if (knobs[CCOLAMD_DENSE_COL] >= 0)
200  octave_stdout << "knobs(3): " << User_knobs(2)
201  << ", cols with > max (16,"
202  << knobs[CCOLAMD_DENSE_COL] << "*sqrt (size(A)))"
203  << " entries removed\n";
204  else
205  octave_stdout << "knobs(3): " << User_knobs(2)
206  << ", no dense columns removed\n";
207 
208  if (knobs[CCOLAMD_AGGRESSIVE] != 0)
209  octave_stdout << "knobs(4): " << User_knobs(3)
210  << ", aggressive absorption: yes";
211  else
212  octave_stdout << "knobs(4): " << User_knobs(3)
213  << ", aggressive absorption: no";
214 
215  octave_stdout << "knobs(5): " << User_knobs(4)
216  << ", statistics and knobs printed\n";
217  }
218  }
219 
220  octave_idx_type n_row, n_col, nnz;
221  octave_idx_type *ridx, *cidx;
223  SparseMatrix sm;
224 
225  if (args(0).is_sparse_type ())
226  {
227  if (args(0).is_complex_type ())
228  {
229  scm = args(0).sparse_complex_matrix_value ();
230  n_row = scm.rows ();
231  n_col = scm.cols ();
232  nnz = scm.nnz ();
233  ridx = scm.xridx ();
234  cidx = scm.xcidx ();
235  }
236  else
237  {
238  sm = args(0).sparse_matrix_value ();
239 
240  n_row = sm.rows ();
241  n_col = sm.cols ();
242  nnz = sm.nnz ();
243  ridx = sm.xridx ();
244  cidx = sm.xcidx ();
245  }
246  }
247  else
248  {
249  if (args(0).is_complex_type ())
250  sm = SparseMatrix (real (args(0).complex_matrix_value ()));
251  else
252  sm = SparseMatrix (args(0).matrix_value ());
253 
254  n_row = sm.rows ();
255  n_col = sm.cols ();
256  nnz = sm.nnz ();
257  ridx = sm.xridx ();
258  cidx = sm.xcidx ();
259  }
260 
261  // Allocate workspace for ccolamd
263  for (octave_idx_type i = 0; i < n_col+1; i++)
264  p[i] = cidx[i];
265 
266  octave_idx_type Alen = CCOLAMD_NAME (_recommended) (nnz, n_row, n_col);
268  for (octave_idx_type i = 0; i < nnz; i++)
269  A[i] = ridx[i];
270 
271  OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS);
272 
273  if (nargin > 2)
274  {
275  NDArray in_cmember = args(2).array_value ();
276  octave_idx_type cslen = in_cmember.numel ();
277  OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen);
278  for (octave_idx_type i = 0; i < cslen; i++)
279  // convert cmember from 1-based to 0-based
280  cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1);
281 
282  if (cslen != n_col)
283  error ("ccolamd: CMEMBER must be of length equal to #cols of A");
284 
285  // Order the columns (destroys A)
286  if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, cmember))
287  {
288  CCOLAMD_NAME (_report) (stats);
289 
290  error ("ccolamd: internal error!");
291  }
292  }
293  else
294  {
295  // Order the columns (destroys A)
296  if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, 0))
297  {
298  CCOLAMD_NAME (_report) (stats);
299 
300  error ("ccolamd: internal error!");
301  }
302  }
303 
304  // return the permutation vector
305  NDArray out_perm (dim_vector (1, n_col));
306  for (octave_idx_type i = 0; i < n_col; i++)
307  out_perm(i) = p[i] + 1;
308 
309  retval(0) = out_perm;
310 
311  // print stats if spumoni > 0
312  if (spumoni > 0)
313  CCOLAMD_NAME (_report) (stats);
314 
315  // Return the stats vector
316  if (nargout == 2)
317  {
318  NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
319  for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
320  out_stats(i) = stats[i];
321  retval(1) = out_stats;
322 
323  // fix stats (5) and (6), for 1-based information on
324  // jumbled matrix. note that this correction doesn't
325  // occur if symamd returns FALSE
326  out_stats(CCOLAMD_INFO1)++;
327  out_stats(CCOLAMD_INFO2)++;
328  }
329 
330  return retval;
331 
332 #else
333 
334  octave_unused_parameter (args);
335  octave_unused_parameter (nargout);
336 
337  err_disabled_feature ("ccolamd", "CCOLAMD");
338 
339 #endif
340 }
341 
342 DEFUN_DLD (csymamd, args, nargout,
343  doc: /* -*- texinfo -*-
344 @deftypefn {} {@var{p} =} csymamd (@var{S})
345 @deftypefnx {} {@var{p} =} csymamd (@var{S}, @var{knobs})
346 @deftypefnx {} {@var{p} =} csymamd (@var{S}, @var{knobs}, @var{cmember})
347 @deftypefnx {} {[@var{p}, @var{stats}] =} csymamd (@dots{})
348 
349 For a symmetric positive definite matrix @var{S}, return the permutation
350 vector @var{p} such that @code{@var{S}(@var{p},@var{p})} tends to have a
351 sparser Cholesky@tie{}factor than @var{S}.
352 
353 Sometimes @code{csymamd} works well for symmetric indefinite matrices too.
354 The matrix @var{S} is assumed to be symmetric; only the strictly lower
355 triangular part is referenced. @var{S} must be square. The ordering is
356 followed by an elimination tree post-ordering.
357 
358 @var{knobs} is an optional 1-element to 3-element input vector, with a
359 default value of @code{[10 1 0]}. Entries not present are set to their
360 defaults.
361 
362 @table @code
363 @item @var{knobs}(1)
364 If @var{S} is n-by-n, then rows and columns with more than
365 @code{max(16,@var{knobs}(1)*sqrt(n))} entries are ignored, and ordered
366 last in the output permutation (subject to the cmember constraints).
367 
368 @item @var{knobs}(2)
369 If nonzero, aggressive absorption is performed.
370 
371 @item @var{knobs}(3)
372 If nonzero, statistics and knobs are printed.
373 
374 @end table
375 
376 @var{cmember} is an optional vector of length n. It defines the constraints
377 on the ordering. If @code{@var{cmember}(j) = @var{S}}, then row/column j is
378 in constraint set @var{c} (@var{c} must be in the range 1 to n). In the
379 output permutation @var{p}, rows/columns in set 1 appear first, followed
380 by all rows/columns in set 2, and so on. @code{@var{cmember} = ones (1,n)}
381 if not present or empty. @code{csymamd (@var{S},[],1:n)} returns
382 @code{1:n}.
383 
384 @code{@var{p} = csymamd (@var{S})} is about the same as
385 @code{@var{p} = symamd (@var{S})}. @var{knobs} and its default values
386 differ.
387 
388 @code{@var{stats}(4:7)} provide information if CCOLAMD was able to
389 continue. The matrix is OK if @code{@var{stats}(4)} is zero, or 1 if
390 invalid. @code{@var{stats}(5)} is the rightmost column index that is
391 unsorted or contains duplicate entries, or zero if no such column exists.
392 @code{@var{stats}(6)} is the last seen duplicate or out-of-order row
393 index in the column index given by @code{@var{stats}(5)}, or zero if no
394 such row index exists. @code{@var{stats}(7)} is the number of duplicate
395 or out-of-order row indices. @code{@var{stats}(8:20)} is always zero in
396 the current version of @sc{ccolamd} (reserved for future use).
397 
398 The authors of the code itself are @nospell{S. Larimore, T. Davis}
399 (Univ. of Florida) and @nospell{S. Rajamanickam} in collaboration with
400 @nospell{J. Bilbert and E. Ng}. Supported by the National Science Foundation
401 @nospell{(DMS-9504974, DMS-9803599, CCR-0203270)}, and a grant from
402 @nospell{Sandia} National Lab.
403 See @url{http://www.cise.ufl.edu/research/sparse} for
404 ccolamd, csymamd, amd, colamd, symamd, and other related orderings.
405 @seealso{symamd, ccolamd}
406 @end deftypefn */)
407 {
408 #if defined (HAVE_CCOLAMD)
409 
410  int nargin = args.length ();
411 
412  if (nargin < 1 || nargin > 3)
413  print_usage ();
414 
415  octave_value_list retval (nargout == 2 ? 2 : 1);
416  int spumoni = 0;
417 
418  // Get knobs
419  OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS);
420  CCOLAMD_NAME (_set_defaults) (knobs);
421 
422  // Check for user-passed knobs
423  if (nargin > 1)
424  {
425  NDArray User_knobs = args(1).array_value ();
426  int nel_User_knobs = User_knobs.numel ();
427 
428  if (nel_User_knobs > 0)
429  knobs[CCOLAMD_DENSE_ROW] = User_knobs(0);
430  if (nel_User_knobs > 0)
431  knobs[CCOLAMD_AGGRESSIVE] = User_knobs(1);
432  if (nel_User_knobs > 1)
433  spumoni = static_cast<int> (User_knobs(2));
434 
435  // print knob settings if spumoni is set
436  if (spumoni)
437  {
438  octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION
439  << "." << CCOLAMD_SUB_VERSION
440  << ", " << CCOLAMD_DATE << "\n";
441 
442  if (knobs[CCOLAMD_DENSE_ROW] >= 0)
443  octave_stdout << "knobs(1): " << User_knobs(0)
444  << ", rows/cols with > max (16,"
445  << knobs[CCOLAMD_DENSE_ROW]
446  << "*sqrt (size(A,2)))"
447  << " entries removed\n";
448  else
449  octave_stdout << "knobs(1): " << User_knobs(0)
450  << ", no dense rows/cols removed\n";
451 
452  if (knobs[CCOLAMD_AGGRESSIVE] != 0)
453  octave_stdout << "knobs(2): " << User_knobs(1)
454  << ", aggressive absorption: yes";
455  else
456  octave_stdout << "knobs(2): " << User_knobs(1)
457  << ", aggressive absorption: no";
458 
459  octave_stdout << "knobs(3): " << User_knobs(2)
460  << ", statistics and knobs printed\n";
461  }
462  }
463 
464  octave_idx_type n_row, n_col;
465  octave_idx_type *ridx, *cidx;
466  SparseMatrix sm;
468 
469  if (args(0).is_sparse_type ())
470  {
471  if (args(0).is_complex_type ())
472  {
473  scm = args(0).sparse_complex_matrix_value ();
474  n_row = scm.rows ();
475  n_col = scm.cols ();
476  ridx = scm.xridx ();
477  cidx = scm.xcidx ();
478  }
479  else
480  {
481  sm = args(0).sparse_matrix_value ();
482  n_row = sm.rows ();
483  n_col = sm.cols ();
484  ridx = sm.xridx ();
485  cidx = sm.xcidx ();
486  }
487  }
488  else
489  {
490  if (args(0).is_complex_type ())
491  sm = SparseMatrix (real (args(0).complex_matrix_value ()));
492  else
493  sm = SparseMatrix (args(0).matrix_value ());
494 
495  n_row = sm.rows ();
496  n_col = sm.cols ();
497  ridx = sm.xridx ();
498  cidx = sm.xcidx ();
499  }
500 
501  if (n_row != n_col)
502  err_square_matrix_required ("csymamd", "S");
503 
504  // Allocate workspace for symamd
505  OCTAVE_LOCAL_BUFFER (octave_idx_type, perm, n_col+1);
506  OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS);
507 
508  if (nargin > 2)
509  {
510  NDArray in_cmember = args(2).array_value ();
511  octave_idx_type cslen = in_cmember.numel ();
512  OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen);
513  for (octave_idx_type i = 0; i < cslen; i++)
514  // convert cmember from 1-based to 0-based
515  cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1);
516 
517  if (cslen != n_col)
518  error ("csymamd: CMEMBER must be of length equal to #cols of A");
519 
520  if (! CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats,
521  &calloc, &free, cmember, -1))
522  {
523  CSYMAMD_NAME (_report)(stats);
524 
525  error ("csymamd: internal error!");
526  }
527  }
528  else
529  {
530  if (! CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats,
531  &calloc, &free, 0, -1))
532  {
533  CSYMAMD_NAME (_report)(stats);
534 
535  error ("csymamd: internal error!");
536  }
537  }
538 
539  // return the permutation vector
540  NDArray out_perm (dim_vector (1, n_col));
541  for (octave_idx_type i = 0; i < n_col; i++)
542  out_perm(i) = perm[i] + 1;
543 
544  retval(0) = out_perm;
545 
546  // print stats if spumoni > 0
547  if (spumoni > 0)
548  CSYMAMD_NAME (_report)(stats);
549 
550  // Return the stats vector
551  if (nargout == 2)
552  {
553  NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
554  for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
555  out_stats(i) = stats[i];
556  retval(1) = out_stats;
557 
558  // fix stats (5) and (6), for 1-based information on
559  // jumbled matrix. note that this correction doesn't
560  // occur if symamd returns FALSE
561  out_stats(CCOLAMD_INFO1)++;
562  out_stats(CCOLAMD_INFO2)++;
563  }
564 
565  return retval;
566 
567 #else
568 
569  octave_unused_parameter (args);
570  octave_unused_parameter (nargout);
571 
572  err_disabled_feature ("csymamd", "CCOLAMD");
573 
574 #endif
575 }
octave_idx_type * xridx(void)
Definition: Sparse.h:536
octave_idx_type cols(void) const
Definition: Sparse.h:272
octave_idx_type rows(void) const
Definition: Sparse.h:271
OCTINTERP_API void print_usage(void)
Definition: defun.cc:52
octave_idx_type numel(void) const
Number of elements in the array.
Definition: Array.h:363
octave_idx_type * xcidx(void)
Definition: Sparse.h:549
void error(const char *fmt,...)
Definition: error.cc:570
void err_square_matrix_required(const char *fcn, const char *name)
Definition: errwarn.cc:112
octave_idx_type nnz(void) const
Actual number of nonzero terms.
Definition: Sparse.h:253
JNIEnv void * args
Definition: ov-java.cc:67
#define CSYMAMD_NAME(name)
Definition: ccolamd.cc:52
OCTAVE_EXPORT octave_value_list return the number of command line arguments passed to Octave If called with the optional argument the function xample nargout(@histc)
Definition: ov-usr-fcn.cc:935
int nargin
Definition: graphics.cc:10115
octave_value retval
Definition: data.cc:6294
#define octave_stdout
Definition: pager.h:146
void free(void *)
=val(i)}if ode{val(i)}occurs in table i
Definition: lookup.cc:239
p
Definition: lu.cc:138
#define OCTAVE_LOCAL_BUFFER(T, buf, size)
Definition: oct-locbuf.h:200
#define DEFUN_DLD(name, args_name, nargout_name, doc)
Definition: defun-dld.h:45
ColumnVector real(const ComplexColumnVector &a)
Definition: dColVector.cc:136
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:87
void err_disabled_feature(const std::string &fcn, const std::string &feature, const std::string &pkg)
Definition: errwarn.cc:50
#define CCOLAMD_NAME(name)
Definition: ccolamd.cc:51
F77_RET_T const F77_INT F77_CMPLX * A