Fixed a bug in the back-end involving objective evaluation. Separated precompiler...
[openmx:openmx.git] / src / omxMatrix.h
1 /*
2  *  Copyright 2007-2009 The OpenMx Project
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at
7  *
8  *       http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *   Unless required by applicable law or agreed to in writing, software
11  *   distributed under the License is distributed on an "AS IS" BASIS,
12  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License.
15  *
16  */
17
18 /***********************************************************
19  * 
20  *  omxMatrix.h
21  *
22  *  Created: Timothy R. Brick   Date: 2008-11-13 12:33:06
23  *
24  *      Contains header information for the omxMatrix class
25  *   omxDataMatrices hold necessary information to simplify
26  *      dealings between the OpenMX back end and BLAS.
27  *
28  **********************************************************/
29
30 #ifndef _OMXMATRIX_H_
31 #define _OMXMATRIX_H_
32
33 #include "R.h"
34 #include <Rinternals.h> 
35 #include <Rdefines.h>
36 #include <R_ext/Rdynload.h> 
37 #include <R_ext/BLAS.h>
38 #include <R_ext/Lapack.h> 
39 #include "omxDefines.h"
40
41 typedef struct omxMatrix omxMatrix;
42
43 #include "omxAlgebra.h"
44 #include "omxObjective.h"
45 #include "omxState.h"
46
47
48 struct omxMatrix {                                              // A matrix
49                                                                                 //TODO: Improve encapsulation
50 /* Actually Useful Members */
51         int rows, cols;                                         // Matrix size  (specifically, its leading edge)
52         double* data;                                           // Actual Data Pointer
53         unsigned short colMajor;                        // and column-majority.
54
55 /* For Memory Administrivia */
56         unsigned short localData;                       // If data has been malloc'd, and must be freed.
57
58 /* For aliased matrices */      // Maybe this should be a subclass, as well.
59         omxMatrix* aliasedPtr;                          // For now, assumes outside data if aliased.
60         unsigned short originalColMajor;        // Saved for reset of aliased matrix.
61         unsigned short originalRows;            // Saved for reset of aliased matrix.
62         unsigned short originalCols;            // Saved for reset of aliased matrix.
63
64 /* For BLAS Multiplication Speedup */   // Maybe replace some of these with inlines or macros.
65         const char* majority;                           // Filled by compute(), included for speed
66         const char* minority;                           // Filled by compute(), included for speed
67         int leading;                                            // Leading edge; depends on original majority
68         int lagging;                                            // Non-leading edge.
69
70 /* Curent State */
71         omxState* currentState;                         // Optimizer State
72         unsigned short isDirty;                         // Retained, for historical purposes.
73         int lastCompute;                                        // Compute Count Number at last computation
74         int lastRow;                                            // Compute Count Number at last row update (Used for row-by-row computation only)
75
76 /* For Algebra Functions */                             // At most, one of these may be non-NULL.
77         omxAlgebra* algebra;                            // If it's not an algebra, this is NULL.
78         omxObjective* objective;                        // If it's not an objective function, this is NULL.
79
80 /* For inclusion in(or of) other matrices */
81         int numPopulateLocations;
82         omxMatrix** populateFrom;
83         int *populateFromRow, *populateFromCol;
84         int *populateToRow, *populateToCol;
85
86 };
87
88 /* Initialize and Destroy */
89         omxMatrix* omxInitMatrix(omxMatrix* om, int nrows, int ncols, unsigned short colMajor, omxState* os);   // Set up matrix
90         void omxFreeMatrixData(omxMatrix* om);                                                  // Release any held data.
91         void omxFreeAllMatrixData(omxMatrix* om);                                               // Ditto, traversing argument trees
92
93 /* Getters 'n Setters */
94         double omxMatrixElement(omxMatrix *om, int row, int col);
95         double omxAliasedMatrixElement(omxMatrix *om, int row, int col);        // Element from unaliased form of the same matrix
96         double omxVectorElement(omxMatrix *om, int index);
97         void omxSetMatrixElement(omxMatrix *om, int row, int col, double value);
98         double* omxLocationOfMatrixElement(omxMatrix *om, int row, int col);
99         void omxMarkDirty(omxMatrix *om);
100
101 /* Other Functions */
102         void omxResizeMatrix(omxMatrix *source, int nrows, int ncols,
103                                                         unsigned short keepMemory);                                     // Resize, with or without re-initialization
104         omxMatrix* omxNewMatrixFromMxMatrix(SEXP matrix, omxState *state);      // Populate an omxMatrix from an R MxMatrix 
105         void omxProcessMatrixPopulationList(omxMatrix *matrix, SEXP matStruct);
106         void omxCopyMatrix(omxMatrix *dest, omxMatrix *src);                            // Copy across another matrix.  
107         
108 /* Aliased Matrix Functions */
109         void omxAliasMatrix(omxMatrix *alias, omxMatrix* const source);         // Allows aliasing for faster reset.
110         void omxResetAliasedMatrix(omxMatrix *matrix);                                          // Reset to the original majority and realias, if needed.
111         void omxRemoveRowsAndColumns(omxMatrix* om, int numRowsRemoved, int numColsRemoved, int rowsRemoved[], int colsRemoved[]);
112
113 /* Matrix-Internal Helper functions */
114         void omxComputeMatrix(omxMatrix *matrix);
115         void omxPrintMatrix(omxMatrix *source, char* d);                                // Pretty-print a (small) matrix
116         unsigned short int omxMatrixNeedsUpdate(omxMatrix *matrix);
117
118 /* Function wrappers that switch based on inclusion of algebras */
119         void omxPrint(omxMatrix *source, char* d);                                      // Pretty-print a (small) matrix
120         unsigned short int omxNeedsUpdate(omxMatrix *matrix);                                   
121         void omxRecompute(omxMatrix *matrix);
122         void omxCompute(omxMatrix *matrix);
123
124 #endif /* _OMXMATRIX_H_ */