Further changes to mxData front and back ends.
[openmx:openmx.git] / src / omxData.h
1 /*
2  *  Copyright 2007-2013 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  *  omxData.h
21  *
22  *  Created: Timothy R. Brick   Date: 2009-07-15
23  *
24  *      Contains header information for the omxData class
25  *   omxData objects keep data objects in whatever form
26  *   they might take.
27  *
28  **********************************************************/
29
30 #ifndef _OMXDATA_H_
31 #define _OMXDATA_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 omxData omxData;
42 typedef struct omxContiguousData omxContiguousData;
43
44 #include "omxAlgebra.h"
45 #include "omxFitFunction.h"
46 #include "omxState.h"
47
48 struct omxContiguousData {
49         int isContiguous;
50         int start;
51         int length;
52 };
53
54 struct omxData {                                                // A matrix
55         //TODO: Improve encapsulation
56         omxMatrix* dataMat;  // DO NOT ACCESS THIS FIELD DIRECTLY; USE ACCESSOR METHODS
57         omxMatrix* meansMat;                            // The means, as an omxMatrixObject
58         omxMatrix* acovMat;                                     // The asymptotic covariance, as an omxMatrixObject, added for ordinal WLS
59         omxMatrix* obsThresholdsMat;            // The observed thresholds, added for ordinal WLS
60         double numObs;                                          // Number of observations
61         const char *_type;
62         
63         int* location;                                          // Which of the following contains the data column
64         double** realData;                                      // The actual data objects if numeric
65         int** intData;                                          // The actual data objects if ordinal
66         int* indexVector;                                               // The "official" index into the data set
67         int* identicalDefs;                                     // Number of consecutive rows with identical def. vars
68         int* identicalMissingness;                      // Number of consecutive rows with identical missingness patterns
69         int* identicalRows;                                     // Number of consecutive rows with identical data
70         int numFactor, numNumeric;  // Number of ordinal and continuous columns
71         short isDynamic;             // Reserved for when there's actually dynamic data.
72         /* Useful Members */
73         int rows, cols;                                         // Matrix size 
74
75         omxState* currentState;                         // The Current Optimizer State  // Might not want this.
76 };
77
78 /* Initialize and Destroy */
79 omxData* omxInitData(omxState* os);
80 omxData* omxNewDataFromMxData(SEXP dataObject, omxState* state);
81 omxData* omxDataLookupFromState(SEXP dataObject, omxState* state);      // Retrieves a data object from the state
82 void omxFreeData(omxData* od);                                  // Release any held data.
83 void omxSetContiguousDataColumns(omxContiguousData* contiguous, omxData* data, omxMatrix* colList);
84
85 /* Getters 'n Setters */
86 double omxDoubleDataElement(omxData *od, int row, int col);                                     // Returns one data object as a double
87 int omxIntDataElement(omxData *od, int row, int col);                                           // Returns one data object as an integer
88 omxMatrix* omxDataMatrix(omxData *od, omxMatrix* om);                                           // Populates a matrix with the data (use for covariance matrices)
89 omxMatrix* omxDataMeans(omxData *od, omxMatrix* colList, omxMatrix* om);        // Populates a matrix with data means
90 omxMatrix* omxDataAcov(omxData *od, omxMatrix* om); //TODO check this definition
91 //omxThresholdColumn* omxDataThresholds(omxData *od); //TODO define this
92 // PROBLEM: omxThresholdColumn does not exist because data are prior to expectations.
93 void omxDataRow(omxData *od, int row, omxMatrix* colList, omxMatrix* om);// Populates a matrix with a single data row
94 void omxContiguousDataRow(omxData *od, int row, int start, int length, omxMatrix* om);// Populates a matrix with a contiguous data row
95 int omxDataIndex(omxData *od, int row);                                                                         // Returns the unsorted (original) index of the current row
96 int omxDataNumIdenticalRows(omxData *od, int row);                                                      // Returns the number of rows identical to this one in the data set
97 int omxDataNumIdenticalMissingness(omxData *od, int row);                                       // Returns the number of rows with definition variables and missingness identical to this one in the data set
98 int omxDataNumIdenticalContinuousRows(omxData *od, int row);                // Number of rows with continuous variables remaining, or Inf if no continous vars
99 int omxDataNumIdenticalContinuousMissingness(omxData *od, int row);         // Number of rows with continuous variables remaining, or Inf if no continous vars
100 int omxDataNumIdenticalOrdinalRows(omxData *od, int row);
101 int omxDataNumIdenticalOrdinalMissingness(omxData *od, int row);
102 int omxDataNumIdenticalDefs(omxData *od, int row);                                                      // Returns the number of rows with definition variables identical to this one in the data set
103         
104 double omxDataNumObs(omxData *od);                                                                                      // Returns number of obs in the dataset
105 unsigned short int omxDataColumnIsFactor(omxData *od, int col);                         // Returns 0 if column is not a factor
106 const char *omxDataType(omxData *od);                         // TODO: Should this be an ENUM?
107         
108 int omxDataNumNumeric(omxData *od);                   // Number of numeric columns in the data set
109 int omxDataNumFactor(omxData *od);                    // Number of factor columns in the data set
110
111 void resetDefinitionVariables(double *oldDefs, int numDefs);
112
113 /* Function wrappers that switch based on inclusion of algebras */
114
115 void omxPrintData(omxData *od, const char *header);
116
117 #endif /* _OMXDATA_H_ */