17
17
process(filename, string(""), false );
20
void Transposer::process(string filename, string destFileName, bool forceOverwrite) {
21
void Transposer::process(string filename, string destFileName,
22
bool forceOverwrite) {
21
23
FileVector* src_fv = new FileVector(filename,1);
22
24
unsigned long src_nvars = src_fv->getNumVariables();
23
25
unsigned long src_nobss = src_fv->getNumObservations();
24
26
unsigned int data_size = src_fv->getElementSize();
26
28
string dest_file_name;
27
string src_data_file_name;
28
string dest_data_file_name;
30
if (destFileName=="") {
32
dest_file_name = extract_base_file_name(filename) + "_transposed";
33
src_data_file_name = extract_base_file_name(filename) + FILEVECTOR_DATA_FILE_SUFFIX;
34
dest_data_file_name = extract_base_file_name(filename) + "_transposed" + FILEVECTOR_DATA_FILE_SUFFIX;
29
string src_data_file_name;
30
string dest_data_file_name;
32
if (destFileName == "") {
34
dest_file_name = extract_base_file_name(filename) + "_transposed";
35
src_data_file_name = extract_base_file_name(filename) +
36
FILEVECTOR_DATA_FILE_SUFFIX;
37
dest_data_file_name = extract_base_file_name(filename) + "_transposed" +
38
FILEVECTOR_DATA_FILE_SUFFIX;
36
dest_file_name = destFileName;
37
src_data_file_name = filename + FILEVECTOR_DATA_FILE_SUFFIX;
38
dest_data_file_name = destFileName + FILEVECTOR_DATA_FILE_SUFFIX;
40
dest_file_name = destFileName;
41
src_data_file_name = filename + FILEVECTOR_DATA_FILE_SUFFIX;
42
dest_data_file_name = destFileName + FILEVECTOR_DATA_FILE_SUFFIX;
42
46
if (!forceOverwrite && headerOrDataExists(dest_file_name)) {
43
errorLog << "File already exists: " << dest_file_name << endl << errorExit;
47
errorLog << "File already exists: " << dest_file_name
46
initializeEmptyFile(dest_file_name, src_fv->getNumObservations(), src_fv->getNumVariables(), src_fv->getElementType(),true);
51
initializeEmptyFile(dest_file_name, src_fv->getNumObservations(),
52
src_fv->getNumVariables(), src_fv->getElementType(),
48
55
FileVector* dest_fv = new FileVector(dest_file_name,1);
49
56
dbg << "Copying var/obs names...";
61
dbg << "done" << endl;
56
copy_data(src_data_file_name,dest_data_file_name,src_nvars,src_nobss,data_size);
63
copy_data(src_data_file_name, dest_data_file_name, src_nvars, src_nobss,
57
65
dbg << "done"<< endl;
60
69
void Transposer::write_var_obs_names(FileVector *src_fv, FileVector *dest_fv) {
61
// copy observations and variables names
62
for( unsigned long i=0 ; i < src_fv->getNumVariables(); i++ )
63
dest_fv->writeObservationName( i, src_fv->readVariableName(i) );
65
for( unsigned long i=0 ; i < src_fv->getNumObservations(); i++ )
66
dest_fv->writeVariableName( i, src_fv->readObservationName(i) );
70
void Transposer::copy_data(string src_data_file_name,string dest_data_file_name, unsigned long src_nvars,
71
unsigned long src_nobss, unsigned int data_size) {
72
dbg<< "Copying data..."<< src_nobss << "x"<< src_nvars << endl;
74
unsigned long obs_pages = src_nobss / square_size;
75
if(src_nobss % square_size > 0) obs_pages++;
77
unsigned long var_pages = src_nvars / square_size;
78
if(src_nvars % square_size > 0) var_pages++;
80
ifstream * src_stream = new ifstream();
81
src_stream->open(src_data_file_name.c_str(),ios::in | ios::binary);
83
ofstream * dest_stream = new ofstream;
84
dest_stream->open(dest_data_file_name.c_str(),ios::out | ios::binary);
86
for( unsigned long i =0; i< var_pages;i++) {
87
for( unsigned long j =0; j< obs_pages;j++) {
88
unsigned long obs_length = square_size;
89
if((j + 1 )* square_size > src_nobss)
90
obs_length = src_nobss % square_size;
92
unsigned long var_length = square_size;
93
if((i + 1 )* square_size > src_nvars)
94
var_length = src_nvars % square_size;
96
char * data_part = new (nothrow) char[var_length*obs_length*data_size];
97
if(!data_part) errorLog << "can not allocate memory for data_part" << errorExit;
98
char * data_part_transposed = new (nothrow) char[var_length*obs_length*data_size];
99
if(!data_part_transposed) errorLog << "can not allocate memory for data_part_transposed" << errorExit;
101
read_part(src_stream, data_part, j * square_size , obs_length, i * square_size , var_length, data_size, src_nobss );
102
transpose_part(data_part,data_part_transposed,obs_length,var_length, data_size);
103
write_part(dest_stream, data_part_transposed, i * square_size, var_length, j* square_size , obs_length, data_size, src_nvars );
106
delete[] data_part_transposed;
113
dest_stream->close();
116
dbg<< "data written" << endl;
121
* read next piece of data with size = obs_length x var_length, starting from var_start, obs_start coordinates
123
void Transposer::read_part(ifstream * src_stream, char * data_part, unsigned long obs_start , unsigned long obs_length,
124
unsigned long var_start, unsigned long var_length , unsigned int data_size, unsigned long src_obs_length ) {
125
for(unsigned long i=0; i<var_length ;i++) {
126
//seek to the beginning of the next var
127
unsigned long read_pos = (var_start + i )* src_obs_length + obs_start ;
128
src_stream->seekg( read_pos * data_size , ios::beg );
129
//read next var to input buffer
130
src_stream->read( data_part + ( i * obs_length * data_size ), obs_length * data_size );
135
* write next piece of transposed data with size = obs_length' x var_length'
137
void Transposer::write_part(ofstream * dest_stream, char * data_part_transposed, unsigned long obs_start , unsigned long obs_length,
138
unsigned long var_start, unsigned long var_length , unsigned int data_size, unsigned long dest_obs_length ) {
139
for(unsigned long i=0; i<var_length ;i++) {
140
//seek to the beginning of the next var
141
unsigned long write_pos = (var_start + i )* dest_obs_length + obs_start ;
142
dest_stream->seekp( write_pos * data_size , ios::beg );
143
//write next piece of var to file
144
dest_stream->write( data_part_transposed + ( i * obs_length * data_size ), obs_length * data_size );
149
* transpose piece of data to write to the new file.
150
* original axb matrix flipped to bxa matrix.
70
// copy observations and variables names
71
for (unsigned long i = 0 ; i < src_fv->getNumVariables(); i++ )
72
dest_fv->writeObservationName( i, src_fv->readVariableName(i) );
74
for (unsigned long i = 0 ; i < src_fv->getNumObservations(); i++ )
75
dest_fv->writeVariableName( i, src_fv->readObservationName(i) );
79
void Transposer::copy_data(string src_data_file_name, string dest_data_file_name,
80
unsigned long src_nvars, unsigned long src_nobss,
81
unsigned int data_size) {
82
dbg << "Copying data..." << src_nobss << "x" << src_nvars << endl;
84
unsigned long obs_pages = src_nobss / square_size;
85
if (src_nobss % square_size > 0) obs_pages++;
87
unsigned long var_pages = src_nvars / square_size;
88
if (src_nvars % square_size > 0) var_pages++;
90
ifstream * src_stream = new ifstream();
91
src_stream->open(src_data_file_name.c_str(),ios::in | ios::binary);
93
ofstream * dest_stream = new ofstream;
94
dest_stream->open(dest_data_file_name.c_str(),ios::out | ios::binary);
96
for (unsigned long i = 0; i < var_pages; i++) {
97
for (unsigned long j = 0; j< obs_pages; j++) {
98
unsigned long obs_length = square_size;
99
if ((j + 1 ) * square_size > src_nobss)
100
obs_length = src_nobss % square_size;
102
unsigned long var_length = square_size;
103
if ((i + 1 ) * square_size > src_nvars)
104
var_length = src_nvars % square_size;
107
new (nothrow) char[var_length*obs_length*data_size];
109
errorLog << "can not allocate memory for data_part"
112
char * data_part_transposed =
113
new (nothrow) char[var_length*obs_length*data_size];
114
if (!data_part_transposed)
115
errorLog << "can not allocate memory for data_part_transposed"
118
read_part(src_stream, data_part, j * square_size ,
119
obs_length, i * square_size , var_length,
120
data_size, src_nobss);
121
transpose_part(data_part, data_part_transposed, obs_length,
122
var_length, data_size);
123
write_part(dest_stream, data_part_transposed, i * square_size,
124
var_length, j * square_size, obs_length,
125
data_size, src_nvars);
128
delete[] data_part_transposed;
135
dest_stream->close();
138
dbg << "data written" << endl;
143
* read next piece of data with size = obs_length x var_length,
144
* starting from var_start, obs_start coordinates
146
void Transposer::read_part(ifstream * src_stream, char * data_part,
147
unsigned long obs_start, unsigned long obs_length,
148
unsigned long var_start, unsigned long var_length,
149
unsigned int data_size,
150
unsigned long src_obs_length) {
151
for (unsigned long i = 0; i < var_length; i++) {
152
//seek to the beginning of the next var
153
unsigned long read_pos = (var_start + i ) * src_obs_length + obs_start;
154
src_stream->seekg(read_pos * data_size, ios::beg);
155
//read next var to input buffer
156
src_stream->read(data_part + ( i * obs_length * data_size ),
157
obs_length * data_size );
163
* write next piece of transposed data with size = obs_length' x var_length'
165
void Transposer::write_part(ofstream * dest_stream, char * data_part_transposed,
166
unsigned long obs_start, unsigned long obs_length,
167
unsigned long var_start, unsigned long var_length,
168
unsigned int data_size,
169
unsigned long dest_obs_length) {
170
for (unsigned long i = 0; i < var_length; i++) {
171
// seek to the beginning of the next var
172
unsigned long write_pos = (var_start + i ) * dest_obs_length + obs_start;
173
dest_stream->seekp(write_pos * data_size, ios::beg);
174
// write next piece of var to file
175
dest_stream->write(data_part_transposed + (i * obs_length * data_size),
176
obs_length * data_size );
182
* transpose piece of data to write to the new file.
183
* original axb matrix flipped to bxa matrix.
152
185
void Transposer::transpose_part(void * data_part, void * data_part_transposed,
153
unsigned long obs_length,unsigned long var_length, unsigned int data_size ) {
154
for(unsigned long i=0; i<var_length ;i++) {
155
for(unsigned long j=0; j<obs_length ;j++) {
156
int from_pos = (i * obs_length + j )* data_size;
157
int to_pos = ( j * var_length + i ) * data_size;
158
memcpy((char*)data_part_transposed + to_pos,
159
(char*)data_part + from_pos,
186
unsigned long obs_length,
187
unsigned long var_length,
188
unsigned int data_size) {
189
for (unsigned long i = 0; i < var_length; i++) {
190
for(unsigned long j = 0; j < obs_length; j++) {
191
int from_pos = (i * obs_length + j ) * data_size;
192
int to_pos = ( j * var_length + i ) * data_size;
193
memcpy((char*)data_part_transposed + to_pos,
194
(char*)data_part + from_pos,