source: trunk/speed/cppad/det_minor.cpp @ 3311

Last change on this file since 3311 was 3311, checked in by bradbell, 6 years ago

Limit boolsparsity effect to sparese tests
(prepares for more options of this nature)

speed.omh: improve section title.
main.cpp: improve section title.

  • Property svn:keywords set to Id
File size: 3.4 KB
Line 
1/* $Id: det_minor.cpp 3311 2014-05-28 16:21:08Z bradbell $ */
2/* --------------------------------------------------------------------------
3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-14 Bradley M. Bell
4
5CppAD is distributed under multiple licenses. This distribution is under
6the terms of the
7                    Eclipse Public License Version 1.0.
8
9A copy of this license is included in the COPYING file of this distribution.
10Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
11-------------------------------------------------------------------------- */
12/*
13$begin cppad_det_minor.cpp$$
14$spell
15        onetape
16        vector Vector
17        typedef
18        cppad
19        Lu
20        CppAD
21        det
22        hpp
23        const
24        CPPAD_TESTVECTOR
25        bool
26        srand
27        var
28        std
29        cout
30        endl
31$$
32
33$section CppAD Speed: Gradient of Determinant by Minor Expansion$$
34
35$index link_det_minor, cppad$$
36$index cppad, link_det_minor$$
37$index speed, cppad$$
38$index cppad, speed$$
39$index minor, speed cppad$$
40$index determinant, speed cppad$$
41
42$head Specifications$$
43See $cref link_det_minor$$.
44
45$head Implementation$$
46$codep */
47# include <cppad/vector.hpp>
48# include <cppad/speed/det_by_minor.hpp>
49# include <cppad/speed/uniform_01.hpp>
50
51// Note that CppAD uses global_memory at the main program level
52extern bool
53        global_onetape, global_atomic, global_optimize;
54
55bool link_det_minor(
56        size_t                     size     , 
57        size_t                     repeat   , 
58        CppAD::vector<double>     &matrix   ,
59        CppAD::vector<double>     &gradient )
60{
61        // speed test global option values
62        if( global_atomic )
63                return false;
64
65        // -----------------------------------------------------
66        // setup
67
68        // object for computing determinant
69        typedef CppAD::AD<double>       ADScalar; 
70        typedef CppAD::vector<ADScalar> ADVector; 
71        CppAD::det_by_minor<ADScalar>   Det(size);
72
73        size_t i;               // temporary index
74        size_t m = 1;           // number of dependent variables
75        size_t n = size * size; // number of independent variables
76        ADVector   A(n);        // AD domain space vector
77        ADVector   detA(m);     // AD range space vector
78       
79        // vectors of reverse mode weights
80        CppAD::vector<double> w(1);
81        w[0] = 1.;
82
83        // the AD function object
84        CppAD::ADFun<double> f;
85
86        // ---------------------------------------------------------------------
87        if( ! global_onetape ) while(repeat--)
88        {
89                // choose a matrix
90                CppAD::uniform_01(n, matrix);
91                for( i = 0; i < size * size; i++)
92                        A[i] = matrix[i];
93       
94                // declare independent variables
95                Independent(A);
96       
97                // AD computation of the determinant
98                detA[0] = Det(A);
99       
100                // create function object f : A -> detA
101                f.Dependent(A, detA);
102
103                if( global_optimize )
104                        f.optimize();
105       
106                // evaluate the determinant at the new matrix value
107                f.Forward(0, matrix);
108       
109                // evaluate and return gradient using reverse mode
110                gradient = f.Reverse(1, w);
111        }
112        else
113        {
114                // choose a matrix
115                CppAD::uniform_01(n, matrix);
116                for( i = 0; i < size * size; i++)
117                        A[i] = matrix[i];
118       
119                // declare independent variables
120                Independent(A);
121       
122                // AD computation of the determinant
123                detA[0] = Det(A);
124       
125                // create function object f : A -> detA
126                f.Dependent(A, detA);
127
128                if( global_optimize )
129                        f.optimize();
130       
131                // ------------------------------------------------------
132                while(repeat--)
133                {       // get the next matrix
134                        CppAD::uniform_01(n, matrix);
135       
136                        // evaluate the determinant at the new matrix value
137                        f.Forward(0, matrix);
138       
139                        // evaluate and return gradient using reverse mode
140                        gradient = f.Reverse(1, w);
141                }
142        }
143        return true;
144}
145/* $$
146$end
147*/
Note: See TracBrowser for help on using the repository browser.