|
@@ -13,8 +13,20 @@
|
|
|
#include <string>
|
|
|
|
|
|
const double PI_=3.14159265358979323846;
|
|
|
+const double eps_=1e-11;
|
|
|
+long total_generations_ = 5000;
|
|
|
+
|
|
|
+// int voxel_num = 10;
|
|
|
+// double vox[] = {0.652282,0.286431,0.727236,0.271936,0.526648,0.47129,0.631995,0.808049,0.322672,0.0329494,0.283877,0.930383,0.0681125,0.269938,0.205617,0.810485,0.615148,0.717859,0.846448,0.264384};
|
|
|
+
|
|
|
+int voxel_num = 5;
|
|
|
+double vox[] = {0.822628,0.691376,0.282906,0.226013,0.90703,0.144985,0.328563,0.440353,0.662462,0.720518};
|
|
|
+
|
|
|
+double total_periods = 20;
|
|
|
+int rf_samples_per_period = 1;
|
|
|
+
|
|
|
+std::vector<double> init_vox (vox, vox + sizeof(vox) / sizeof(double) );
|
|
|
|
|
|
-int voxel_num = 30;
|
|
|
//double phase_range = 0;
|
|
|
double phase_range = PI_/2;
|
|
|
double phase_init = 0.0;
|
|
@@ -24,8 +36,6 @@ double noise_ratio = 1e8;
|
|
|
|
|
|
// B0=1.5T freq=64Mhz, period = 15.6 ns
|
|
|
double period_ms = 15.6/1000/1000; //ms
|
|
|
-double total_periods = 500;
|
|
|
-int rf_samples_per_period = 10;
|
|
|
// double period_ms = 10; //ms
|
|
|
// double total_periods = 2;
|
|
|
// int rf_samples_per_period = 3;
|
|
@@ -34,47 +44,58 @@ int rf_samples_per_period = 10;
|
|
|
//double T2s_min = T2s_scale/1000.0; //
|
|
|
double T2s_scale = period_ms*total_periods; //ms # need to be 10ms
|
|
|
template<class T> inline T pow2(const T value) {return value*value;}
|
|
|
+mri::GeneratorRF generator_rf_, fitness_rf_;
|
|
|
+jade::SubPopulation sub_population_; // Optimizer.
|
|
|
+
|
|
|
+void InitGenerators();
|
|
|
+void PrintVector(const std::vector<double> &values);
|
|
|
+void SetOptimizer();
|
|
|
+
|
|
|
+double EvaluateFitness(const std::vector<double> &input){
|
|
|
+ return fitness_rf_.TryFit(input);
|
|
|
+};
|
|
|
|
|
|
-
|
|
|
int main(int argc, char *argv[]) {
|
|
|
MPI_Init(&argc, &argv);
|
|
|
int rank;
|
|
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
|
|
try {
|
|
|
- //std::cout<<"Runing .... "<<std::endl;
|
|
|
- jade::SubPopulation sub_population; // Optimizer.
|
|
|
- mri::GeneratorRF generator_rf;
|
|
|
- generator_rf.SetVoxels(voxel_num, phase_init, phase_range, T2s_scale);
|
|
|
- generator_rf.SetTimer(total_periods, period_ms, rf_samples_per_period);
|
|
|
- generator_rf.RandomizeVoxels();
|
|
|
- std::vector<double> signal_rf, magnitude_rf, phase_rf;
|
|
|
+
|
|
|
+ InitGenerators();
|
|
|
+ generator_rf_.SetVoxels(init_vox);
|
|
|
+ //generator_rf_.RandomizeVoxels(); // Set signal to fit
|
|
|
+ std::vector<double> origin_values;
|
|
|
+ generator_rf_.GetVoxels(origin_values);
|
|
|
+ PrintVector(origin_values);
|
|
|
std::vector<double> mag_sin, mag_cos;
|
|
|
- generator_rf.EvaluateSignal(signal_rf);
|
|
|
- generator_rf.EvaluateDemodulated(mag_sin,mag_cos);
|
|
|
- auto timesteps = generator_rf.GetTimesteps();
|
|
|
- mri::LockIn lock_in;
|
|
|
- std::vector<double> out_sin, out_cos;
|
|
|
- lock_in.Analyse(signal_rf, period_ms, timesteps,
|
|
|
- rf_samples_per_period, out_sin, out_cos);
|
|
|
- for (unsigned long i = 0; i<timesteps.size(); ++i) {
|
|
|
- // if (i > static_cast<unsigned long>(rf_samples_per_period)*2)
|
|
|
- std::cout << timesteps[i] << "\t"
|
|
|
- << signal_rf[i] << "\t"
|
|
|
- // << mul_sin[i] << "\t"
|
|
|
- // << mul_cos[i] << "\t"
|
|
|
- << std::sqrt(pow2(mag_sin[i])+pow2(mag_cos[i]))
|
|
|
- /std::sqrt(pow2(out_sin[i])+pow2(out_cos[i])) << "\t"
|
|
|
- << std::sqrt(pow2(mag_sin[i])+pow2(mag_cos[i])) << "\t"
|
|
|
- << std::sqrt(pow2(out_sin[i])+pow2(out_cos[i])) << "\t"
|
|
|
- << out_sin[i] << "\t"
|
|
|
- << out_cos[i] << "\t"
|
|
|
- << mag_sin[i] << "\t"
|
|
|
- << mag_cos[i]
|
|
|
- << std::endl;
|
|
|
- }
|
|
|
- //std::cout<< timesteps.size() <<std::endl;
|
|
|
- // for (auto value:signal_rf){
|
|
|
- // std::cout << value <<std::endl;
|
|
|
+ generator_rf_.EvaluateDemodulated(mag_sin,mag_cos);
|
|
|
+ fitness_rf_.SetBase(mag_sin, mag_cos);
|
|
|
+
|
|
|
+ SetOptimizer();
|
|
|
+ sub_population_.FitnessFunction = &EvaluateFitness;
|
|
|
+
|
|
|
+ // double fit = fitness_rf_.TryFit(origin_values);
|
|
|
+ // std::cout << fit << std::endl;
|
|
|
+
|
|
|
+ sub_population_.RunOptimization();
|
|
|
+ double fit;
|
|
|
+ auto best_local_x = sub_population_.GetBest(&fit);
|
|
|
+ std::cout << "origin values:\t";
|
|
|
+ PrintVector(origin_values);
|
|
|
+ std::cout << " fit values:\t";
|
|
|
+ PrintVector(best_local_x);
|
|
|
+ std::vector<double> diff_vec(origin_values.size());
|
|
|
+ for (int i = 0; i < origin_values.size(); ++i)
|
|
|
+ diff_vec[i] = std::abs(origin_values[i]-best_local_x[i])*100;
|
|
|
+ std::cout << " diff:\t";
|
|
|
+ PrintVector(diff_vec);
|
|
|
+ std::cout << "fit:" << fit <<std::endl;
|
|
|
+ //auto timesteps = generator_rf_.GetTimesteps();
|
|
|
+ // for (unsigned long i = 0; i<timesteps.size(); ++i) {
|
|
|
+ // std::cout << timesteps[i] << "\t"
|
|
|
+ // << mag_sin[i] << "\t"
|
|
|
+ // << mag_cos[i]
|
|
|
+ // << std::endl;
|
|
|
// }
|
|
|
|
|
|
} catch( const std::invalid_argument& ia ) {
|
|
@@ -88,3 +109,40 @@ int main(int argc, char *argv[]) {
|
|
|
// ********************************************************************** //
|
|
|
// ********************************************************************** //
|
|
|
// ********************************************************************** //
|
|
|
+void InitGenerators() {
|
|
|
+ generator_rf_.InitVoxels(voxel_num, phase_init, phase_range, T2s_scale);
|
|
|
+ fitness_rf_.InitVoxels(voxel_num, phase_init, phase_range, T2s_scale);
|
|
|
+
|
|
|
+ generator_rf_.InitTimer(total_periods, period_ms, rf_samples_per_period);
|
|
|
+ fitness_rf_.InitTimer(total_periods, period_ms, rf_samples_per_period);
|
|
|
+};
|
|
|
+// ********************************************************************** //
|
|
|
+// ********************************************************************** //
|
|
|
+// ********************************************************************** //
|
|
|
+void PrintVector(const std::vector<double> &values) {
|
|
|
+ for (const double &value : values)
|
|
|
+ std::cout << value << " ";
|
|
|
+ std::cout << std::endl;
|
|
|
+};
|
|
|
+// ********************************************************************** //
|
|
|
+// ********************************************************************** //
|
|
|
+// ********************************************************************** //
|
|
|
+void SetOptimizer() {
|
|
|
+ long dimension = 2*voxel_num;
|
|
|
+ long total_population = dimension * 20;
|
|
|
+ sub_population_.Init(total_population, dimension);
|
|
|
+ /// Low and upper bound for all dimenstions;
|
|
|
+ sub_population_.SetAllBounds(eps_, 1.0-eps_);
|
|
|
+ sub_population_.SetTargetToMinimum();
|
|
|
+ sub_population_.SetTotalGenerationsMax(total_generations_);
|
|
|
+ //sub_population_.SwitchOffPMCRADE();
|
|
|
+
|
|
|
+ //sub_population_.SetBestShareP(0.1);
|
|
|
+ //sub_population_.SetAdapitonFrequencyC(1.0/20.0);
|
|
|
+ sub_population_.SetBestShareP(0.1);
|
|
|
+ sub_population_.SetAdapitonFrequencyC(1.0/20.0);
|
|
|
+
|
|
|
+}
|
|
|
+// ********************************************************************** //
|
|
|
+// ********************************************************************** //
|
|
|
+// ********************************************************************** //
|