24 #include "displaycontroller.h"
28 #include <QFileDialog>
29 #include <QMessageBox>
39 #pragma warning(disable:4996)
42 #define MAXFREEP 10000
46 NetworkDialog::NetworkDialog(Evonet* net, QWidget* parent, Qt::WindowFlags flags) : QWidget( parent, flags )
59 m_mainLayout =
new QVBoxLayout(
this);
64 m_toolBar =
new QToolBar(
this);
65 m_mainLayout->addWidget(m_toolBar);
68 this->enet->neuronlesions = 0;
72 rendNetwork =
new RendNetwork(
this );
73 m_mainLayout->addWidget( rendNetwork, 4 );
75 mixerDialog =
new MixerDialog( enet,
this );
76 m_mainLayout->addWidget( mixerDialog );
79 statusb =
new QLabel(
"",
this);
80 m_mainLayout->addWidget(statusb);
82 connect(rendNetwork, SIGNAL(selectedneuronsChanged()),
this, SLOT(updatetoolb()) );
86 NetworkDialog::~NetworkDialog()
122 void NetworkDialog::error(
const char *emessage)
124 QMessageBox::about(
this,
"ERROR", emessage);
127 void NetworkDialog::warning(
const char *emessage)
129 QMessageBox::about(
this,
"WARNING", emessage);
133 void NetworkDialog::createToolBars()
139 m_toolBar->addAction(openAct);
140 m_toolBar->addAction(saveAct);
142 cblockAct =
new QComboBox( m_toolBar );
143 cblockAct->addItems(QStringList() <<
"blocks list");
144 for (b=0; b < enet->net_nblocks; b++)
146 block_name(b, stblock);
147 cblockAct->addItems(QStringList() << stblock);
149 connect( cblockAct, SIGNAL(currentIndexChanged(
int)),
this, SLOT(selblock_changed(
int)) );
150 connect(
this, SIGNAL(selectedblockChanged()),
this, SLOT(updateblocktype()) );
152 m_toolBar->addWidget( cblockAct );
154 blocktypeAct =
new QComboBox( m_toolBar );
155 blocktypeAct->addItems(QStringList() <<
"block type");
156 blocktypeAct->addItems(QStringList() <<
"genetic" <<
"fixed" <<
"back-prop" );
157 connect(blocktypeAct, SIGNAL(currentIndexChanged(
int)),
this, SLOT(changeblocktype(
int)) );
158 m_toolBar->addWidget( blocktypeAct );
160 neurontypeAct =
new QComboBox( m_toolBar );
161 neurontypeAct->addItems( QStringList() <<
"neuron type");
162 neurontypeAct->addItems( QStringList() <<
"sigmoid" <<
"integrator" <<
"binary" <<
"sigmoid flat" );
163 connect( neurontypeAct, SIGNAL(currentIndexChanged(
int)),
this, SLOT(set_neurontype(
int)) );
164 m_toolBar->addWidget( neurontypeAct );
166 m_toolBar->addAction(display_labelAct);
167 m_toolBar->addAction(display_weightAct);
168 m_toolBar->addAction(display_deltaAct);
169 m_toolBar->addAction(display_biasAct);
170 m_toolBar->addAction(display_gainAct);
171 m_toolBar->addAction(set_neurondisplayAct);
172 m_toolBar->addAction(set_lesionAct);
173 m_toolBar->addAction(set_neuronbiasAct);
174 m_toolBar->addAction(set_neurongainAct);
175 m_toolBar->addAction(add_ublockAct);
176 m_toolBar->addAction(add_cblockAct);
177 m_toolBar->addAction(add_gblockAct);
178 m_toolBar->addAction(erase_Act);
181 void NetworkDialog::createActions()
185 openAct =
new QAction(QIcon(
":/evorobot/open.png"), tr(
"&Open"),
this);
188 openAct->setStatusTip(tr(
"Open a network architecture or a phenotype file"));
189 connect(openAct, SIGNAL(triggered()),
this, SLOT(open()));
191 saveAct =
new QAction(QIcon(
":/evorobot/save.png"), tr(
"&Save"),
this);
192 saveAct->setStatusTip(tr(
"Save the network architecture or the phenotype from a file"));
193 connect(saveAct, SIGNAL(triggered()),
this, SLOT(save()));
195 set_neurondisplayAct =
new QAction(QIcon(
":/evorobot/show.png"), tr(
"&Set/Unset neurons to be displayed as graph"),
this);
196 set_neurondisplayAct->setShortcut(tr(
"Ctrl+N"));
197 set_neurondisplayAct->setStatusTip(tr(
"Select/Deselect neurons to be displayed as graph"));
198 connect(set_neurondisplayAct, SIGNAL(triggered()),
this, SLOT(set_neurondisplay()));
200 set_neurongainAct =
new QAction(QIcon(
":/evorobot/gain.png"), tr(
"&Add/Remove neurons gain"),
this);
201 set_neurongainAct->setShortcut(tr(
"Ctrl+G"));
202 set_neurongainAct->setStatusTip(tr(
"Add/Remove neurons gain"));
203 connect(set_neurongainAct, SIGNAL(triggered()),
this, SLOT(set_neurongain()));
205 set_neuronbiasAct =
new QAction(QIcon(
":/evorobot/bias.png"), tr(
"&Add/Remove neurons biases"),
this);
206 set_neuronbiasAct->setShortcut(tr(
"Ctrl+B"));
207 set_neuronbiasAct->setStatusTip(tr(
"Add/Remove neurons bias"));
208 connect(set_neuronbiasAct, SIGNAL(triggered()),
this, SLOT(set_neuronbias()));
210 set_lesionAct =
new QAction(QIcon(
":/evorobot/lesion.png"), tr(
"&Lesion/Restore neurons"),
this);
211 set_lesionAct->setShortcut(tr(
"Ctrl+B"));
212 set_lesionAct->setStatusTip(tr(
"Lesion/Restore neurons"));
213 connect(set_lesionAct, SIGNAL(triggered()),
this, SLOT(set_lesion()));
215 display_labelAct =
new QAction(QIcon(
":/evorobot/label.png"), tr(
"&Display/Undisplay neuron labels"),
this);
216 display_labelAct->setShortcut(tr(
"Ctrl+L"));
217 display_labelAct->setStatusTip(tr(
"Display neuron labels"));
218 connect(display_labelAct, SIGNAL(triggered()),
this, SLOT(display_label()));
220 display_weightAct =
new QAction(QIcon(
":/evorobot/weight.png"), tr(
"&Display/Undisplay weights"),
this);
221 display_weightAct->setShortcut(tr(
"Ctrl+W"));
222 display_weightAct->setStatusTip(tr(
"Display the incoming and outcoming weight of a neuron"));
223 connect(display_weightAct, SIGNAL(triggered()),
this, SLOT(display_weight()));
225 display_deltaAct =
new QAction(QIcon(
":/evorobot/ddelta.png"), tr(
"&Display/Undisplay neurons delta"),
this);
226 display_deltaAct->setShortcut(tr(
"Ctrl+Y"));
227 display_deltaAct->setStatusTip(tr(
"Display neurons delta"));
228 connect(display_deltaAct, SIGNAL(triggered()),
this, SLOT(display_delta()));
230 display_biasAct =
new QAction(QIcon(
":/evorobot/dbias.png"), tr(
"&Display/Undisplay biases"),
this);
231 display_biasAct->setShortcut(tr(
"Ctrl+Z"));
232 display_biasAct->setStatusTip(tr(
"Display neurons biases"));
233 connect(display_biasAct, SIGNAL(triggered()),
this, SLOT(display_bias()));
235 display_gainAct =
new QAction(QIcon(
":/evorobot/dgain.png"), tr(
"&Display/Undisplay gains"),
this);
236 display_gainAct->setShortcut(tr(
"Ctrl+G"));
237 display_gainAct->setStatusTip(tr(
"Display neurons gains"));
238 connect(display_gainAct, SIGNAL(triggered()),
this, SLOT(display_gain()));
240 erase_Act =
new QAction(QIcon(
":/evorobot/erase.png"), tr(
"&Erase"),
this);
241 erase_Act->setShortcut(tr(
"Ctrl+E"));
242 erase_Act->setStatusTip(tr(
"Erase all or selected properties"));
243 connect(erase_Act, SIGNAL(triggered()),
this, SLOT(erase()));
245 add_ublockAct =
new QAction(QIcon(
":/evorobot/addublock.png"), tr(
"&Add Update Block"),
this);
246 add_ublockAct->setShortcut(tr(
"Ctrl+A"));
247 add_ublockAct->setStatusTip(tr(
"add an update block"));
248 connect(add_ublockAct, SIGNAL(triggered()),
this, SLOT(add_ublock()));
250 add_cblockAct =
new QAction(QIcon(
":/evorobot/addblock.png"), tr(
"&Add Connection Block"),
this);
251 add_cblockAct->setShortcut(tr(
"Ctrl+A"));
252 add_cblockAct->setStatusTip(tr(
"add a connection block"));
253 connect(add_cblockAct, SIGNAL(triggered()),
this, SLOT(add_cblock()));
255 add_gblockAct =
new QAction(QIcon(
":/evorobot/gainblock.png"), tr(
"&Add a gain block"),
this);
256 add_gblockAct->setShortcut(tr(
"Ctrl+G"));
257 add_gblockAct->setStatusTip(tr(
"add a gain block"));
258 connect(add_gblockAct, SIGNAL(triggered()),
this, SLOT(add_gblock()));
260 increasevAct =
new QShortcut(tr(
"+"),
this);
261 connect(increasevAct, SIGNAL(activated()),
this, SLOT(increasev()));
263 decreasevAct =
new QShortcut(tr(
"-"),
this);
264 connect(decreasevAct, SIGNAL(activated()),
this, SLOT(decreasev()));
271 int NetworkDialog::getcblock()
273 return(cblockAct->currentIndex() - 1);
279 void NetworkDialog::updatetoolb()
286 neurontypeAct->setCurrentIndex(enet->neurontype[cneuron[0]]+1);
293 void NetworkDialog::updateblocktype()
298 cb = cblockAct->currentIndex();
301 blocktypeAct->setCurrentIndex(enet->net_block[cb][5]+1);
308 void NetworkDialog::changeblocktype(
int t)
314 cb = cblockAct->currentIndex();
316 if (t > 0 && cb > 0 )
318 oldt = enet->net_block[cb][5];
319 enet->net_block[cb][5] = t - 1;
322 statusb->setText(QString(
"The type of the selected block has been modified"));
328 void NetworkDialog::set_neurondisplay()
334 if (enet->neurondisplay[cneuron[0]] == 1)
335 enet->neurondisplay[cneuron[0]] = 0;
337 enet->neurondisplay[cneuron[0]] = 1;
341 if (enet->neurondisplay[cneuron[0]] == 1)
342 for (i=cneuron[0]; i <= cneuron[1]; i++)
343 enet->neurondisplay[i] = 0;
345 for (i=cneuron[0]; i <= cneuron[1]; i++)
346 enet->neurondisplay[i] = 1;
348 if (cneuronn < 1 || cneuronn > 2)
349 warning(
"you should select one neuron or one block of neurons first");
351 statusb->setText(QString(
"Neurons to be monitored have been updated"));
354 rendNetwork->update();
358 void NetworkDialog::set_neurontype(
int t)
365 oldt = enet->neurontype[cneuron[0]];
368 enet->neurontype[cneuron[0]] = t-1;
372 for (
int i=cneuron[0]; i <= cneuron[1]; i++)
374 enet->neurontype[i] = t-1;
377 if (cneuronn < 1 || cneuronn > 2)
378 warning(
"you should select one neuron or one block of neurons first");
381 if (oldt != enet->neurontype[cneuron[0]])
382 statusb->setText(QString(
"Neurons' type updated"));
385 rendNetwork->update();
393 void NetworkDialog::selblock_changed(
int t)
396 statusb->setText(QString(
"Block selected"));
397 emit selectedblockChanged();
398 rendNetwork->update();
402 void NetworkDialog::set_neurongain()
406 if (cneuronn < 1 || cneuronn > 2)
408 warning(
"you should select one neuron or one block of neurons first");
414 if (enet->neurongain[cneuron[0]] == 1)
416 enet->neurongain[cneuron[0]] = 0;
417 statusb->setText(QString(
"Neuron's gain eliminated"));
421 enet->neurongain[cneuron[0]] = 1;
422 statusb->setText(QString(
"Neuron's gain added"));
427 if (enet->neurongain[cneuron[0]] == 1)
429 for (i=cneuron[0]; i <= cneuron[1]; i++)
430 enet->neurongain[i] = 0;
431 statusb->setText(QString(
"Neurons' gain eliminated"));
435 for (i=cneuron[0]; i <= cneuron[1]; i++)
436 enet->neurongain[i] = 1;
437 statusb->setText(QString(
"Neurons' gain added"));
444 rendNetwork->update();
450 void NetworkDialog::set_neuronbias()
454 if (cneuronn < 1 || cneuronn > 2)
456 warning(
"you should select one neuron or one block of neurons first");
462 if (enet->neuronbias[cneuron[0]] == 1)
464 enet->neuronbias[cneuron[0]] = 0;
465 statusb->setText(QString(
"Neuron's bias eliminated"));
469 enet->neuronbias[cneuron[0]] = 1;
470 statusb->setText(QString(
"Neuron's bias added"));
475 if (enet->neuronbias[cneuron[0]] == 1)
477 for (i=cneuron[0]; i <= cneuron[1]; i++)
478 enet->neuronbias[i] = 0;
479 statusb->setText(QString(
"Neurons' bias eliminated"));
483 for (i=cneuron[0]; i <= cneuron[1]; i++)
484 enet->neuronbias[i] = 1;
485 statusb->setText(QString(
"Neurons' bias added"));
489 rendNetwork->update();
497 void NetworkDialog::set_lesion()
500 if (enet->neuronlesions == 0)
504 enet->neuronlesion[cneuron[0]]=!enet->neuronlesion[cneuron[0]];
506 enet->neuronlesions = 1;
508 statusb->setText(QString(
"Neuron's lesioned"));
509 rendNetwork->update();
514 for(
int ls = cneuron[0]; ls <= cneuron[1]; ls++)
516 enet->neuronlesion[ls] = !enet->neuronlesion[ls];
517 enet->neuronlesions++;
521 statusb->setText(QString(
"Neurons' lesioned"));
522 rendNetwork->update();
526 warning(
"you should select one neuron or one block of neurons first");
531 enet->neuronlesions = 0;
532 for (
int i = 0; i < enet->nneurons; i++)
534 enet->neuronlesion[i]=
false;
535 enet->neuronlesionVal[i]=0.0;
538 statusb->setText(QString(
"Neurons un-lesioned"));
539 rendNetwork->update();
544 void NetworkDialog::display_label()
549 pseudo_activate_net();
550 statusb->setText(QString(
"Neurons labels displayed"));
551 rendNetwork->update();
558 void NetworkDialog::display_delta()
561 if (cneuronn == 1 || cneuronn == 2)
564 pseudo_activate_net();
567 statusb->setText(QString(
"Neurons' timeconstants weight displayed"));
568 rendNetwork->update();
572 warning(
"you should select one neuron or one block of neurons first");
578 void NetworkDialog::display_weight()
584 pseudo_activate_net();
585 statusb->setText(QString(
"Connections weights displayed"));
588 rendNetwork->update();
592 warning(
"you should select the receiving and sending block of neurons first (4 neurons)");
597 void NetworkDialog::display_bias()
600 if (cneuronn == 1 || cneuronn == 2)
603 pseudo_activate_net();
604 statusb->setText(QString(
"Biases weight displayed"));
605 rendNetwork->update();
610 warning(
"you should select one neuron or one block of neurons first");
616 void NetworkDialog::display_gain()
620 if (cneuronn == 1 || cneuronn == 2)
623 pseudo_activate_net();
626 statusb->setText(QString(
"Neurons' gain weight displayed"));
627 rendNetwork->update();
631 warning(
"you should select one neuron or one block of neurons first");
637 void NetworkDialog::erase()
645 cblock = getcblock();
650 enet->net_nblocks = 0;
652 cblockAct->addItems(QStringList() <<
"blocks list");
653 for(i=0;i < enet->nneurons; i++)
655 enet->neuronbias[i] = 0;
656 enet->neurontype[i] = 0;
657 enet->neurongain[i] = 0;
658 enet->neurondisplay[i] = 1;
660 statusb->setText(QString(
"All blocks erased and neurons' properties reset"));
665 cblockAct->removeItem(cblock+1);
666 cblockAct->setCurrentIndex(0);
667 for (bb=cblock; bb < (enet->net_nblocks - 1); bb++)
668 for (ii=0; ii < 5; ii++)
669 enet->net_block[bb][ii] = enet->net_block[bb+1][ii];
671 statusb->setText(QString(
"Selected block erased"));
673 rendNetwork->update();
678 void NetworkDialog::add_ublock()
685 if (cneuronn != 1 && cneuronn != 2)
687 warning(
"you should select a a lock (2 neurons) first");
691 cblock = getcblock();
693 cblock = enet->net_nblocks;
697 for(i=enet->net_nblocks; i > cblock; i--)
698 for(ii=0; ii<5; ii++)
699 enet->net_block[i][ii] = enet->net_block[i-1][ii];
700 enet->net_block[cblock][0] = 1;
701 enet->net_block[cblock][1] = cneuron[0];
702 enet->net_block[cblock][2] = 1;
703 enet->net_block[cblock][3] = 0;
704 enet->net_block[cblock][4] = 0;
705 block_name(cblock, stblock);
706 cblockAct->insertItems(cblock+1, QStringList() << stblock);
713 for(i=enet->net_nblocks; i > cblock; i--)
714 for(ii=0; ii<5; ii++)
715 enet->net_block[i][ii] = enet->net_block[i-1][ii];
716 enet->net_block[cblock][0] = 1;
717 enet->net_block[cblock][1] = cneuron[0];
718 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
719 enet->net_block[cblock][3] = 0;
720 enet->net_block[cblock][4] = 0;
721 block_name(cblock, stblock);
722 cblockAct->insertItems(cblock+1, QStringList() << stblock);
727 cblockAct->setCurrentIndex(0);
728 statusb->setText(QString(
"Update block added"));
729 rendNetwork->update();
734 void NetworkDialog::add_cblock()
744 warning(
"you should select the receiving and sending blocks (4 neurons) first");
748 cblock = getcblock();
749 printf(
"cblock %d\n", cblock);
751 cblock = enet->net_nblocks;
756 for(i=enet->net_nblocks; i > cblock; i--)
757 for(ii=0; ii<5; ii++)
758 enet->net_block[i][ii] = enet->net_block[i-1][ii];
759 enet->net_block[cblock][0] = 0;
760 enet->net_block[cblock][1] = cneuron[0];
761 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
762 enet->net_block[cblock][3] = cneuron[2];
763 enet->net_block[cblock][4] = cneuron[3] - cneuron[2] + 1;
764 block_name(cblock, stblock);
765 cblockAct->insertItems(cblock+1, QStringList() << stblock);
770 cblockAct->setCurrentIndex(0);
771 statusb->setText(QString(
"Connection block added"));
772 rendNetwork->update();
776 void NetworkDialog::add_gblock()
783 if (cneuronn != 2 && cneuronn != 3)
785 warning(
"you should select a block (2 neurons) and eventually a third neuron first");
789 cblock = getcblock();
791 cblock = enet->net_nblocks;
797 for(i=enet->net_nblocks; i > cblock; i--)
798 for(ii=0; ii<5; ii++)
799 enet->net_block[i][ii] = enet->net_block[i-1][ii];
800 enet->net_block[cblock][0] = 2;
801 enet->net_block[cblock][1] = cneuron[0];
802 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
803 enet->net_block[cblock][3] = 0;
804 enet->net_block[cblock][4] = 0;
805 block_name(cblock, stblock);
806 cblockAct->insertItems(cblock+1, QStringList() << stblock);
813 for(i=enet->net_nblocks; i > cblock; i--)
814 for(ii=0; ii<5; ii++)
815 enet->net_block[i][ii] = enet->net_block[i-1][ii];
816 enet->net_block[cblock][0] = 3;
817 enet->net_block[cblock][1] = cneuron[0];
818 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
819 enet->net_block[cblock][3] = cneuron[2];
820 enet->net_block[cblock][4] = 0;
821 block_name(cblock, stblock);
822 cblockAct->insertItems(cblock+1, QStringList() << stblock);
827 cblockAct->setCurrentIndex(0);
828 statusb->setText(QString(
"Gain block added"));
829 rendNetwork->update();
836 void NetworkDialog::open()
844 QString fileName = QFileDialog::getOpenFileName(
this,
845 "Choose a filename to open",
850 if (fileName.endsWith(
"net"))
852 filen = fileName.toAscii();
856 statusb->setText(QString(
"File %1 loaded").arg(filename));
859 if (fileName.endsWith(
"phe"))
861 filen = fileName.toAscii();
865 statusb->setText(QString(
"File %1 loaded").arg(filename));
873 void NetworkDialog::save()
881 QString fileName = QFileDialog::getSaveFileName(
this,
882 "Choose a filename to save",
887 if (fileName.endsWith(
"net"))
889 filen = fileName.toAscii();
892 enet->save_net_blocks(filename, 0);
893 statusb->setText(QString(
"File %1 saved").arg(filename));
897 if (fileName.endsWith(
"phe"))
899 filen = fileName.toAscii();
902 enet->save_net_blocks(filename, 1);
903 statusb->setText(QString(
"File %1 saved").arg(filename));
909 void NetworkDialog::increasev()
919 pseudo_activate_net();
920 if (enet->nselected == 1)
922 gp = enet->selectedp;
924 *v += ((enet->wrange * 2.0f) / 256.0f);
925 pseudo_activate_net();
926 rendNetwork->update();
933 if (pseudomode != 1 && pseudomode != 4)
935 pseudo_activate_net();
936 if (enet->nselected == 1)
938 gp = enet->selectedp;
940 *v += ((enet->wrange * 2.0f) / 256.0f);
941 pseudo_activate_net();
942 rendNetwork->update();
949 void NetworkDialog::decreasev()
960 pseudo_activate_net();
961 if (enet->nselected == 1)
963 gp = enet->selectedp;
965 *v -= ((enet->wrange * 2.0f) / 256.0f);
966 pseudo_activate_net();
967 rendNetwork->update();
974 if (pseudomode != 1 && pseudomode != 4)
976 pseudo_activate_net();
977 if (enet->nselected == 1)
979 gp = enet->selectedp;
981 *v -= ((enet->wrange * 2.0f) / 256.0f);
982 pseudo_activate_net();
983 rendNetwork->update();
990 void NetworkDialog::block_name(
int b,
char *st)
992 switch(enet->net_block[b][0])
995 sprintf(st,
"c) %s_%s %s_%s", enet->neuronl[enet->net_block[b][1]], enet->neuronl[enet->net_block[b][1]+enet->net_block[b][2]-1],enet->neuronl[enet->net_block[b][3]],enet->neuronl[enet->net_block[b][3]+enet->net_block[b][4]-1]);
998 sprintf(st,
"u) %s_%s", enet->neuronl[enet->net_block[b][1]], enet->neuronl[enet->net_block[b][1]+enet->net_block[b][2]-1]);
1001 sprintf(st,
"g) %s_%s", enet->neuronl[enet->net_block[b][1]], enet->neuronl[enet->net_block[b][1]+enet->net_block[b][2]-1]);
1004 sprintf(st,
"g) %s_%s %s", enet->neuronl[enet->net_block[b][1]], enet->neuronl[enet->net_block[b][1]+enet->net_block[b][2]-1],enet->neuronl[enet->net_block[b][3]]);
1007 sprintf(st,
"undefined block type");
1019 NetworkDialog::pseudo_activate_net()
1052 gp = enet->selectedp;
1053 enet->nselected = 0;
1055 for(i=0;i < enet->nneurons;i++)
1056 strcpy(neuroncl[i],enet->neuronl[i]);
1062 for(i=0;i < enet->nneurons;i++)
1064 if (enet->neurongain[i] == 1)
1066 if (dgain > 0 && ((cneuronn == 1 && i == cneuron[0]) || (cneuronn == 2 && i >= cneuron[0] && i <= cneuron[1])))
1068 gain = (fabs((
double) *p) / enet->wrange) * enet->grange;
1069 sprintf(neuroncl[i],
"%.1f",gain);
1079 for(i=0;i < enet->nneurons;i++)
1081 if (enet->neuronbias[i] == 1)
1083 if (dbias > 0 && ((cneuronn == 1 && i == cneuron[0]) || (cneuronn == 2 && i >= cneuron[0] && i <= cneuron[1])))
1085 bias = (fabs((
double) *p) / enet->wrange) * enet->brange;
1086 sprintf(neuroncl[i],
"%.1f",bias);
1096 for (b=0; b < enet->net_nblocks; b++)
1099 if (enet->net_block[b][0] == 0)
1101 for(t=enet->net_block[b][1]; t < enet->net_block[b][1] + enet->net_block[b][2];t++)
1102 for(i=enet->net_block[b][3]; i < enet->net_block[b][3] + enet->net_block[b][4];i++)
1105 if (dweight == 1 && cneuronn == 4 && (t >= cneuron[0] && t <= cneuron[1]) && (i >= cneuron[2] && i <= cneuron[3]))
1108 if (cneuron[0] == cneuron[1])
1109 sprintf(neuroncl[i],
"%.1f",*p);
1118 if (enet->net_block[b][0] == 1)
1120 for(t=enet->net_block[b][1]; t < (enet->net_block[b][1] + enet->net_block[b][2]); t++)
1123 if (enet->neurontype[t] != 1)
1130 delta = (float) (fabs((
double) *p) / enet->wrange);
1131 if (ddelta > 0 && ((cneuronn == 1 && t == cneuron[0]) || (cneuronn == 2 && t >= cneuron[0] && t <= cneuron[1])))
1133 sprintf(neuroncl[t],
"%.1f",delta);
1150 void NetworkDialog::openMixer()
1154 mixerDialog->setUpMixer();
1155 mixerDialog->show();
1156 rendNetwork->update();
1166 RendNetwork::RendNetwork( NetworkDialog* networkDialog, QWidget *parent)
1170 antialiased =
false;
1171 pixmap.load(
":/evorobot/qt-logo.png");
1173 setBackgroundRole(QPalette::Base);
1174 this->networkDialog = networkDialog;
1180 QSize RendNetwork::minimumSizeHint()
const
1182 return QSize(250, 250);
1185 QSize RendNetwork::sizeHint()
const
1187 return QSize(550, 500);
1190 void RendNetwork::setShape(Shape shape)
1192 this->shape = shape;
1196 void RendNetwork::setPen(
const QPen &pen)
1204 void RendNetwork::setBrush(
const QBrush &brush)
1206 this->brush = brush;
1210 void RendNetwork::setAntialiased(
bool antialiased)
1212 this->antialiased = antialiased;
1216 void RendNetwork::setTransformed(
bool transformed)
1218 this->transformed = transformed;
1223 void RendNetwork::paintEvent(QPaintEvent *)
1234 int selectedneurons[2];
1235 QPainter painter(
this);
1237 QRect labelxy(0,0,30,20);
1239 painter.setPen(pen);
1240 QPen pen(Qt::black, 1);
1241 painter.setPen(pen);
1242 selectedneurons[0] = selectedneurons[1] = -1;
1244 if (networkDialog->enet->drawnxmax > 0 && networkDialog->enet->drawnymax > 0)
1246 networkDialog->cscaley = height() / (float) networkDialog->enet->drawnymax;
1247 networkDialog->cscalex = width() / (float) networkDialog->enet->drawnxmax;
1248 painter.scale(networkDialog->cscalex, networkDialog->cscaley);
1252 painter.scale(1.0,1.0);
1254 painter.setPen(Qt::gray);
1256 p = networkDialog->enet->freep;
1257 for(i=0;i < networkDialog->enet->nneurons;i++)
1259 if (networkDialog->enet->neurongain[i] == 1)
1262 for(i=0;i < networkDialog->enet->nneurons;i++)
1264 if (networkDialog->enet->neuronbias[i] == 1)
1266 networkDialog->biases[i] = *p;
1271 for (i=0; i < networkDialog->enet->net_nblocks; i++)
1273 if (networkDialog->enet->net_block[i][0] == 0)
1274 for (t=networkDialog->enet->net_block[i][1]; t < (networkDialog->enet->net_block[i][1] + networkDialog->enet->net_block[i][2]); t++)
1275 for (b=networkDialog->enet->net_block[i][3]; b < (networkDialog->enet->net_block[i][3] + networkDialog->enet->net_block[i][4]); b++)
1278 if (networkDialog->getcblock() == i)
1283 if (w != networkDialog->enet->DEFAULT_VALUE)
1285 if (w > networkDialog->enet->wrange)
1286 w = networkDialog->enet->wrange;
1287 if (w < (0.0 - networkDialog->enet->wrange))
1288 w = 0.0 - networkDialog->enet->wrange;
1292 cg -= ((w / networkDialog->enet->wrange) * 255);
1293 cb -= ((w / networkDialog->enet->wrange) * 255);
1297 cg += ((w / networkDialog->enet->wrange) * 255);
1298 cr += ((w / networkDialog->enet->wrange) * 255);
1308 painter.setPen(QPen(QColor(cr,cg,cb,255), wid, Qt::SolidLine));
1310 if (abs(networkDialog->enet->neuronxy[b][1] - networkDialog->enet->neuronxy[t][1]) > 20)
1311 painter.drawLine((
float) networkDialog->enet->neuronxy[t][0], (
float) networkDialog->enet->neuronxy[t][1], (
float) networkDialog->enet->neuronxy[b][0], (
float) networkDialog->enet->neuronxy[b][1]);
1314 dx = abs(networkDialog->enet->neuronxy[t][0] - networkDialog->enet->neuronxy[b][0]);
1315 dy = abs(networkDialog->enet->neuronxy[t][1] - networkDialog->enet->neuronxy[b][1]);
1316 if (networkDialog->enet->neuronxy[t][0] < networkDialog->enet->neuronxy[b][0])
1317 sx = networkDialog->enet->neuronxy[t][0];
1319 sx = networkDialog->enet->neuronxy[b][0];
1320 if (networkDialog->enet->neuronxy[t][1] < networkDialog->enet->neuronxy[b][1])
1321 sy = networkDialog->enet->neuronxy[t][1];
1323 sy = networkDialog->enet->neuronxy[b][1];
1324 painter.drawArc((
float) sx,(
float) (sy-20),(
float) dx, (
float) (dy+40), 0 * 16, 180 * 16);
1328 if (networkDialog->enet->net_block[i][0] == 1)
1330 if (networkDialog->getcblock() == i)
1332 selectedneurons[0] = networkDialog->enet->net_block[i][1];
1333 selectedneurons[1] = networkDialog->enet->net_block[i][2];
1335 for(t=networkDialog->enet->net_block[i][1]; t < (networkDialog->enet->net_block[i][1] + networkDialog->enet->net_block[i][2]); t++)
1336 if (networkDialog->enet->neurontype[t] == 1)
1341 for (i=0; i < networkDialog->enet->nneurons; i++)
1343 if (networkDialog->enet->neuronbias[i] == 1)
1345 w = networkDialog->biases[i];
1346 if (w != networkDialog->enet->DEFAULT_VALUE)
1348 if (w > networkDialog->enet->wrange)
1349 w = networkDialog->enet->wrange;
1350 if (w < (0.0 - networkDialog->enet->wrange))
1351 w = 0.0 - networkDialog->enet->wrange;
1355 cg -= ((w / networkDialog->enet->wrange) * 255);
1356 cb -= ((w / networkDialog->enet->wrange) * 255);
1360 cg += ((w / networkDialog->enet->wrange) * 255);
1361 cr += ((w / networkDialog->enet->wrange) * 255);
1371 if (i >= selectedneurons[0] && i < selectedneurons[0]+selectedneurons[1])
1373 painter.setPen(QPen(QColor(cr,cg,cb,255), wid, Qt::SolidLine));
1378 if (i >= selectedneurons[0] && i < selectedneurons[0]+selectedneurons[1])
1380 painter.setPen(QPen(Qt::black, wid, Qt::SolidLine));
1383 if (networkDialog->enet->neurontype[i] == 0)
1384 painter.setBrush(QBrush(QColor(75, 75, 75, 255), Qt::SolidPattern));
1386 if (networkDialog->enet->neurontype[i] == 1)
1387 painter.setBrush(QBrush(QColor(255, 0, 0, 255), Qt::SolidPattern));
1389 if (networkDialog->enet->neurontype[i] == 2)
1390 painter.setBrush(QBrush(QColor(0, 0, 255, 255), Qt::SolidPattern));
1392 painter.setBrush(QBrush(QColor(150, 150, 150, 255), Qt::SolidPattern));
1394 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 5), 10.0, 10.0);
1397 if (networkDialog->enet->neurongain[i] == 1)
1399 painter.setPen(QPen(QColor(255,255,255,255), wid, Qt::SolidLine));
1400 painter.setBrush(QBrush(QColor(255, 255, 255, 255), Qt::SolidPattern));
1401 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 1), (
float) (networkDialog->enet->neuronxy[i][1] - 1), 2.0, 2.0);
1406 painter.setPen(Qt::black);
1407 for (i=0; i < networkDialog->enet->nneurons; i++)
1409 if (networkDialog->enet->neurondisplay[i] == 1)
1410 painter.setPen(Qt::black);
1412 painter.setPen(Qt::red);
1413 if (i < networkDialog->ninputs)
1414 labelxy.setRect((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] + 5), 30, 30);
1416 labelxy.setRect((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 18), 30, 30);
1417 painter.drawText(labelxy, networkDialog->neuroncl[i]);
1419 painter.setPen(Qt::darkRed);
1420 if (networkDialog->enet->neuronlesion[i]) painter.drawText(networkDialog->enet->neuronxy[i][0]-5,networkDialog->enet->neuronxy[i][1]-5,
"X");
1423 painter.setBrush(Qt::black);
1424 if (networkDialog->cneuronn == 1)
1425 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][1] - 5), 10.0, 10.0);
1426 if (networkDialog->cneuronn >= 2)
1428 if (networkDialog->cneuron[0] <= networkDialog->cneuron[1])
1430 for (i=networkDialog->cneuron[0]; i <= networkDialog->cneuron[1]; i++)
1431 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 5), 10.0, 10.0);
1435 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][1] - 5), 10.0, 10.0);
1436 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[1]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[1]][1] - 5), 10.0, 10.0);
1439 painter.setBrush(Qt::blue);
1440 if (networkDialog->cneuronn == 3)
1441 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[2]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[2]][1] - 5), 10.0, 10.0);
1442 if (networkDialog->cneuronn == 4 && networkDialog->cneuron[2] <= networkDialog->cneuron[3])
1443 for (i=networkDialog->cneuron[2]; i <= networkDialog->cneuron[3]; i++)
1444 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 5), 10.0, 10.0);
1455 RendNetwork::mousePressEvent(QMouseEvent *event)
1483 for(i=0; i < networkDialog->enet->nneurons; i++)
1485 if (mdist((
float) x,(
float) y, (
float) networkDialog->enet->neuronxy[i][0] * networkDialog->cscalex, (
float) networkDialog->enet->neuronxy[i][1] * networkDialog->cscaley) < 10.0)
1487 if (networkDialog->cneuronn >= 4)
1488 networkDialog->cneuronn = 0;
1489 networkDialog->cneuron[networkDialog->cneuronn] = i;
1490 networkDialog->cneuronn++;
1492 networkDialog->statusb->setText(QString(
"%1 neurons selected").arg(networkDialog->cneuronn));
1493 emit selectedneuronsChanged();
1500 for (i=0; i < networkDialog->enet->net_nblocks; i++)
1502 if (networkDialog->enet->net_block[i][0] == 0)
1503 for (t=networkDialog->enet->net_block[i][1]; t < (networkDialog->enet->net_block[i][1] + networkDialog->enet->net_block[i][2]); t++)
1504 for (b=networkDialog->enet->net_block[i][3]; b < (networkDialog->enet->net_block[i][3] + networkDialog->enet->net_block[i][4]); b++)
1506 cdist = segmentdist((
float) x, (
float) y, (
float) networkDialog->enet->neuronxy[t][0] * networkDialog->cscalex, (
float) networkDialog->enet->neuronxy[t][1] * networkDialog->cscaley, (
float) networkDialog->enet->neuronxy[b][0] * networkDialog->cscalex, (
float) networkDialog->enet->neuronxy[b][1] * networkDialog->cscaley);
1508 if (cdist < 1 && cdist < dist)
1511 networkDialog->cneuron[0] = t;
1512 networkDialog->cneuron[1] = t;
1513 networkDialog->cneuron[2] = b;
1514 networkDialog->cneuron[3] = b;
1515 networkDialog->cneuronn = 4;
1516 networkDialog->statusb->setText(QString(
"A single connection have been selected"));
1527 networkDialog->cneuronn = 0;
1528 networkDialog->pseudomode = 0;
1529 networkDialog->pseudo_activate_net();
1530 networkDialog->statusb->setText(QString(
"0 selected neurons"));
1531 emit selectedneuronsChanged();
1546 RendNetwork::mouseMoveEvent(QMouseEvent *event)
1562 networkDialog->cneuronn = 0;
1565 for(i=0, cn=-1; i < networkDialog->enet->nneurons; i++)
1566 if (mdist((
float) rnmousex,(
float) rnmousey, (
float) networkDialog->enet->neuronxy[i][0] * networkDialog->cscalex, (
float) networkDialog->enet->neuronxy[i][1] * networkDialog->cscaley) < 10.0)
1570 networkDialog->enet->neuronxy[cn][0] = (float) x / networkDialog->cscalex;
1571 networkDialog->enet->neuronxy[cn][1] = (
float) y / networkDialog->cscaley;
1576 networkDialog->statusb->setText(QString(
"neuron position modified"));
1590 RendNetwork::mouseReleaseEvent(QMouseEvent *event)
1601 if (networkDialog->grid > 0)
1604 rnmousex=
event->x();
1605 rnmousey=
event->y();
1611 for(i=0, cn=-1; i < networkDialog->enet->nneurons; i++)
1612 if (mdist((
float) rnmousex,(
float) rnmousey, networkDialog->enet->neuronxy[i][0], networkDialog->enet->neuronxy[i][1]) < 10.0)
1616 oldp1 = networkDialog->enet->neuronxy[cn][0];
1617 oldp2 = networkDialog->enet->neuronxy[cn][1];
1618 networkDialog->enet->neuronxy[cn][0] = (float) (((
int) networkDialog->enet->neuronxy[cn][0]) / networkDialog->grid * networkDialog->grid);
1619 networkDialog->enet->neuronxy[cn][1] = (float) (((
int) networkDialog->enet->neuronxy[cn][1]) / networkDialog->grid * networkDialog->grid);
1620 if ((oldp1 - networkDialog->enet->neuronxy[cn][0]) > (networkDialog->grid / 2))
1621 networkDialog->enet->neuronxy[cn][0] += networkDialog->grid;
1622 if ((oldp2 - networkDialog->enet->neuronxy[cn][1]) > (networkDialog->grid / 2))
1623 networkDialog->enet->neuronxy[cn][1] += networkDialog->grid;
1625 networkDialog->statusb->setText(QString(
"neuron's position modified"));
1635 *o = (float) (((
int) *o) / networkDialog->grid * networkDialog->grid);
1636 *(o + 1) = (
float) (((int) *(o + 1)) / networkDialog->grid * networkDialog->grid);
1637 if ((oldp1 - *o) > (networkDialog->grid / 2))
1638 *o += networkDialog->grid;
1639 if ((oldp2 - *(o + 1)) > (networkDialog->grid / 2))
1640 *(o + 1) += networkDialog->grid;
1641 networkDialog->statusb->setText(QString(
"neuron's position modified"));
1656 RendNetwork::mouseDoubleClickEvent(QMouseEvent* )
1664 RendNetwork::mdist(
float x,
float y,
float x1,
float y1)
1669 qdist = ((x-x1)*(x-x1)) + ((y-y1)*(y-y1));
1670 return(sqrt(qdist));
1680 RendNetwork::segmentdist(
float px,
float py,
float ax,
float ay,
float bx,
float by)
1684 dab = sqrt(((ax-bx)*(ax-bx)) + ((ay-by)*(ay-by)));
1685 dpa = sqrt(((px-ax)*(px-ax)) + ((py-ay)*(py-ay)));
1686 dpb = sqrt(((px-bx)*(px-bx)) + ((py-by)*(py-by)));
1688 if (dpa < dab && dpb < dab)
1689 return((dpa+dpb)-dab);
1695 EvoSlider::EvoSlider(
float *ref,
float rangemin ,
float rangemax, QWidget * parent)
1698 setRange((
int)(rangemin*100),(
int)(rangemax*100));
1699 setValue( (*vref)*100 );
1700 setOrientation(Qt::Vertical);
1701 connect(
this,SIGNAL(valueChanged(
int)),
this, SLOT(updateValue(
int)));
1704 void EvoSlider::updateValue(
int ival)
1706 *vref=(float)ival/100.0;
1707 emit networkChanged();
1711 MixerDialog::MixerDialog(Evonet *enet, NetworkDialog* netd)
1716 layout=
new QGridLayout(
this);
1719 void MixerDialog::setUpMixer()
1721 foreach( QWidget*
object, findChildren<QWidget*>() ) {
1725 if(evonet->neuronlesions || evonet->nselected > 0)
1727 statusmixer =
new QLabel(
"",
this);
1728 if (netdl->pseudomode == 2)
1729 statusmixer->setText(QString(
"weights:"));
1730 if (netdl->pseudomode == 1)
1731 statusmixer->setText(QString(
"t-const:"));
1732 if (netdl->pseudomode == 3)
1733 statusmixer->setText(QString(
"biases:"));
1734 if (netdl->pseudomode == 4)
1735 statusmixer->setText(QString(
"gains:"));
1736 if (evonet->neuronlesions)
1737 statusmixer->setText(QString(
"neurons:"));
1738 layout->addWidget(statusmixer,0,0);
1739 Logger::info(QString(
"Mixer for n.%1 selected parameters\n").arg(evonet->neuronlesions+evonet->nselected));
1749 if (evonet->nselected > 0)
1751 gp = evonet->selectedp;
1753 if (netdl->pseudomode == 2)
1756 lt = netdl->cneuron[0];
1757 li = netdl->cneuron[2];
1759 for(
int i=0;i<evonet->nselected;i++,v++,li++)
1761 if (li > netdl->cneuron[3])
1764 li = netdl->cneuron[2];
1767 layout->addWidget(
new QLabel(evonet->neuronl[lt],
this),1,i);
1768 EvoSlider* slide =
new EvoSlider(v,(0 - evonet->getWrange()),evonet->getWrange(),
this);
1769 connect( slide, SIGNAL(networkChanged()), netdl->rendNetwork, SLOT(update()) );
1770 layout->addWidget(slide,2,i);
1771 layout->addWidget(
new QLabel(evonet->neuronl[li],
this),3,i);
1777 l = netdl->cneuron[0];
1778 for(
int i=0;i<evonet->nselected;i++,v++,l++)
1780 layout->addWidget(
new QLabel(evonet->neuronl[l],
this),1,i);
1781 EvoSlider* slide =
new EvoSlider(v,(0 - evonet->getWrange()),evonet->getWrange(),
this);
1782 connect( slide, SIGNAL(networkChanged()), netdl->rendNetwork, SLOT(update()) );
1783 layout->addWidget(slide,2,i);
1790 for(
int i=0;i<evonet->getNoNeurons();i++)
1791 if(evonet->neuronlesion[i])
1793 layout->addWidget(
new QLabel(evonet->neuronl[i],
this),1,i);
1794 EvoSlider* slide =
new EvoSlider(&evonet->neuronlesionVal[i],evonet->neuronrange[i][0],evonet->neuronrange[i][1],
this);
1795 connect( slide, SIGNAL(networkChanged()), netdl->rendNetwork, SLOT(update()) );
1796 layout->addWidget(slide,2,i);
1805 #if defined(_MSC_VER)
1806 #pragma warning(pop)