gui_config.cpp

gehe zur Dokumentation dieser Datei
00001 #include "gui.h"
00002 
00003 void Simulation::apply_button_clicked()
00004 {
00005    this->guiReady = false;
00006    static int firstRun=true;
00007 
00008    this->lg->ViTab->setEnabled (this->lg->ViLearningButton->isOn());
00009    this->lg->QTab->setEnabled (this->lg->QLearningButton->isOn());
00010 
00011 
00012    static int iHiddenLayers_old = 0, iHiddenUnits_old = 0, iRows_old = 0, iCols_old = 0;
00013    static double dGamma_old = 0;
00014    
00015    int iHiddenLayers = 0, iHiddenUnits = 0, iRows = 0, iCols = 0;
00016    double dGamma = 0, dEta = 0;
00017    QTableItem *strategy_item, *value_item, *feedback_item;
00018    
00019    // Gamma(Iterationsrate)
00020    this->gamma = dGamma = this->lg->viGammaInput->text().toDouble();
00021 
00022    // Netz Variablen
00023    dEta = this->lg->netEta->text().toDouble();
00024    iHiddenUnits = this->lg->netHiddenUnits->text().toInt();
00025    iHiddenLayers = this->lg->netHiddenLayers->text().toInt();
00026 
00027    // Grid Variablen
00028    this->scalY = iRows = lg->numRows->text().toInt();
00029    this->scalX = iCols = lg->numCols->text().toInt();
00030    iMantisse = this->lg->mantisseInput->text().toInt();
00031    i_cell = lg->numRows->text().toInt() * lg->numCols->text().toInt();
00032 
00033    // Anzahl Spalten und Zeilen
00034    lg->viValueTable->setNumRows(iRows);
00035    lg->viValueTable->setNumCols(iCols);
00036    lg->strategyTable->setNumRows(iRows);
00037    lg->strategyTable->setNumCols(iCols);
00038 
00039    // Wenn Neuronales Netz angeschaltet, dann 3x3 Feedback aktivieren
00040    lg->envRewardTable->setNumRows(iRows);
00041    lg->envRewardTable->setNumCols(iCols);
00042 
00043    // Nur wenn sich bei der Spalten und Zeilenanzahl was geändert hat, wird upgedated
00044    if ((iCols != iCols_old) || (iRows != iRows_old))
00045    {
00046       // Default-Werte setzen
00047       for (int i=0; i<lg->numRows->text().toInt(); i++) {
00048          for (int j=0; j<lg->numCols->text().toInt(); j++) {
00049    
00050             // Neue Items anlegen
00051             value_item = new QTableItem(lg->viValueTable, QTableItem::Never);
00052             strategy_item = new QTableItem(lg->strategyTable, QTableItem::Never);
00053             feedback_item = new QTableItem(lg->envRewardTable, QTableItem::Never);
00054    
00055             // Item der Value-Table zuweisen
00056             value_item->setText (QString::number ((double)0.000));
00057             value_item->setPixmap (pix[5]);
00058             lg->viValueTable->setItem(i, j, value_item);
00059    
00060             // Item der Strategy-Table zuweisen
00061             strategy_item->setPixmap (pix[5]);
00062             lg->strategyTable->setItem(i, j, strategy_item);
00063    
00064             // Item in der Feedback-Table
00065             feedback_item->setText ("");
00066             lg->envRewardTable->setItem(i, j, feedback_item);        
00067          
00068          }
00069       }
00070       
00071       // Tabelle passend resizen
00072       for (int j=0; j < lg->numCols->text().toInt(); j++) {
00073          lg->viValueTable->adjustColumn(j);
00074          lg->strategyTable->adjustColumn(j);
00075       }  
00076    
00077       // Thread beenden, wenn schon läuft
00078       if (this->pkt != NULL) {
00079 
00080          DBG();
00081          // Thread sicher beenden
00082          pkt->setModusFromExtern ('q');
00083          while (pkt->running());
00084          DBG();
00085 
00086          delete (pkt);
00087       }  
00088    
00089       // Geschwindigkeit auslesen
00090       speed = this->lg->viSpeedSlider->maxValue()-this->lg->viSpeedSlider->value();
00091    
00092       // Neuen Thread erzeugen
00093       this->pkt = new ValueIterationThread (
00094                (int)(this->lg->numCols->text().toInt()), 
00095                (int)(this->lg->numRows->text().toInt()), 
00096                this->gamma, 
00097                speed,
00098                this->lg->netHiddenLayers->value(),
00099                this->lg->netHiddenUnits->value());
00100 
00101       this->pkt->setTrainRandomValues((int)((float)this->scalX * (float)this->scalY * 
00102          (float)this->lg->viRandomValuesSlider->value() / (float)this->lg->viRandomValuesSlider->maxValue())
00103       );
00104    
00105       // Verbindung zum KI-Thread um richtig die Tabelle aktualisieren zu lassen
00106       connect( (QObject*)this->pkt, 
00107             SIGNAL(emitValue(int, int, double, int)), 
00108             (QObject*)this, 
00109             SLOT(updatePolicyTable(int, int, double, int))
00110       );
00111       connect( (QObject*)this->pkt, 
00112             SIGNAL(debugOutput(QString)), 
00113             (QObject*)this, 
00114             SLOT (debugOutput(QString))
00115       );
00116       connect( (QObject*)this->pkt,
00117             SIGNAL(emitNewNetworkError(double)),
00118             (QObject*)this,
00119             SLOT (adjust_network_error(double))
00120       );
00121       
00122       this->lg->viSpeedSlider->setEnabled (true);
00123       connect(lg->viSpeedSlider, SIGNAL(sliderMoved(int)), this, SLOT(speed_slider_changed(int)));
00124       connect(lg->viRandomValuesSlider, SIGNAL(sliderMoved(int)), this, SLOT(vi_train_random_values_changed(int)));
00125       connect(lg->envRewardTable, SIGNAL(clicked(int, int, int, const QPoint&)),
00126          this, SLOT (feedbackClicked(int, int, int, const QPoint&)));
00127    
00128       // Buttons wieder enabeln
00129       this->lg->viLernenButton->setEnabled (true);
00130       this->lg->viIterationButton->setEnabled (true);
00131       this->lg->viSpeedSlider->setEnabled(true);
00132       this->lg->startSimulationButton->setEnabled(true);
00133       this->lg->viDeleteButton->setEnabled(true);
00134       this->lg->envLoadFileButton->setEnabled(true);
00135       this->lg->envSaveFileButton->setEnabled(true);
00136       this->lg->envSaveMatlabFileButton->setEnabled(true);
00137       this->lg->envSaveRewardButton->setEnabled(true);
00138 
00139 
00140       // Neuronales Netz zunächst deaktivieren
00141       if (firstRun==true) {
00142          this->learn_method_vi_clicked();
00143          firstRun=false;
00144       }
00145 
00146       printf ("Configuration successfully applied\n");
00147 
00148       // In GUI integrierte Simulation
00149       this->lg->canvasView->setDimension (   this->lg->numRows->value(),
00150                      this->lg->numCols->value(),
00151                      (this->lg->numRows->value()-1)/2,
00152                      (this->lg->numCols->value()-1)/2
00153                      //this->simuPos.y()+1,
00154                      //this->simuPos.x()+1
00155       );
00156       // In externen Dialog integrierte Simulation
00157       this->sd->canvasView->setDimension (   this->lg->numRows->value(),
00158                      this->lg->numCols->value(),
00159                      (this->lg->numRows->value()-1)/2,
00160                      (this->lg->numCols->value()-1)/2
00161                      //this->simuPos.y()+1,
00162                      //this->simuPos.x()+1
00163       );
00164    
00165    // Netz neu initialisieren, wenn Parameter ver�ndert wurden
00166    } else if ((iHiddenUnits != iHiddenUnits_old) || 
00167          (iHiddenLayers != iHiddenLayers_old)) {
00168 
00169       // Thread beenden, wenn schon läuft
00170       if (this->pkt != NULL) {
00171 
00172          DBG();
00173          // Thread sicher beenden
00174          pkt->setModusFromExtern ('q');
00175          while (pkt->running());
00176          DBG();
00177 
00178          delete (pkt);
00179       }
00180 
00181       // Neuen Thread erzeugen
00182       this->pkt = new ValueIterationThread (
00183                (int)(this->lg->numCols->text().toInt()), 
00184                (int)(this->lg->numRows->text().toInt()), 
00185                this->gamma, 
00186                speed,
00187                this->lg->netHiddenLayers->value(),
00188                this->lg->netHiddenUnits->value());
00189 
00190       this->pkt->setTrainRandomValues((int)((float)this->scalX * (float)this->scalY * 
00191          (float)this->lg->viRandomValuesSlider->value() / (float)this->lg->viRandomValuesSlider->maxValue())
00192       );
00193 
00194 
00195       // Verbindung zum KI-Thread um richtig die Tabelle aktualisieren zu lassen
00196       connect( (QObject*)this->pkt, 
00197             SIGNAL(emitValue(int, int, double, int)), 
00198             (QObject*)this, 
00199             SLOT(updatePolicyTable(int, int, double, int))
00200       );
00201       connect( (QObject*)this->pkt, 
00202             SIGNAL(debugOutput(QString)), 
00203             (QObject*)this, 
00204             SLOT (debugOutput(QString))
00205       );
00206       connect( (QObject*)this->pkt,
00207             SIGNAL(emitNewNetworkError(double)),
00208             (QObject*)this,
00209             SLOT (adjust_network_error(double))
00210       );
00211 
00212    } else if (dGamma != dGamma_old) {
00213       this->pkt->setGamma (dGamma);
00214    }
00215 
00216    // Anzahl von Zeilen und Spalten speichern
00217    iCols_old = iCols;
00218    iRows_old = iRows;
00219 
00220    // Netzvariablen speichern
00221    iHiddenUnits_old = iHiddenUnits;
00222    iHiddenLayers_old = iHiddenLayers;
00223 
00224    // Network-Training Parameter anpassen
00225    this->pkt->setNetworkParameters(
00226       this->lg->netMaxEpochs->value(),
00227       this->lg->netIterationsBetweenReport->value(), 
00228       this->lg->netDesiredError->text().toDouble(),
00229       dEta,
00230       this->lg->netAutoAdjustError->isChecked(),
00231       this->lg->netActivationStepnessHidden->text().toDouble(),
00232       this->lg->netActivationStepnessOutput->text().toDouble(),
00233       this->lg->netHiddenActivationFunction->currentItem(),
00234       this->lg->netOutputActivationFunction->currentItem()
00235    );
00236 
00237    int max;
00238    if(iCols> iRows) max = iCols;
00239    else max = iRows;
00240 
00241    // GUI ist nun bereit
00242    this->guiReady = true;
00243 }
00244 

Erzeugt am Mon Nov 24 15:30:59 2008 für Walking Robot Simulation GUI - API Documentation von  doxygen 1.5.5