23 #include "wx/wxprec.h"
31 #include "wx/progdlg.h"
33 #include "ObjCryst/wxCryst/wxGlobalOptimObj.h"
35 #include "ObjCryst/ObjCryst/IO.h"
37 #include "ObjCryst/ObjCryst/Crystal.h"
38 #include "ObjCryst/ObjCryst/ScatteringData.h"
59 static long ID_GLOBALOPT_MENU_OBJECTS= WXCRYST_ID();
60 static long ID_GLOBALOPT_MENU_OBJECTS_ADDOBJ= WXCRYST_ID();
61 static long ID_GLOBALOPT_MENU_OBJECTS_REMOVEOBJ= WXCRYST_ID();
62 static long ID_GLOBALOPT_MENU_OBJECTS_ADDCOSTFUNC= WXCRYST_ID();
63 static long ID_GLOBALOPT_MENU_OBJECTS_REMOVECOSTFUNC=WXCRYST_ID();
64 static long ID_GLOBALOPT_MENU_OPT= WXCRYST_ID();
65 static long ID_GLOBALOPT_MENU_OPT_RUN= WXCRYST_ID();
66 static long ID_GLOBALOPT_MENU_OPT_RUN_MULTIPLE= WXCRYST_ID();
67 static long ID_GLOBALOPT_MENU_OPT_STOP= WXCRYST_ID();
68 static long ID_GLOBALOPT_MENU_OPT_LSQ= WXCRYST_ID();
69 static long ID_GLOBALOPT_MENU_SOLUTIONS= WXCRYST_ID();
70 static long ID_GLOBALOPT_MENU_SOLUTIONS_BROWSE= WXCRYST_ID();
71 static long ID_BROWSE_WIN= WXCRYST_ID();
73 WXOptimizationObj::WXOptimizationObj(wxWindow* parent, OptimizationObj *obj):
74 WXCrystObj(parent),mpGlobalOptimRunThread(0)
76 VFN_DEBUG_ENTRY(
"WXOptimizationObj::WXOptimizationObj(wxWindow*,GlobalOptimObj*,)",7)
77 #ifdef VFN_CRYST_MUTEX
78 cout <<
"new CrystMutex("<<&mMutex<<
")for WXOptimizationObj:"<<obj->GetName()<<endl;
80 mpWXTitle->SetForegroundColour(wxColour(255,0,0));
81 mpWXTitle->SetLabel(
"Global Optimization:");
82 mpWXTitle->SetSize(400,-1);
84 mpMenuBar=
new WXCrystMenuBar(
this,
this);
85 mpSizer->Add(mpMenuBar);
91 mpMenuBar->AddMenu(
"Optimized Objects",ID_GLOBALOPT_MENU_OBJECTS);
92 mpMenuBar->AddMenuItem(ID_GLOBALOPT_MENU_OBJECTS,ID_GLOBALOPT_MENU_OBJECTS_ADDOBJ,
93 "Add object to optimize");
94 mpMenuBar->AddMenu(
"Run/Stop",ID_GLOBALOPT_MENU_OPT);
95 mpMenuBar->AddMenuItem(ID_GLOBALOPT_MENU_OPT,
96 ID_GLOBALOPT_MENU_OPT_RUN_MULTIPLE,
"Multiple Runs");
97 mpMenuBar->AddMenuItem(ID_GLOBALOPT_MENU_OPT,
98 ID_GLOBALOPT_MENU_OPT_RUN,
"Single Run");
99 mpMenuBar->AddMenuItem(ID_GLOBALOPT_MENU_OPT,
100 ID_GLOBALOPT_MENU_OPT_STOP,
"Stop Optimization");
101 mpMenuBar->GetMenu(ID_GLOBALOPT_MENU_OPT).AppendSeparator();
102 mpMenuBar->AddMenuItem(ID_GLOBALOPT_MENU_OPT,
103 ID_GLOBALOPT_MENU_OPT_LSQ,
"Least Squares Fit");
104 mpMenuBar->AddMenu(
"Solutions",ID_GLOBALOPT_MENU_SOLUTIONS);
105 mpMenuBar->AddMenuItem(ID_GLOBALOPT_MENU_SOLUTIONS,
106 ID_GLOBALOPT_MENU_SOLUTIONS_BROWSE,
"Browse Solutions");
112 for(
int i=0;i<obj->mRefinedObjList.GetNb();i++)
114 WXFieldName *refobj=
new WXFieldName(
this,
"Optimized object:",
this,-1,300,
false);
115 refobj->SetValue(obj->mRefinedObjList.GetObj(i).GetClassName()
116 +
":"+obj->mRefinedObjList.GetObj(i).GetName());
117 mpSizer->Add(refobj);
123 VFN_DEBUG_EXIT(
"WXOptimizationObj::WXOptimizationObj(wxWindow*,GlobalOptimObj*,)",7)
126 void WXOptimizationObj::CrystUpdate(
const bool uui,
const bool lock)
128 VFN_DEBUG_ENTRY(
"WXOptimizationObj::CrystUpdate("<<uui<<lock<<
")",7)
129 this->WXCrystObj::CrystUpdate(uui,lock);
132 if(
true==wxThread::IsMain()) this->UpdateUI(lock);
135 wxUpdateUIEvent event(ID_CRYST_UPDATEUI);
136 wxPostEvent(
this,event);
139 VFN_DEBUG_EXIT(
"WXOptimizationObj::CrystUpdate("<<uui<<lock<<
")",7)
142 bool WXOptimizationObj::OnChangeName(
const int id)
144 VFN_DEBUG_MESSAGE(
"WXOptimizationObj::OnChangeName()",6)
145 if(
id==ID_WXOBJ_NAME)
147 VFN_DEBUG_MESSAGE(
"WXOptimizationObj::OnChangeName():Changing GlobalOptimObj Name",6)
148 this->GetOptimizationObj().SetName(mpWXTitle->GetValue());
153 void WXOptimizationObj::OnSave(){}
155 void WXOptimizationObj::OnLoad(){}
157 void WXOptimizationObj::OnAddRefinedObject(wxCommandEvent & WXUNUSED(event))
163 "Choose object to optimize:",choice);
165 this->GetOptimizationObj().AddRefinableObj(*obj);
173 mpSizer->Add(refobj);
175 wxTheApp->GetTopWindow()->Layout();
176 wxTheApp->GetTopWindow()->SendSizeEvent();
180 void WXOptimizationObj::OnRemoveRefinedObject(wxCommandEvent & WXUNUSED(event))
184 void WXOptimizationObj::OnStopOptimization(wxCommandEvent & WXUNUSED(event))
186 if(0!=mpGlobalOptimRunThread)
188 if(mpGlobalOptimRunThread->IsAlive())
190 (*fpObjCrystInformUser)(
"Waiting for global optimization to stop...");
191 this->GetOptimizationObj().StopAfterCycle();
192 mpGlobalOptimRunThread->Wait(wxTHREAD_WAIT_YIELD);
193 this->GetOptimizationObj().UpdateDisplay();
194 (*fpObjCrystInformUser)(
"Global optimization halted...");
196 delete mpGlobalOptimRunThread;
197 mpGlobalOptimRunThread=0;
200 void WXOptimizationObj::OnUpdateUI(wxUpdateUIEvent& event)
202 VFN_DEBUG_ENTRY(
"WXOptimizationObj::OnUpdateUI()",5)
203 this->UpdateUI(true);
205 VFN_DEBUG_EXIT("WXOptimizationObj::OnUpdateUI()",5)
210 VFN_DEBUG_ENTRY(
"WXOptimizationObj::UpdateUI()",5)
211 if(lock) mMutex.Lock();
212 mpWXTitle->SetValue(this->GetOptimizationObj().GetName());
213 mpWXTitle->UpdateUI(
false);
214 this->WXCrystObj::UpdateUI(
false);
215 if(lock) mMutex.Unlock();
216 VFN_DEBUG_EXIT(
"WXOptimizationObj::UpdateUI()",5)
219 void WXOptimizationObj::OnBrowseParamSet(wxCommandEvent & WXUNUSED(event))
221 if(this->GetOptimizationObj().IsOptimizing())
223 wxMessageDialog dumbUser(
this,_T(
"Cannot browse during Optimisation !"),
224 _T(
"Cannot browse during Optimisation!"),wxOK|wxICON_EXCLAMATION);
225 dumbUser.ShowModal();
228 wxFrame *frame=
new wxFrame(
this,-1,_T(
"Stored Configurations"),
229 wxDefaultPosition,wxSize(250,200));
230 const long nb=this->GetOptimizationObj().mvSavedParamSet.size();
231 wxArrayString choices;
232 mpwxParamSetList=
new wxListBox(frame, ID_BROWSE_WIN, wxDefaultPosition,
233 wxDefaultSize, choices,
234 wxLB_SINGLE|wxLB_NEEDED_SB, wxDefaultValidator,
236 for(
int i=0;i<nb;i++)
238 wxString tmpname=wxString::FromAscii(this->GetOptimizationObj().mRefParList.GetParamSetName
239 (this->GetOptimizationObj().mvSavedParamSet[i].first).c_str());
240 mpwxParamSetList->Append(wxString::Format(_T(
"%d, cost= %f, %s"),i,
241 this->GetOptimizationObj().mvSavedParamSet[i].second,tmpname.c_str()));
244 mClockParamSetWindow.Click();
248 void WXOptimizationObj::OnSelectParamSet(wxCommandEvent &event)
251 if(this->GetOptimizationObj().IsOptimizing())
253 wxMessageDialog dumbUser(
this,_T(
"Cannot browse during Optimisation !"),
254 _T(
"Cannot browse during Optimisation!"),wxOK|wxICON_EXCLAMATION);
255 dumbUser.ShowModal();
258 const long n=
event.GetSelection();
262 if(mpwxParamSetList->GetCount()!=this->GetOptimizationObj().mvSavedParamSet.size())
264 const long nb=this->GetOptimizationObj().mvSavedParamSet.size();
265 wxArrayString choices;
266 for(
int i=0;i<nb;i++)
268 wxString tmpname=wxString::FromAscii(this->GetOptimizationObj().mRefParList.GetParamSetName
269 (this->GetOptimizationObj().mvSavedParamSet[i].first).c_str());
270 choices.Add(wxString::Format(_T(
"%d, cost= %f, %s"),i,
271 this->GetOptimizationObj().mvSavedParamSet[i].second,tmpname.c_str()));
273 mpwxParamSetList->Set(choices);
274 mClockParamSetWindow.Click();
280 if(mClockParamSetWindow>this->GetOptimizationObj().mRefParList.GetRefParListClock())
284 this->GetOptimizationObj().mRefParList
285 .RestoreParamSet(this->GetOptimizationObj().mvSavedParamSet[n].first);
289 wxMessageDialog bad(
this,_T(
"Impossible ! Model has been altered !"),
290 _T(
"Impossible ! Model has been altered !"),wxOK|wxICON_EXCLAMATION);
291 mpwxParamSetList->GetParent()->Close();
294 this->GetOptimizationObj().UpdateDisplay();
295 cout <<
"Param set #"<<this->GetOptimizationObj().mvSavedParamSet[n].first<<
", cost="
296 <<this->GetOptimizationObj().mvSavedParamSet[n].second
297 <<
", now cost="<<this->GetOptimizationObj().GetLogLikelihood()<<endl;
301 wxMessageDialog bad(
this,_T(
"Impossible ! The list of parameters has been changed !"),
302 _T(
"Impossible ! The list of parameters has been changed !"),wxOK|wxICON_EXCLAMATION);
309 void WXOptimizationObj::OnClose(wxCloseEvent& event)
311 if(event.GetId()==ID_BROWSE_WIN)
313 cout<<
"Closing browse window..."<<endl;
316 else cout<<
event.GetId()<<
"?"<<endl;
326 WXGlobalOptimRunThread::WXGlobalOptimRunThread(OptimizationObj &globalOptObj,
long &nbTrial,
327 const REAL finalCost,
long &nbRun,
const bool multiple):
328 wxThread(wxTHREAD_JOINABLE),mpGlobalOptObj(&globalOptObj),mpNbTrial(&nbTrial),mpNbRun(&nbRun),
329 mFinalCost(finalCost),mDoMultiple(multiple)
333 void *WXGlobalOptimRunThread::Entry()
335 (*fpObjCrystInformUser)(
"Entering refinement thread");
339 (*fpObjCrystInformUser)(
"Finished global optimization");
341 catch(...){cout<<
"Unhandled exception in WXGlobalOptimRunThread::Entry() ?"<<endl;}
345 void WXGlobalOptimRunThread::OnExit()
347 (*fpObjCrystInformUser)(
"Exiting refinement thread");
349 (*fpObjCrystInformUser)(
"Optimization result saved to Fox-LastOptimizationStop.xml");
356 BEGIN_EVENT_TABLE(WXMonteCarloObj, wxWindow)
363 EVT_MENU(ID_GLOBALOPT_MENU_OPT_STOP, WXOptimizationObj::OnStopOptimization)
364 EVT_MENU(ID_GLOBALOPT_MENU_OPT_LSQ, WXMonteCarloObj::OnLSQRefine)
366 EVT_UPDATE_UI(ID_CRYST_UPDATEUI, WXOptimizationObj::OnUpdateUI)
372 WXMonteCarloObj::WXMonteCarloObj(wxWindow *parent, MonteCarloObj* obj):
373 WXOptimizationObj(parent,obj),mpMonteCarloObj(obj),mNbRun(-1)
375 VFN_DEBUG_ENTRY(
"WXMonteCarloObj::WXMonteCarloObj()",7)
379 opt=new WXFieldOption(this,-1,&(mpMonteCarloObj->mGlobalOptimType));
380 mpSizer->Add(opt,0,wxALIGN_LEFT);
383 opt=new WXFieldOption(this,-1,&(mpMonteCarloObj->mAnnealingScheduleTemp));
384 mpSizer->Add(opt,0,wxALIGN_LEFT);
387 wxBoxSizer *sizerTemp=new wxBoxSizer(wxHORIZONTAL);
388 WXFieldPar<REAL> *tempMax=
389 new WXFieldPar<REAL>(this,"Temperature Max:",-1,&(mpMonteCarloObj->mTemperatureMax));
390 WXFieldPar<REAL> *tempMin=
391 new WXFieldPar<REAL>(this,"Temperature Min:",-1,&(mpMonteCarloObj->mTemperatureMin));
392 WXFieldPar<REAL> *tempGamma=
393 new WXFieldPar<REAL>(this,"Gamma:",-1,&(mpMonteCarloObj->mTemperatureGamma));
394 sizerTemp->Add(tempMax);
395 sizerTemp->Add(tempMin);
396 sizerTemp->Add(tempGamma);
397 mpSizer->Add(sizerTemp);
400 mList.Add(tempGamma);
401 tempMax->SetFormat(_T("%8f"));
402 tempMin->SetFormat(_T("%8f"));
403 tempGamma->SetFormat(_T("%8f"));
405 opt=new WXFieldOption(this,-1,&(mpMonteCarloObj->mAnnealingScheduleMutation));
406 mpSizer->Add(opt,0,wxALIGN_LEFT);
409 wxBoxSizer *sizerAmp=new wxBoxSizer(wxHORIZONTAL);
410 WXFieldPar<REAL> *ampMax=
411 new WXFieldPar<REAL>(this,"Amplitude Max:",-1,&(mpMonteCarloObj->mMutationAmplitudeMax));
412 WXFieldPar<REAL> *ampMin=
413 new WXFieldPar<REAL>(this,"Amplitude Min:",-1,&(mpMonteCarloObj->mMutationAmplitudeMin));
414 WXFieldPar<REAL> *ampGamma=
415 new WXFieldPar<REAL>(this,"Gamma:",-1,&(mpMonteCarloObj->mMutationAmplitudeGamma));
416 sizerAmp->Add(ampMax);
417 sizerAmp->Add(ampMin);
418 sizerAmp->Add(ampGamma);
419 mpSizer->Add(sizerAmp);
423 ampMax->SetFormat(_T("%8f"));
424 ampMin->SetFormat(_T("%8f"));
425 ampGamma->SetFormat(_T("%8f"));
427 opt=new WXFieldOption(this,-1,&(mpMonteCarloObj->mSaveTrackedData));
428 mpSizer->Add(opt,0,wxALIGN_LEFT);
430 opt->SetToolTip(_T("Saved Tracked values (costs, Chi^2, parameters...)\n\n")
431 _T("This is only useful for Test purposes.\n")
432 _T("Data is saved in the file (Name)-Tracker(-Run
#).dat"));
434 opt=new WXFieldOption(this,-1,&(mpMonteCarloObj->mXMLAutoSave));
435 mpSizer->Add(opt,0,wxALIGN_LEFT);
437 opt->SetToolTip(_T("Periodically save the best configuration\n\n")
438 _T("Recommended choice is : After Each Run\n")
439 _T("File name is: (name)-(date)-(Run#)-cost.xml\n\n")
440 _T("For Multiple Runs, Note that all choices\n")
441 _T("save the *best* configuration overall, except for\n")
442 _T("'After Each Run', for which the configuration\n")
443 _T("saved are the best for each run."));
445 opt=new WXFieldOption(this,-1,&(mpMonteCarloObj->mAutoLSQ));
446 mpSizer->Add(opt,0,wxALIGN_LEFT);
448 opt->SetToolTip(_T("Least squares refinement can be run:\n\n")
449 _T(" - at the end of each run\n")
450 _T(" - perdiodically during the optimization\n\n")
451 _T(" This allows to find the global minimum\n")
453 _T(" Note that if a LSQ refinement is run but does\n")
454 _T("not reach the real global minimum, the returned\n")
455 _T("structure can be very distorted, but this is\n")
456 _T("harmless (restraints will bring back a correct \n")
457 _T("conformation after a few thousand tests)"));
459 // Number of trials to go
460 mpWXFieldNbTrial=new WXFieldPar<long>(this,"Number of trials per run:",-1,&(mpMonteCarloObj->NbTrialPerRun()),70);
461 mpSizer->Add(mpWXFieldNbTrial);
462 mList.Add(mpWXFieldNbTrial);
463 mpWXFieldNbTrial->SetFormat(_T("%ld"));
464 mpWXFieldNbTrial->SetToolTip(_T("Number of triels per run.\n")
465 _T("This number will be updated during the optimization.\n\n")
466 _T("Using Multiple Runs:\n")
467 _T(" For simple problems (e.g. PbSO4), use 200 000\n")
468 _T(" For larger problems (e.g. Cimetidine), use 2 000 000\n")
469 _T(" For much larger problems, use 10 000 000\n\n")
470 _T("For a single run using Parallel Tempering, use a large number (100 000 000:\n"));
471 // Number of cycles (-1=run indefinitely)
472 WXFieldPar<long> *pWXFieldNbRun=new WXFieldPar<long>(this,"Number of Runs to perform:",-1,&mNbRun,40);
473 mpSizer->Add(pWXFieldNbRun);
474 mList.Add(pWXFieldNbRun);
475 pWXFieldNbRun->SetFormat(_T("%ld"));
476 pWXFieldNbRun->SetToolTip(_T("Number of runs to perform (for Multiple Runs).\n")
477 _T("Use -1 (the default) to run an infinite number of Runs.\n\n")
478 _T("The model will be randomized at the beginning of each run.\n"));
480 WXFieldPar<REAL> *pWXFieldBestCost=new WXFieldPar<REAL>(this,"Overall Best Cost:",-1,&(mpMonteCarloObj->GetBestCost()),130);
481 mpSizer->Add(pWXFieldBestCost);
482 mList.Add(pWXFieldBestCost);
483 pWXFieldBestCost->SetFormat(_T("%12.2f"));
484 pWXFieldBestCost->SetToolTip(_T("Overall (all runs) Best Cost"));
485 this->CrystUpdate(true);
486 VFN_DEBUG_EXIT("WXMonteCarloObj::WXMonteCarloObj()",7)
489 WXMonteCarloObj::~WXMonteCarloObj()
491 if(0!=mpGlobalOptimRunThread)
493 if(mpGlobalOptimRunThread->IsAlive())
495 (*fpObjCrystInformUser)("Waiting for global optimization to stop...");
496 this->GetOptimizationObj().StopAfterCycle();
497 mpGlobalOptimRunThread->Wait(wxTHREAD_WAIT_BLOCK);
498 (*fpObjCrystInformUser)("Global optimization halted...");
500 delete mpGlobalOptimRunThread;
501 mpGlobalOptimRunThread=0;
506 void WXMonteCarloObj::OnRunOptimization(wxCommandEvent & event)
508 VFN_DEBUG_ENTRY("WXMonteCarloObj::OnRunOptimization()",6)
509 WXCrystValidateAllUserInput();
510 if(true==this->GetOptimizationObj().IsOptimizing())
512 wxMessageDialog dumbUser(this,_T("The optimization is already running !"),_T("Huh ?"),
513 wxOK|wxICON_EXCLAMATION);
514 dumbUser.ShowModal();
515 VFN_DEBUG_EXIT("WXMonteCarloObj::OnRunOptimization()",6)
518 (*fpObjCrystInformUser)("Beginning global optimization");
520 //Fix parameters than really should not be global-optimized
521 mpMonteCarloObj->SetParIsFixed(gpRefParTypeUnitCell,true);
522 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataScale,true);
523 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataProfile,true);
524 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataCorrIntAbsorp,true);
525 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataCorrIntPolar,true);
526 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataCorrIntExtinc,true);
527 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataCorrPos,true);
528 mpMonteCarloObj->SetParIsFixed(gpRefParTypeScattDataBackground,true);
529 mpMonteCarloObj->SetParIsFixed(gpRefParTypeRadiation,true);
530 mpMonteCarloObj->UpdateDisplay();
533 if(mpMonteCarloObj->NbTrialPerRun()<0)
535 mpMonteCarloObj->NbTrialPerRun() = - mpMonteCarloObj->NbTrialPerRun();
536 wxTextEntryDialog costDialog(this,_T("Enter desired cost for the optimization to stop"),
537 _T("Goal Cost"),_T(".20"),wxOK | wxCANCEL);
538 costDialog.SetTextValidator(wxTextValidator(wxFILTER_NUMERIC));
539 if(wxID_OK==costDialog.ShowModal()) costDialog.GetValue().ToDouble(&finalCost);
541 if(0!=mpGlobalOptimRunThread)
542 delete mpGlobalOptimRunThread;
544 if(event.GetId()==ID_GLOBALOPT_MENU_OPT_RUN_MULTIPLE)
545 mpGlobalOptimRunThread = new WXGlobalOptimRunThread(this->GetOptimizationObj(),
546 mpMonteCarloObj->NbTrialPerRun(),finalCost,mNbRun,true);
548 mpGlobalOptimRunThread = new WXGlobalOptimRunThread(this->GetOptimizationObj(),
549 mpMonteCarloObj->NbTrialPerRun(),finalCost,mNbRun,false);
551 if(this->GetOptimizationObj().GetMainTracker().WXGet()==0)
553 wxFrame *frame= new wxFrame(this,-1,_T("Tracked data"),
554 wxDefaultPosition,wxSize(300,200));
555 wxWindow* pwxTrackerGraph = this->GetOptimizationObj().GetMainTracker().WXCreate(frame);
557 wxSizer *ps=new wxBoxSizer(wxHORIZONTAL);
558 ps->Add(pwxTrackerGraph,1,wxEXPAND);
559 frame->CreateStatusBar(2);
561 frame->SetAutoLayout(true);
564 if(mpGlobalOptimRunThread->Create() != wxTHREAD_NO_ERROR)
565 wxLogError(_T("Can't create optimization thread"));
566 else mpGlobalOptimRunThread->Run();
568 VFN_DEBUG_EXIT("WXMonteCarloObj::OnRunOptimization()",6)
571 void WXMonteCarloObj::OnLSQRefine(wxCommandEvent &event)
573 WXCrystValidateAllUserInput();
574 if(true==this->GetOptimizationObj().IsOptimizing())
576 wxMessageDialog dumbUser(this,_T("An optimization is already running !"),_T("Huh ?"),
577 wxOK|wxICON_EXCLAMATION);
578 dumbUser.ShowModal();
582 mpMonteCarloObj->BeginOptimization();
583 mpMonteCarloObj->PrepareRefParList();
584 mpMonteCarloObj->InitLSQ(true);
586 sprintf(buf,"LSQ: start");
587 REAL cost=mpMonteCarloObj->GetLogLikelihood();
588 mpMonteCarloObj->mvSavedParamSet.push_back(make_pair(mpMonteCarloObj->mRefParList.CreateParamSet(buf),cost));
589 wxProgressDialog dlgProgress(_T("Least Squares refinement"),wxString::Format(_T("Least Squares refinement, cycle #%02d/20, Chi^2=%012.2f"),0,cost),
590 19,this,wxPD_AUTO_HIDE|wxPD_ELAPSED_TIME|wxPD_CAN_ABORT);
591 (*fpObjCrystInformUser)(std::string(wxString::Format(_T("Least Squares refinement, cycle #%02d/20, Chi^2=%012.2f"),0,cost)));
592 for(unsigned i=0;i<20;++i)
594 try {mpMonteCarloObj->GetLSQObj().Refine(1,true,false,false);}
595 catch(const ObjCrystException &except){};
596 mpMonteCarloObj->UpdateDisplay();
597 sprintf(buf,"LSQ: cycle #%02d",i);
598 cost=mpMonteCarloObj->GetLogLikelihood();
599 mpMonteCarloObj->mvSavedParamSet.push_back(make_pair(mpMonteCarloObj->mRefParList.CreateParamSet(buf),cost));
600 (*fpObjCrystInformUser)(std::string(wxString::Format(_T("Least Squares refinement, cycle #%02d/20, Chi^2=%012.2f"),i,cost)));
601 if(dlgProgress.Update(i,wxString::Format(_T("Least Squares refinement, cycle #%02d/20, Chi^2=%012.2f"),i,cost))==false) break;
603 mpMonteCarloObj->EndOptimization();
606 void WXMonteCarloObj::UpdateDisplayNbTrial()
608 VFN_DEBUG_MESSAGE("WXMonteCarloObj::UpdateDisplayNbTrial()",5)
610 mList.CrystUpdate(false);
612 wxUpdateUIEvent event(ID_CRYST_UPDATEUI);
613 wxPostEvent(this,event);
616 OptimizationObj & WXMonteCarloObj::GetOptimizationObj()
618 VFN_DEBUG_MESSAGE("WXMonteCarloObj::GetOptimizationObj()",2)
619 return *mpMonteCarloObj;
621 const OptimizationObj & WXMonteCarloObj::GetOptimizationObj()const
623 VFN_DEBUG_MESSAGE("WXMonteCarloObj::GetOptimizationObj() const",2)
624 return *mpMonteCarloObj;
The namespace which includes all objects (crystallographic and algorithmic) in ObjCryst++.
void WXCrystValidateAllUserInput()
This function validates all user input (in a WXField) not yet taken into account, if needs be.
ObjRegistry< RefinableObj > gTopRefinableObjRegistry("Global Top RefinableObj registry")
This is a special registry for 'top' object for an optimization.
T * WXDialogChooseFromRegistry(ObjRegistry< T > ®, wxWindow *parent, const string &message, int &choice)
This function allows to pick up one object in a registry.
void XMLCrystFileSaveGlobal(const string &filename)
Save all Objcryst++ objects.
Exception class for ObjCryst++ library.
virtual void Optimize(long &nbSteps, const bool silent=false, const REAL finalcost=0, const REAL maxTime=-1)=0
Launch optimization (a single run) for N steps.
virtual void MultiRunOptimize(long &nbCycle, long &nbSteps, const bool silent=false, const REAL finalcost=0, const REAL maxTime=-1)=0
Launch optimization for multiple runs of N steps.
Generic Refinable Object.
virtual const string & GetClassName() const
Name for this class ("RefinableObj", "Crystal",...).
virtual const string & GetName() const
Name of the object.
void OnToggleCollapse(wxCommandEvent &WXUNUSED(event))
Only display the title, and collapse everything else.
A field with the name of a WXCrystObj.
void SetValue(const string &)
This actually posts an UpdateUI event, so that it is safe to call it from a non-graphic thread.
virtual void UpdateUI(const bool mutexlock=false)
Update the User Interface, if necessary.
WX Class for a Global Optimization objects.
virtual void OnRunOptimization(wxCommandEvent &WXUNUSED(event))=0
Launches the optimization run.
virtual void OnAddRefinedObject(wxCommandEvent &WXUNUSED(event))
From the menu.
virtual void OnBrowseParamSet(wxCommandEvent &WXUNUSED(event))
Opens a window where the stored parameter set can be selected.
virtual void OnSelectParamSet(wxCommandEvent &WXUNUSED(event))
Restore one parameter set.
const REAL mFinalCost
The value of the cost below which the optimization should stop (0 by default) even if the desired num...
const bool mDoMultiple
Use multiple Runs ?
long * mpNbRun
This points to the mNbRun member in WXOptimizationObj.
long * mpNbTrial
This points to OptimizationObj::mNbTrialPerRun.