Commit ab01c2d7d08eb9b32cca2ed00c498be132d7e0b5

Authored by David Mayerich
1 parent 0d840342

Edits to update STIM libraries. Still has a bug (determinants require OpenCV)

1 #Specify the version being used aswell as the language 1 #Specify the version being used aswell as the language
2 -cmake_minimum_required(VERSION 2.8) 2 +cmake_minimum_required(VERSION 3.16)
3 3
4 #Name your project here 4 #Name your project here
5 project(ga-gpu) 5 project(ga-gpu)
@@ -32,8 +32,8 @@ SET( CUDA_NVCC_FLAGS "--gpu-architecture=compute_50 --gpu-code=sm_50,compute_50" @@ -32,8 +32,8 @@ SET( CUDA_NVCC_FLAGS "--gpu-architecture=compute_50 --gpu-code=sm_50,compute_50"
32 32
33 #find packages----------------------------------- 33 #find packages-----------------------------------
34 #find OpenCV 34 #find OpenCV
35 -find_package(OpenCV REQUIRED)  
36 -add_definitions(-DUSING_OPENCV) 35 +#find_package(OpenCV REQUIRED)
  36 +#add_definitions(-DUSING_OPENCV)
37 37
38 #find the pthreads package 38 #find the pthreads package
39 find_package(Threads) 39 find_package(Threads)
@@ -3,20 +3,14 @@ @@ -3,20 +3,14 @@
3 3
4 include(FindPackageHandleStandardArgs) 4 include(FindPackageHandleStandardArgs)
5 5
6 -set(STIM_INCLUDE_DIR $ENV{STIMLIB_PATH}) 6 +set(STIM_ROOT $ENV{STIM_ROOT})
7 7
8 -find_package_handle_standard_args(STIM DEFAULT_MSG STIM_INCLUDE_DIR) 8 +IF(NOT STIM_ROOT)
  9 + MESSAGE("ERROR: STIM_ROOT environment variable must be set!")
  10 +ENDIF(NOT STIM_ROOT)
9 11
10 -if(STIM_FOUND)  
11 - set(STIM_INCLUDE_DIRS ${STIM_INCLUDE_DIR})  
12 -elseif(STIM_FOUND)  
13 - #if the STIM library isn't found, download it  
14 - #file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/stimlib) #remove the stimlib directory if it exists  
15 - #set(STIM_GIT "https://git.stim.ee.uh.edu/codebase/stimlib.git")  
16 - #execute_process(COMMAND git clone --depth 1 ${STIM_GIT} WORKING_DIRECTORY ${CMAKE_BINARY_DIR})  
17 - #set(STIM_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/stimlib" CACHE TYPE PATH)  
18 - message("STIM library not found. Set the STIMLIB_PATH environment variable to the STIMLIB location.")  
19 - message("STIMLIB can be found here: https://git.stim.ee.uh.edu/codebase/stimlib")  
20 -endif(STIM_FOUND) 12 + FIND_PATH(STIM_INCLUDE_DIRS DOC "Path to STIM include directory."
  13 + NAMES stim/image/image.h
  14 + PATHS ${STIM_ROOT})
21 15
22 -find_package_handle_standard_args(STIM DEFAULT_MSG STIM_INCLUDE_DIR) 16 +find_package_handle_standard_args(STIM DEFAULT_MSG STIM_INCLUDE_DIRS)
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 #include <iostream> 4 #include <iostream>
5 #include <thread> 5 #include <thread>
6 #include <complex> 6 #include <complex>
7 -#include <cv.h> 7 +//#include <cv.h>
8 #include <stdio.h> 8 #include <stdio.h>
9 #include <stdlib.h> 9 #include <stdlib.h>
10 #include <iostream> 10 #include <iostream>
@@ -153,6 +153,7 @@ void gpuComputeEignS( size_t g, size_t fea){ @@ -153,6 +153,7 @@ void gpuComputeEignS( size_t g, size_t fea){
153 std::cout<<std::endl; 153 std::cout<<std::endl;
154 } 154 }
155 155
  156 + ///DETERMINANT CURRENTLY REQUIRES OPENCV
156 cv::Mat newSw = cv::Mat((int)r, (int)r, CV_32FC1, nSw); //within scatter of gnome g in the population 157 cv::Mat newSw = cv::Mat((int)r, (int)r, CV_32FC1, nSw); //within scatter of gnome g in the population
157 cv::Mat newSb = cv::Mat((int)r, (int)r, CV_32FC1, nSb); //within scatter of gnome g in the population 158 cv::Mat newSb = cv::Mat((int)r, (int)r, CV_32FC1, nSb); //within scatter of gnome g in the population
158 159
@@ -167,20 +168,6 @@ void gpuComputeEignS( size_t g, size_t fea){ @@ -167,20 +168,6 @@ void gpuComputeEignS( size_t g, size_t fea){
167 std::cout << ga.P[ga.f * g + i] << ", "; 168 std::cout << ga.P[ga.f * g + i] << ", ";
168 std::cout << std::endl; 169 std::cout << std::endl;
169 } 170 }
170 -// if(!isfinite(gnom.S[g])){  
171 -// std::cout<<"-----------------------------------------------"<<std::endl;  
172 -// std::cout<<"Displaying intermediate values of gnome for which score is non finite"<<std::endl;  
173 -// std::cout<<"population "<<std::endl;  
174 -// for(int i = 0; i < ga.f; i++){  
175 -// std::cout<<"\t"<<ga.P[g * ga.f + i];  
176 -// }  
177 -// std::cout<<std::endl;  
178 -// std::cout<<"Sb determinant is "<<cv::determinant(newSb)<<"\t Sw determinant is "<<cv::determinant(newSb)<<std::endl;  
179 -// std::cout<<"fisher ratio is "<<fisherRatio<<std::endl;  
180 -// std::cout<<"Score["<<g<<"]: "<< gnom.S[g]<<std::endl;  
181 -// std::cout<<"------------------------------------------------"<<std::endl;  
182 -//  
183 -// }  
184 171
185 172
186 if(IPIV!= NULL) std::free(IPIV); 173 if(IPIV!= NULL) std::free(IPIV);
@@ -223,8 +210,6 @@ void fitnessFunction( float* sb, float* sw, float* lda, float* M, float* cM, siz @@ -223,8 +210,6 @@ void fitnessFunction( float* sb, float* sw, float* lda, float* M, float* cM, siz
223 } 210 }
224 211
225 // ----------------------- Linear discriminant Analysis -------------------------------------- 212 // ----------------------- Linear discriminant Analysis --------------------------------------
226 - //timer.start();  
227 - //structure is created to pass variable to thread function as it accepts only 3 arguments  
228 gnom.S = ga.S; 213 gnom.S = ga.S;
229 gnom.Sw = sw; 214 gnom.Sw = sw;
230 gnom.Sb = sb; 215 gnom.Sb = sb;
@@ -234,26 +219,13 @@ void fitnessFunction( float* sb, float* sw, float* lda, float* M, float* cM, siz @@ -234,26 +219,13 @@ void fitnessFunction( float* sb, float* sw, float* lda, float* M, float* cM, siz
234 for (size_t i = 0; i<ga.p; i++){ 219 for (size_t i = 0; i<ga.p; i++){
235 //calling function for eigencomputation 220 //calling function for eigencomputation
236 gpuComputeEignS(i, f); 221 gpuComputeEignS(i, f);
237 - //std::cout<<"Score["<<i<<"]: "<< ga.S[i]<<std::endl;  
238 } 222 }
239 223
240 - //std::vector<std::thread> threads;  
241 - //for (size_t g = 0; g<ga.p; g++){  
242 - // //creating thread to do eigen computation  
243 - // threads.push_back(std::thread(gpuComputeEignS, g, f));  
244 - //}  
245 - //  
246 - //// loop again to join the threads  
247 - //for (auto& t : threads)  
248 - // t.join();  
249 -  
250 const auto elapsed1 = timer.time_elapsed(); 224 const auto elapsed1 = timer.time_elapsed();
251 if(gen > ga.gnrtn - 2){ 225 if(gen > ga.gnrtn - 2){
252 std::cout << "gpu_eigen time "<<std::chrono::duration_cast<std::chrono::microseconds>(elapsed1).count() << "us" << std::endl; 226 std::cout << "gpu_eigen time "<<std::chrono::duration_cast<std::chrono::microseconds>(elapsed1).count() << "us" << std::endl;
253 profilefile<< "gpu_eigen time "<<std::chrono::duration_cast<std::chrono::microseconds>(elapsed1).count() << "us" << std::endl; 227 profilefile<< "gpu_eigen time "<<std::chrono::duration_cast<std::chrono::microseconds>(elapsed1).count() << "us" << std::endl;
254 } 228 }
255 - //ga.S = gnom.score;  
256 - //size_t bestGnomeIdx = ga.sortSIndx()[0];  
257 229
258 }//end of fitness function 230 }//end of fitness function
259 231
@@ -276,7 +248,6 @@ void advertisement() { @@ -276,7 +248,6 @@ void advertisement() {
276 std::cout << "=========================================================================" << std::endl; 248 std::cout << "=========================================================================" << std::endl;
277 std::cout << "Thank you for using the GA-GPU features selection for spectroscopic image!" << std::endl; 249 std::cout << "Thank you for using the GA-GPU features selection for spectroscopic image!" << std::endl;
278 std::cout << "=========================================================================" << std::endl << std::endl; 250 std::cout << "=========================================================================" << std::endl << std::endl;
279 -// std::cout << args.str();  
280 } 251 }
281 252
282 int main(int argc, char* argv[]){ 253 int main(int argc, char* argv[]){
@@ -335,8 +306,7 @@ int main(int argc, char* argv[]){ @@ -335,8 +306,7 @@ int main(int argc, char* argv[]){
335 E.close(); //close the hyperspectral file 306 E.close(); //close the hyperspectral file
336 time_t t_end = time(NULL); 307 time_t t_end = time(NULL);
337 std::cout<<"Total time: "<<t_end - t_start<<" s"<<std::endl; 308 std::cout<<"Total time: "<<t_end - t_start<<" s"<<std::endl;
338 - //display_PixelfeatureNclass(ga.F, ga.T , B , 1); //Print one value from feature matrix to debug feature loading  
339 - //std::cout << "pixel target is " << ga.T[0] << " " << ga.T[1] << " " << ga.T[tP - 2] << " " << ga.T[tP - 1]<<std::endl; 309 +
340 ///--------------------------Genetic algorith configurations with defult paramets and from argument values--------------------- 310 ///--------------------------Genetic algorith configurations with defult paramets and from argument values---------------------
341 ga.f = args["features"].as_int(0); //number of features to be selected by user default value is 10 311 ga.f = args["features"].as_int(0); //number of features to be selected by user default value is 10
342 ga.p = args["population"].as_int(0); //population size to be selected by user default value is 1000 312 ga.p = args["population"].as_int(0); //population size to be selected by user default value is 1000
@@ -415,11 +385,6 @@ int main(int argc, char* argv[]){ @@ -415,11 +385,6 @@ int main(int argc, char* argv[]){
415 HANDLE_ERROR(cudaGetDeviceProperties(&props, 0)); 385 HANDLE_ERROR(cudaGetDeviceProperties(&props, 0));
416 ga.gpuInitializationfrommain(M, cM, nP, tP, nC); 386 ga.gpuInitializationfrommain(M, cM, nP, tP, nC);
417 387
418 -//feture selection for class selected by user with user arguments (make it binary class data by making chosen class label as 1 and al other class labels 0 from multiclass data )  
419 -//to select feature for all classes in joint class data using binary class system need to write a script with loop covering all classes  
420 - //if(binaryClass){  
421 - // binaryclassifier(binClassOne);  
422 - //}  
423 388
424 //============================= GA evolution by generations ==================================================== 389 //============================= GA evolution by generations ====================================================
425 std::vector<unsigned int> bestgnome; //holds best gnome after each generation evaluation 390 std::vector<unsigned int> bestgnome; //holds best gnome after each generation evaluation
@@ -468,9 +433,6 @@ int main(int argc, char* argv[]){ @@ -468,9 +433,6 @@ int main(int argc, char* argv[]){
468 std::ofstream csv(outfile.c_str(), std::ios::out); //open outfstream for outfile 433 std::ofstream csv(outfile.c_str(), std::ios::out); //open outfstream for outfile
469 size_t ldaindx = bestG_Indx * (nC-1) * ga.f ; //Compute LDA basis index of best gnome 434 size_t ldaindx = bestG_Indx * (nC-1) * ga.f ; //Compute LDA basis index of best gnome
470 435
471 - //if(binaryClass){ //this option is for binary class feature selection from joint classes but not fully implemented  
472 - // csv<<binClassOne<<std::endl;  
473 - //}  
474 436
475 //fitness values of best gnome is 437 //fitness values of best gnome is
476 csv<<"best gnome's fitness value is "<<best_S[ga.gnrtn-1]<<std::endl; //output fitness value of best gnome in last generation 438 csv<<"best gnome's fitness value is "<<best_S[ga.gnrtn-1]<<std::endl; //output fitness value of best gnome in last generation