24 #include "displaycontroller.h"
28 #include <QFileDialog>
29 #include <QMessageBox>
40 #pragma warning(disable:4996)
43 #define MAXFREEP 10000
47 NetworkDialog::NetworkDialog(Evonet* net, QWidget* parent, Qt::WindowFlags flags) : QWidget( parent, flags )
60 m_mainLayout =
new QVBoxLayout(
this);
65 m_toolBar =
new QToolBar(
this);
66 m_mainLayout->addWidget(m_toolBar);
69 this->enet->neuronlesions = 0;
73 rendNetwork =
new RendNetwork(
this );
74 m_mainLayout->addWidget( rendNetwork, 4 );
76 mixerDialog =
new MixerDialog( enet,
this );
77 m_mainLayout->addWidget( mixerDialog );
80 statusb =
new QLabel(
"",
this);
81 m_mainLayout->addWidget(statusb);
83 connect(rendNetwork, SIGNAL(selectedneuronsChanged()),
this, SLOT(updatetoolb()) );
87 NetworkDialog::~NetworkDialog()
123 void NetworkDialog::error(
const char *emessage)
125 QMessageBox::about(
this,
"ERROR", emessage);
128 void NetworkDialog::warning(
const char *emessage)
130 QMessageBox::about(
this,
"WARNING", emessage);
134 void NetworkDialog::createToolBars()
140 m_toolBar->addAction(openAct);
141 m_toolBar->addAction(saveAct);
143 cblockAct =
new QComboBox( m_toolBar );
144 cblockAct->addItems(QStringList() <<
"blocks list");
145 for (b=0; b < enet->net_nblocks; b++)
147 block_name(b, stblock);
148 cblockAct->addItems(QStringList() << stblock);
150 connect( cblockAct, SIGNAL(currentIndexChanged(
int)),
this, SLOT(selblock_changed(
int)) );
151 connect(
this, SIGNAL(selectedblockChanged()),
this, SLOT(updateblocktype()) );
153 m_toolBar->addWidget( cblockAct );
155 blocktypeAct =
new QComboBox( m_toolBar );
156 blocktypeAct->addItems(QStringList() <<
"block type");
157 blocktypeAct->addItems(QStringList() <<
"genetic" <<
"fixed" <<
"back-prop" );
158 connect(blocktypeAct, SIGNAL(currentIndexChanged(
int)),
this, SLOT(changeblocktype(
int)) );
159 m_toolBar->addWidget( blocktypeAct );
161 neurontypeAct =
new QComboBox( m_toolBar );
162 neurontypeAct->addItems( QStringList() <<
"neuron type");
163 neurontypeAct->addItems( QStringList() <<
"sigmoid" <<
"integrator" <<
"binary" <<
"sigmoid flat" );
164 connect( neurontypeAct, SIGNAL(currentIndexChanged(
int)),
this, SLOT(set_neurontype(
int)) );
165 m_toolBar->addWidget( neurontypeAct );
167 m_toolBar->addAction(display_labelAct);
168 m_toolBar->addAction(display_weightAct);
169 m_toolBar->addAction(display_deltaAct);
170 m_toolBar->addAction(display_biasAct);
171 m_toolBar->addAction(display_gainAct);
172 m_toolBar->addAction(set_neurondisplayAct);
173 m_toolBar->addAction(set_lesionAct);
174 m_toolBar->addAction(set_neuronbiasAct);
175 m_toolBar->addAction(set_neurongainAct);
176 m_toolBar->addAction(add_ublockAct);
177 m_toolBar->addAction(add_cblockAct);
178 m_toolBar->addAction(add_gblockAct);
179 m_toolBar->addAction(erase_Act);
182 void NetworkDialog::createActions()
186 openAct =
new QAction(QIcon(
":/evorobot/open.png"), tr(
"&Open"),
this);
189 openAct->setStatusTip(tr(
"Open a network architecture or a phenotype file"));
190 connect(openAct, SIGNAL(triggered()),
this, SLOT(open()));
192 saveAct =
new QAction(QIcon(
":/evorobot/save.png"), tr(
"&Save"),
this);
193 saveAct->setStatusTip(tr(
"Save the network architecture or the phenotype from a file"));
194 connect(saveAct, SIGNAL(triggered()),
this, SLOT(save()));
196 set_neurondisplayAct =
new QAction(QIcon(
":/evorobot/show.png"), tr(
"&Set/Unset neurons to be displayed as graph"),
this);
197 set_neurondisplayAct->setShortcut(tr(
"Ctrl+N"));
198 set_neurondisplayAct->setStatusTip(tr(
"Select/Deselect neurons to be displayed as graph"));
199 connect(set_neurondisplayAct, SIGNAL(triggered()),
this, SLOT(set_neurondisplay()));
201 set_neurongainAct =
new QAction(QIcon(
":/evorobot/gain.png"), tr(
"&Add/Remove neurons gain"),
this);
202 set_neurongainAct->setShortcut(tr(
"Ctrl+G"));
203 set_neurongainAct->setStatusTip(tr(
"Add/Remove neurons gain"));
204 connect(set_neurongainAct, SIGNAL(triggered()),
this, SLOT(set_neurongain()));
206 set_neuronbiasAct =
new QAction(QIcon(
":/evorobot/bias.png"), tr(
"&Add/Remove neurons biases"),
this);
207 set_neuronbiasAct->setShortcut(tr(
"Ctrl+B"));
208 set_neuronbiasAct->setStatusTip(tr(
"Add/Remove neurons bias"));
209 connect(set_neuronbiasAct, SIGNAL(triggered()),
this, SLOT(set_neuronbias()));
211 set_lesionAct =
new QAction(QIcon(
":/evorobot/lesion.png"), tr(
"&Lesion/Restore neurons"),
this);
212 set_lesionAct->setShortcut(tr(
"Ctrl+B"));
213 set_lesionAct->setStatusTip(tr(
"Lesion/Restore neurons"));
214 connect(set_lesionAct, SIGNAL(triggered()),
this, SLOT(set_lesion()));
216 display_labelAct =
new QAction(QIcon(
":/evorobot/label.png"), tr(
"&Display/Undisplay neuron labels"),
this);
217 display_labelAct->setShortcut(tr(
"Ctrl+L"));
218 display_labelAct->setStatusTip(tr(
"Display neuron labels"));
219 connect(display_labelAct, SIGNAL(triggered()),
this, SLOT(display_label()));
221 display_weightAct =
new QAction(QIcon(
":/evorobot/weight.png"), tr(
"&Display/Undisplay weights"),
this);
222 display_weightAct->setShortcut(tr(
"Ctrl+W"));
223 display_weightAct->setStatusTip(tr(
"Display the incoming and outcoming weight of a neuron"));
224 connect(display_weightAct, SIGNAL(triggered()),
this, SLOT(display_weight()));
226 display_deltaAct =
new QAction(QIcon(
":/evorobot/ddelta.png"), tr(
"&Display/Undisplay neurons delta"),
this);
227 display_deltaAct->setShortcut(tr(
"Ctrl+Y"));
228 display_deltaAct->setStatusTip(tr(
"Display neurons delta"));
229 connect(display_deltaAct, SIGNAL(triggered()),
this, SLOT(display_delta()));
231 display_biasAct =
new QAction(QIcon(
":/evorobot/dbias.png"), tr(
"&Display/Undisplay biases"),
this);
232 display_biasAct->setShortcut(tr(
"Ctrl+Z"));
233 display_biasAct->setStatusTip(tr(
"Display neurons biases"));
234 connect(display_biasAct, SIGNAL(triggered()),
this, SLOT(display_bias()));
236 display_gainAct =
new QAction(QIcon(
":/evorobot/dgain.png"), tr(
"&Display/Undisplay gains"),
this);
237 display_gainAct->setShortcut(tr(
"Ctrl+G"));
238 display_gainAct->setStatusTip(tr(
"Display neurons gains"));
239 connect(display_gainAct, SIGNAL(triggered()),
this, SLOT(display_gain()));
241 erase_Act =
new QAction(QIcon(
":/evorobot/erase.png"), tr(
"&Erase"),
this);
242 erase_Act->setShortcut(tr(
"Ctrl+E"));
243 erase_Act->setStatusTip(tr(
"Erase all or selected properties"));
244 connect(erase_Act, SIGNAL(triggered()),
this, SLOT(erase()));
246 add_ublockAct =
new QAction(QIcon(
":/evorobot/addublock.png"), tr(
"&Add Update Block"),
this);
247 add_ublockAct->setShortcut(tr(
"Ctrl+A"));
248 add_ublockAct->setStatusTip(tr(
"add an update block"));
249 connect(add_ublockAct, SIGNAL(triggered()),
this, SLOT(add_ublock()));
251 add_cblockAct =
new QAction(QIcon(
":/evorobot/addblock.png"), tr(
"&Add Connection Block"),
this);
252 add_cblockAct->setShortcut(tr(
"Ctrl+A"));
253 add_cblockAct->setStatusTip(tr(
"add a connection block"));
254 connect(add_cblockAct, SIGNAL(triggered()),
this, SLOT(add_cblock()));
256 add_gblockAct =
new QAction(QIcon(
":/evorobot/gainblock.png"), tr(
"&Add a gain block"),
this);
257 add_gblockAct->setShortcut(tr(
"Ctrl+G"));
258 add_gblockAct->setStatusTip(tr(
"add a gain block"));
259 connect(add_gblockAct, SIGNAL(triggered()),
this, SLOT(add_gblock()));
261 increasevAct =
new QShortcut(tr(
"+"),
this);
262 connect(increasevAct, SIGNAL(activated()),
this, SLOT(increasev()));
264 decreasevAct =
new QShortcut(tr(
"-"),
this);
265 connect(decreasevAct, SIGNAL(activated()),
this, SLOT(decreasev()));
272 int NetworkDialog::getcblock()
274 return(cblockAct->currentIndex() - 1);
280 void NetworkDialog::updatetoolb()
287 neurontypeAct->setCurrentIndex(enet->neurontype[cneuron[0]]+1);
294 void NetworkDialog::updateblocktype()
302 blocktypeAct->setCurrentIndex(enet->net_block[cb][5]+1);
309 void NetworkDialog::changeblocktype(
int t)
317 if (t > 0 && cb > 0 ) {
318 oldt = enet->net_block[cb][5];
319 enet->net_block[cb][5] = t - 1;
321 statusb->setText(QString(
"The type of the selected block has been modified"));
327 void NetworkDialog::set_neurondisplay()
341 for (i=cneuron[0]; i <= cneuron[1]; i++)
344 for (i=cneuron[0]; i <= cneuron[1]; i++)
347 if (cneuronn < 1 || cneuronn > 2)
348 warning(
"you should select one neuron or one block of neurons first");
350 statusb->setText(QString(
"Neurons to be monitored have been updated"));
353 rendNetwork->update();
357 void NetworkDialog::set_neurontype(
int t)
363 oldt = enet->neurontype[cneuron[0]];
365 enet->neurontype[cneuron[0]] = t-1;
368 for (
int i=cneuron[0]; i <= cneuron[1]; i++) {
369 enet->neurontype[i] = t-1;
372 if (cneuronn < 1 || cneuronn > 2)
373 warning(
"you should select one neuron or one block of neurons first");
375 if (oldt != enet->neurontype[cneuron[0]])
376 statusb->setText(QString(
"Neurons' type updated"));
379 rendNetwork->update();
386 void NetworkDialog::selblock_changed(
int t)
389 statusb->setText(QString(
"Block selected"));
390 emit selectedblockChanged();
391 rendNetwork->update();
395 void NetworkDialog::set_neurongain()
399 if (cneuronn < 1 || cneuronn > 2)
401 warning(
"you should select one neuron or one block of neurons first");
407 if (enet->neurongain[cneuron[0]] == 1)
409 enet->neurongain[cneuron[0]] = 0;
410 statusb->setText(QString(
"Neuron's gain eliminated"));
414 enet->neurongain[cneuron[0]] = 1;
415 statusb->setText(QString(
"Neuron's gain added"));
420 if (enet->neurongain[cneuron[0]] == 1)
422 for (i=cneuron[0]; i <= cneuron[1]; i++)
423 enet->neurongain[i] = 0;
424 statusb->setText(QString(
"Neurons' gain eliminated"));
428 for (i=cneuron[0]; i <= cneuron[1]; i++)
429 enet->neurongain[i] = 1;
430 statusb->setText(QString(
"Neurons' gain added"));
437 rendNetwork->update();
443 void NetworkDialog::set_neuronbias()
447 if (cneuronn < 1 || cneuronn > 2)
449 warning(
"you should select one neuron or one block of neurons first");
455 if (enet->neuronbias[cneuron[0]] == 1)
457 enet->neuronbias[cneuron[0]] = 0;
458 statusb->setText(QString(
"Neuron's bias eliminated"));
462 enet->neuronbias[cneuron[0]] = 1;
463 statusb->setText(QString(
"Neuron's bias added"));
468 if (enet->neuronbias[cneuron[0]] == 1)
470 for (i=cneuron[0]; i <= cneuron[1]; i++)
471 enet->neuronbias[i] = 0;
472 statusb->setText(QString(
"Neurons' bias eliminated"));
476 for (i=cneuron[0]; i <= cneuron[1]; i++)
477 enet->neuronbias[i] = 1;
478 statusb->setText(QString(
"Neurons' bias added"));
482 rendNetwork->update();
490 void NetworkDialog::set_lesion()
501 statusb->setText(QString(
"Neuron's lesioned"));
502 rendNetwork->update();
507 for(
int ls = cneuron[0]; ls <= cneuron[1]; ls++)
514 statusb->setText(QString(
"Neurons' lesioned"));
515 rendNetwork->update();
519 warning(
"you should select one neuron or one block of neurons first");
525 for (
int i = 0; i < enet->nneurons; i++)
531 statusb->setText(QString(
"Neurons un-lesioned"));
532 rendNetwork->update();
537 void NetworkDialog::display_label()
542 pseudo_activate_net();
543 statusb->setText(QString(
"Neurons labels displayed"));
544 rendNetwork->update();
551 void NetworkDialog::display_delta()
554 if (cneuronn == 1 || cneuronn == 2)
557 pseudo_activate_net();
560 statusb->setText(QString(
"Neurons' timeconstants weight displayed"));
561 rendNetwork->update();
565 warning(
"you should select one neuron or one block of neurons first");
571 void NetworkDialog::display_weight()
577 pseudo_activate_net();
578 statusb->setText(QString(
"Connections weights displayed"));
581 rendNetwork->update();
585 warning(
"you should select the receiving and sending block of neurons first (4 neurons)");
590 void NetworkDialog::display_bias()
593 if (cneuronn == 1 || cneuronn == 2)
596 pseudo_activate_net();
597 statusb->setText(QString(
"Biases weight displayed"));
598 rendNetwork->update();
603 warning(
"you should select one neuron or one block of neurons first");
609 void NetworkDialog::display_gain()
613 if (cneuronn == 1 || cneuronn == 2)
616 pseudo_activate_net();
619 statusb->setText(QString(
"Neurons' gain weight displayed"));
620 rendNetwork->update();
624 warning(
"you should select one neuron or one block of neurons first");
630 void NetworkDialog::erase()
638 cblock = getcblock();
643 enet->net_nblocks = 0;
645 cblockAct->addItems(QStringList() <<
"blocks list");
646 for(i=0;i < enet->nneurons; i++)
648 enet->neuronbias[i] = 0;
649 enet->neurontype[i] = 0;
650 enet->neurongain[i] = 0;
653 statusb->setText(QString(
"All blocks erased and neurons' properties reset"));
658 cblockAct->removeItem(cblock+1);
659 cblockAct->setCurrentIndex(0);
660 for (bb=cblock; bb < (enet->net_nblocks - 1); bb++)
661 for (ii=0; ii < 6; ii++)
662 enet->net_block[bb][ii] = enet->net_block[bb+1][ii];
664 statusb->setText(QString(
"Selected block erased"));
666 rendNetwork->update();
671 void NetworkDialog::add_ublock()
678 if (cneuronn != 1 && cneuronn != 2)
680 warning(
"you should select a a lock (2 neurons) first");
684 cblock = getcblock();
686 cblock = enet->net_nblocks;
690 for(i=enet->net_nblocks; i > cblock; i--)
691 for(ii=0; ii<6; ii++)
692 enet->net_block[i][ii] = enet->net_block[i-1][ii];
693 enet->net_block[cblock][0] = 1;
694 enet->net_block[cblock][1] = cneuron[0];
695 enet->net_block[cblock][2] = 1;
696 enet->net_block[cblock][3] = 0;
697 enet->net_block[cblock][4] = 0;
698 enet->net_block[cblock][5] = 0;
699 block_name(cblock, stblock);
700 cblockAct->insertItems(cblock+1, QStringList() << stblock);
707 for(i=enet->net_nblocks; i > cblock; i--)
708 for(ii=0; ii<6; ii++)
709 enet->net_block[i][ii] = enet->net_block[i-1][ii];
710 enet->net_block[cblock][0] = 1;
711 enet->net_block[cblock][1] = cneuron[0];
712 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
713 enet->net_block[cblock][3] = 0;
714 enet->net_block[cblock][4] = 0;
715 enet->net_block[cblock][5] = 0;
716 block_name(cblock, stblock);
717 cblockAct->insertItems(cblock+1, QStringList() << stblock);
722 cblockAct->setCurrentIndex(0);
723 statusb->setText(QString(
"Update block added"));
724 rendNetwork->update();
729 void NetworkDialog::add_cblock()
739 warning(
"you should select the receiving and sending blocks (4 neurons) first");
743 cblock = getcblock();
744 printf(
"cblock %d\n", cblock);
746 cblock = enet->net_nblocks;
751 for(i=enet->net_nblocks; i > cblock; i--)
752 for(ii=0; ii<6; ii++)
753 enet->net_block[i][ii] = enet->net_block[i-1][ii];
754 enet->net_block[cblock][0] = 0;
755 enet->net_block[cblock][1] = cneuron[0];
756 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
757 enet->net_block[cblock][3] = cneuron[2];
758 enet->net_block[cblock][4] = cneuron[3] - cneuron[2] + 1;
759 enet->net_block[cblock][5] = 0;
760 block_name(cblock, stblock);
761 cblockAct->insertItems(cblock+1, QStringList() << stblock);
766 cblockAct->setCurrentIndex(0);
767 statusb->setText(QString(
"Connection block added"));
768 rendNetwork->update();
772 void NetworkDialog::add_gblock()
779 if (cneuronn != 2 && cneuronn != 3)
781 warning(
"you should select a block (2 neurons) and eventually a third neuron first");
785 cblock = getcblock();
787 cblock = enet->net_nblocks;
793 for(i=enet->net_nblocks; i > cblock; i--)
794 for(ii=0; ii<6; ii++)
795 enet->net_block[i][ii] = enet->net_block[i-1][ii];
796 enet->net_block[cblock][0] = 2;
797 enet->net_block[cblock][1] = cneuron[0];
798 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
799 enet->net_block[cblock][3] = 0;
800 enet->net_block[cblock][4] = 0;
801 enet->net_block[cblock][5] = 0;
802 block_name(cblock, stblock);
803 cblockAct->insertItems(cblock+1, QStringList() << stblock);
810 for(i=enet->net_nblocks; i > cblock; i--)
811 for(ii=0; ii<6; ii++)
812 enet->net_block[i][ii] = enet->net_block[i-1][ii];
813 enet->net_block[cblock][0] = 3;
814 enet->net_block[cblock][1] = cneuron[0];
815 enet->net_block[cblock][2] = cneuron[1] - cneuron[0] + 1;
816 enet->net_block[cblock][3] = cneuron[2];
817 enet->net_block[cblock][4] = 0;
818 enet->net_block[cblock][5] = 0;
819 block_name(cblock, stblock);
820 cblockAct->insertItems(cblock+1, QStringList() << stblock);
825 cblockAct->setCurrentIndex(0);
826 statusb->setText(QString(
"Gain block added"));
827 rendNetwork->update();
834 void NetworkDialog::open()
842 QString fileName = QFileDialog::getOpenFileName(
this,
843 "Choose a filename to open",
848 if (fileName.endsWith(
"net"))
850 filen = fileName.toLatin1();
854 statusb->setText(QString(
"File %1 loaded").arg(filename));
857 if (fileName.endsWith(
"phe"))
859 filen = fileName.toLatin1();
863 statusb->setText(QString(
"File %1 loaded").arg(filename));
871 void NetworkDialog::save()
879 QString fileName = QFileDialog::getSaveFileName(
this,
880 "Choose a filename to save",
885 if (fileName.endsWith(
"net"))
887 filen = fileName.toLatin1();
891 statusb->setText(QString(
"File %1 saved").arg(filename));
895 if (fileName.endsWith(
"phe"))
897 filen = fileName.toLatin1();
901 statusb->setText(QString(
"File %1 saved").arg(filename));
907 void NetworkDialog::increasev()
917 pseudo_activate_net();
922 *v += ((enet->wrange * 2.0f) / 256.0f);
923 pseudo_activate_net();
924 rendNetwork->update();
931 if (pseudomode != 1 && pseudomode != 4)
933 pseudo_activate_net();
938 *v += ((enet->wrange * 2.0f) / 256.0f);
939 pseudo_activate_net();
940 rendNetwork->update();
947 void NetworkDialog::decreasev()
958 pseudo_activate_net();
963 *v -= ((enet->wrange * 2.0f) / 256.0f);
964 pseudo_activate_net();
965 rendNetwork->update();
972 if (pseudomode != 1 && pseudomode != 4)
974 pseudo_activate_net();
979 *v -= ((enet->wrange * 2.0f) / 256.0f);
980 pseudo_activate_net();
981 rendNetwork->update();
988 void NetworkDialog::block_name(
int b,
char *st)
990 switch(enet->net_block[b][0])
993 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]);
996 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]);
999 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]);
1002 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]]);
1005 sprintf(st,
"undefined block type");
1017 NetworkDialog::pseudo_activate_net()
1053 for(i=0;i < enet->nneurons;i++)
1054 strcpy(neuroncl[i],enet->
neuronl[i]);
1060 for(i=0;i < enet->nneurons;i++)
1062 if (enet->neurongain[i] == 1)
1064 if (dgain > 0 && ((cneuronn == 1 && i == cneuron[0]) || (cneuronn == 2 && i >= cneuron[0] && i <= cneuron[1])))
1066 gain = (fabs((
double) *p) / enet->wrange) * enet->grange;
1067 sprintf(neuroncl[i],
"%.1f",gain);
1077 for(i=0;i < enet->nneurons;i++)
1079 if (enet->neuronbias[i] == 1)
1081 if (dbias > 0 && ((cneuronn == 1 && i == cneuron[0]) || (cneuronn == 2 && i >= cneuron[0] && i <= cneuron[1])))
1083 bias = (fabs((
double) *p) / enet->wrange) * enet->brange;
1084 sprintf(neuroncl[i],
"%.1f",bias);
1094 for (b=0; b < enet->net_nblocks; b++)
1097 if (enet->net_block[b][0] == 0)
1099 for(t=enet->net_block[b][1]; t < enet->net_block[b][1] + enet->net_block[b][2];t++)
1100 for(i=enet->net_block[b][3]; i < enet->net_block[b][3] + enet->net_block[b][4];i++)
1103 if (dweight == 1 && cneuronn == 4 && (t >= cneuron[0] && t <= cneuron[1]) && (i >= cneuron[2] && i <= cneuron[3]))
1106 if (cneuron[0] == cneuron[1])
1107 sprintf(neuroncl[i],
"%.1f",*p);
1116 if (enet->net_block[b][0] == 1)
1118 for(t=enet->net_block[b][1]; t < (enet->net_block[b][1] + enet->net_block[b][2]); t++)
1121 if (enet->neurontype[t] != 1)
1128 delta = (float) (fabs((
double) *p) / enet->wrange);
1129 if (ddelta > 0 && ((cneuronn == 1 && t == cneuron[0]) || (cneuronn == 2 && t >= cneuron[0] && t <= cneuron[1])))
1131 sprintf(neuroncl[t],
"%.1f",delta);
1148 void NetworkDialog::openMixer()
1152 mixerDialog->setUpMixer();
1153 mixerDialog->show();
1154 rendNetwork->update();
1164 RendNetwork::RendNetwork( NetworkDialog* networkDialog, QWidget *parent)
1168 antialiased =
false;
1169 pixmap.load(
":/evorobot/qt-logo.png");
1171 setBackgroundRole(QPalette::Base);
1172 this->networkDialog = networkDialog;
1178 QSize RendNetwork::minimumSizeHint()
const
1180 return QSize(250, 250);
1183 QSize RendNetwork::sizeHint()
const
1185 return QSize(550, 500);
1188 void RendNetwork::setShape(Shape shape)
1190 this->shape = shape;
1194 void RendNetwork::setPen(
const QPen &pen)
1202 void RendNetwork::setBrush(
const QBrush &brush)
1204 this->brush = brush;
1208 void RendNetwork::setAntialiased(
bool antialiased)
1210 this->antialiased = antialiased;
1214 void RendNetwork::setTransformed(
bool transformed)
1216 this->transformed = transformed;
1221 void RendNetwork::paintEvent(QPaintEvent *)
1232 int selectedneurons[2];
1233 QPainter painter(
this);
1235 QRect labelxy(0,0,30,20);
1237 painter.setPen(pen);
1238 QPen pen(Qt::black, 1);
1239 painter.setPen(pen);
1240 selectedneurons[0] = selectedneurons[1] = -1;
1242 if (networkDialog->enet->drawnxmax > 0 && networkDialog->enet->drawnymax > 0)
1244 networkDialog->cscaley = height() / (float) networkDialog->enet->drawnymax;
1245 networkDialog->cscalex = width() / (float) networkDialog->enet->drawnxmax;
1246 painter.scale(networkDialog->cscalex, networkDialog->cscaley);
1250 painter.scale(1.0,1.0);
1252 painter.setPen(Qt::gray);
1254 p = networkDialog->enet->freep;
1255 for(i=0;i < networkDialog->enet->nneurons;i++)
1257 if (networkDialog->enet->neurongain[i] == 1)
1260 for(i=0;i < networkDialog->enet->nneurons;i++)
1262 if (networkDialog->enet->neuronbias[i] == 1)
1264 networkDialog->biases[i] = *p;
1269 for (i=0; i < networkDialog->enet->net_nblocks; i++)
1271 if (networkDialog->enet->net_block[i][0] == 0)
1272 for (t=networkDialog->enet->net_block[i][1]; t < (networkDialog->enet->net_block[i][1] + networkDialog->enet->net_block[i][2]); t++)
1273 for (b=networkDialog->enet->net_block[i][3]; b < (networkDialog->enet->net_block[i][3] + networkDialog->enet->net_block[i][4]); b++)
1276 if (networkDialog->getcblock() == i)
1281 if (w != networkDialog->enet->DEFAULT_VALUE)
1283 if (w > networkDialog->enet->wrange)
1284 w = networkDialog->enet->wrange;
1285 if (w < (0.0 - networkDialog->enet->wrange))
1286 w = 0.0 - networkDialog->enet->wrange;
1290 cg -= ((w / networkDialog->enet->wrange) * 255);
1291 cb -= ((w / networkDialog->enet->wrange) * 255);
1295 cg += ((w / networkDialog->enet->wrange) * 255);
1296 cr += ((w / networkDialog->enet->wrange) * 255);
1306 painter.setPen(QPen(QColor(cr,cg,cb,255), wid, Qt::SolidLine));
1308 if (abs(networkDialog->enet->neuronxy[b][1] - networkDialog->enet->neuronxy[t][1]) > 20)
1309 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]);
1312 dx = abs(networkDialog->enet->neuronxy[t][0] - networkDialog->enet->neuronxy[b][0]);
1313 dy = abs(networkDialog->enet->neuronxy[t][1] - networkDialog->enet->neuronxy[b][1]);
1314 if (networkDialog->enet->neuronxy[t][0] < networkDialog->enet->neuronxy[b][0])
1315 sx = networkDialog->enet->neuronxy[t][0];
1317 sx = networkDialog->enet->neuronxy[b][0];
1318 if (networkDialog->enet->neuronxy[t][1] < networkDialog->enet->neuronxy[b][1])
1319 sy = networkDialog->enet->neuronxy[t][1];
1321 sy = networkDialog->enet->neuronxy[b][1];
1322 painter.drawArc((
float) sx,(
float) (sy-20),(
float) dx, (
float) (dy+40), 0 * 16, 180 * 16);
1326 if (networkDialog->enet->net_block[i][0] == 1)
1328 if (networkDialog->getcblock() == i)
1330 selectedneurons[0] = networkDialog->enet->net_block[i][1];
1331 selectedneurons[1] = networkDialog->enet->net_block[i][2];
1333 for(t=networkDialog->enet->net_block[i][1]; t < (networkDialog->enet->net_block[i][1] + networkDialog->enet->net_block[i][2]); t++)
1334 if (networkDialog->enet->neurontype[t] == 1)
1339 for (i=0; i < networkDialog->enet->nneurons; i++)
1341 if (networkDialog->enet->neuronbias[i] == 1)
1343 w = networkDialog->biases[i];
1344 if (w != networkDialog->enet->DEFAULT_VALUE)
1346 if (w > networkDialog->enet->wrange)
1347 w = networkDialog->enet->wrange;
1348 if (w < (0.0 - networkDialog->enet->wrange))
1349 w = 0.0 - networkDialog->enet->wrange;
1353 cg -= ((w / networkDialog->enet->wrange) * 255);
1354 cb -= ((w / networkDialog->enet->wrange) * 255);
1358 cg += ((w / networkDialog->enet->wrange) * 255);
1359 cr += ((w / networkDialog->enet->wrange) * 255);
1369 if (i >= selectedneurons[0] && i < selectedneurons[0]+selectedneurons[1])
1371 painter.setPen(QPen(QColor(cr,cg,cb,255), wid, Qt::SolidLine));
1376 if (i >= selectedneurons[0] && i < selectedneurons[0]+selectedneurons[1])
1378 painter.setPen(QPen(Qt::black, wid, Qt::SolidLine));
1381 if (networkDialog->enet->neurontype[i] == 0)
1382 painter.setBrush(QBrush(QColor(75, 75, 75, 255), Qt::SolidPattern));
1384 if (networkDialog->enet->neurontype[i] == 1)
1385 painter.setBrush(QBrush(QColor(255, 0, 0, 255), Qt::SolidPattern));
1387 if (networkDialog->enet->neurontype[i] == 2)
1388 painter.setBrush(QBrush(QColor(0, 0, 255, 255), Qt::SolidPattern));
1390 painter.setBrush(QBrush(QColor(150, 150, 150, 255), Qt::SolidPattern));
1392 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 5), 10.0, 10.0);
1395 if (networkDialog->enet->neurongain[i] == 1)
1397 painter.setPen(QPen(QColor(255,255,255,255), wid, Qt::SolidLine));
1398 painter.setBrush(QBrush(QColor(255, 255, 255, 255), Qt::SolidPattern));
1399 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 1), (
float) (networkDialog->enet->neuronxy[i][1] - 1), 2.0, 2.0);
1404 painter.setPen(Qt::black);
1405 for (i=0; i < networkDialog->enet->nneurons; i++)
1407 if (networkDialog->enet->neurondisplay[i] == 1)
1408 painter.setPen(Qt::black);
1410 painter.setPen(Qt::red);
1411 if (i < networkDialog->ninputs)
1412 labelxy.setRect((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] + 5), 30, 30);
1414 labelxy.setRect((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 18), 30, 30);
1415 painter.drawText(labelxy, networkDialog->neuroncl[i]);
1417 painter.setPen(Qt::darkRed);
1418 if (networkDialog->enet->neuronlesion[i]) painter.drawText(networkDialog->enet->neuronxy[i][0]-5,networkDialog->enet->neuronxy[i][1]-5,
"X");
1421 painter.setBrush(Qt::black);
1422 if (networkDialog->cneuronn == 1)
1423 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][1] - 5), 10.0, 10.0);
1424 if (networkDialog->cneuronn >= 2)
1426 if (networkDialog->cneuron[0] <= networkDialog->cneuron[1])
1428 for (i=networkDialog->cneuron[0]; i <= networkDialog->cneuron[1]; i++)
1429 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 5), 10.0, 10.0);
1433 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[0]][1] - 5), 10.0, 10.0);
1434 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[1]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[1]][1] - 5), 10.0, 10.0);
1437 painter.setBrush(Qt::blue);
1438 if (networkDialog->cneuronn == 3)
1439 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[2]][0] - 5), (
float) (networkDialog->enet->neuronxy[networkDialog->cneuron[2]][1] - 5), 10.0, 10.0);
1440 if (networkDialog->cneuronn == 4 && networkDialog->cneuron[2] <= networkDialog->cneuron[3])
1441 for (i=networkDialog->cneuron[2]; i <= networkDialog->cneuron[3]; i++)
1442 painter.drawEllipse((
float) (networkDialog->enet->neuronxy[i][0] - 5), (
float) (networkDialog->enet->neuronxy[i][1] - 5), 10.0, 10.0);
1453 RendNetwork::mousePressEvent(QMouseEvent *event)
1481 for(i=0; i < networkDialog->enet->nneurons; i++)
1483 if (mdist((
float) x,(
float) y, (
float) networkDialog->enet->neuronxy[i][0] * networkDialog->cscalex, (
float) networkDialog->enet->neuronxy[i][1] * networkDialog->cscaley) < 10.0)
1485 if (networkDialog->cneuronn >= 4)
1486 networkDialog->cneuronn = 0;
1487 networkDialog->cneuron[networkDialog->cneuronn] = i;
1488 networkDialog->cneuronn++;
1490 networkDialog->statusb->setText(QString(
"%1 neurons selected").arg(networkDialog->cneuronn));
1491 emit selectedneuronsChanged();
1498 for (i=0; i < networkDialog->enet->net_nblocks; i++)
1500 if (networkDialog->enet->net_block[i][0] == 0)
1501 for (t=networkDialog->enet->net_block[i][1]; t < (networkDialog->enet->net_block[i][1] + networkDialog->enet->net_block[i][2]); t++)
1502 for (b=networkDialog->enet->net_block[i][3]; b < (networkDialog->enet->net_block[i][3] + networkDialog->enet->net_block[i][4]); b++)
1504 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);
1506 if (cdist < 1 && cdist < dist)
1509 networkDialog->cneuron[0] = t;
1510 networkDialog->cneuron[1] = t;
1511 networkDialog->cneuron[2] = b;
1512 networkDialog->cneuron[3] = b;
1513 networkDialog->cneuronn = 4;
1514 networkDialog->statusb->setText(QString(
"A single connection have been selected"));
1525 networkDialog->cneuronn = 0;
1526 networkDialog->pseudomode = 0;
1527 networkDialog->pseudo_activate_net();
1528 networkDialog->statusb->setText(QString(
"0 selected neurons"));
1529 emit selectedneuronsChanged();
1544 RendNetwork::mouseMoveEvent(QMouseEvent *event)
1560 networkDialog->cneuronn = 0;
1563 for(i=0, cn=-1; i < networkDialog->enet->nneurons; i++)
1564 if (mdist((
float) rnmousex,(
float) rnmousey, (
float) networkDialog->enet->neuronxy[i][0] * networkDialog->cscalex, (
float) networkDialog->enet->neuronxy[i][1] * networkDialog->cscaley) < 10.0)
1568 networkDialog->enet->neuronxy[cn][0] = (float) x / networkDialog->cscalex;
1569 networkDialog->enet->neuronxy[cn][1] = (
float) y / networkDialog->cscaley;
1574 networkDialog->statusb->setText(QString(
"neuron position modified"));
1588 RendNetwork::mouseReleaseEvent(QMouseEvent *event)
1599 if (networkDialog->grid > 0)
1602 rnmousex=
event->x();
1603 rnmousey=
event->y();
1609 for(i=0, cn=-1; i < networkDialog->enet->nneurons; i++)
1610 if (mdist((
float) rnmousex,(
float) rnmousey, networkDialog->enet->neuronxy[i][0], networkDialog->enet->neuronxy[i][1]) < 10.0)
1614 oldp1 = networkDialog->enet->neuronxy[cn][0];
1615 oldp2 = networkDialog->enet->neuronxy[cn][1];
1616 networkDialog->enet->neuronxy[cn][0] = (float) (((
int) networkDialog->enet->neuronxy[cn][0]) / networkDialog->grid * networkDialog->grid);
1617 networkDialog->enet->neuronxy[cn][1] = (float) (((
int) networkDialog->enet->neuronxy[cn][1]) / networkDialog->grid * networkDialog->grid);
1618 if ((oldp1 - networkDialog->enet->neuronxy[cn][0]) > (networkDialog->grid / 2))
1619 networkDialog->enet->neuronxy[cn][0] += networkDialog->grid;
1620 if ((oldp2 - networkDialog->enet->neuronxy[cn][1]) > (networkDialog->grid / 2))
1621 networkDialog->enet->neuronxy[cn][1] += networkDialog->grid;
1623 networkDialog->statusb->setText(QString(
"neuron's position modified"));
1633 *o = (float) (((
int) *o) / networkDialog->grid * networkDialog->grid);
1634 *(o + 1) = (
float) (((int) *(o + 1)) / networkDialog->grid * networkDialog->grid);
1635 if ((oldp1 - *o) > (networkDialog->grid / 2))
1636 *o += networkDialog->grid;
1637 if ((oldp2 - *(o + 1)) > (networkDialog->grid / 2))
1638 *(o + 1) += networkDialog->grid;
1639 networkDialog->statusb->setText(QString(
"neuron's position modified"));
1654 RendNetwork::mouseDoubleClickEvent(QMouseEvent* )
1662 RendNetwork::mdist(
float x,
float y,
float x1,
float y1)
1667 qdist = ((x-x1)*(x-x1)) + ((y-y1)*(y-y1));
1668 return(sqrt(qdist));
1678 RendNetwork::segmentdist(
float px,
float py,
float ax,
float ay,
float bx,
float by)
1682 dab = sqrt(((ax-bx)*(ax-bx)) + ((ay-by)*(ay-by)));
1683 dpa = sqrt(((px-ax)*(px-ax)) + ((py-ay)*(py-ay)));
1684 dpb = sqrt(((px-bx)*(px-bx)) + ((py-by)*(py-by)));
1686 if (dpa < dab && dpb < dab)
1687 return((dpa+dpb)-dab);
1693 EvoSlider::EvoSlider(
float *ref,
float rangemin ,
float rangemax, QWidget * parent)
1694 : QDoubleSpinBox(parent) {
1696 setRange(rangemin, rangemax);
1697 setSingleStep(0.05);
1699 connect(
this,SIGNAL(valueChanged(
double)),
this, SLOT(updateValue(
double)));
1702 void EvoSlider::updateValue(
double ival)
1705 emit networkChanged();
1709 MixerDialog::MixerDialog(Evonet *enet, NetworkDialog* netd)
1714 layout=
new QGridLayout(
this);
1717 void MixerDialog::setUpMixer()
1722 foreach(QObject* child, children()) {
1723 delete dynamic_cast<QWidget*
>(child);
1728 statusmixer =
new QLabel(
"",
this);
1729 if (netdl->pseudomode == 2)
1730 statusmixer->setText(QString(
"weights:"));
1731 if (netdl->pseudomode == 1)
1732 statusmixer->setText(QString(
"t-const:"));
1733 if (netdl->pseudomode == 3)
1734 statusmixer->setText(QString(
"biases:"));
1735 if (netdl->pseudomode == 4)
1736 statusmixer->setText(QString(
"gains:"));
1738 statusmixer->setText(QString(
"neurons:"));
1739 layout->addWidget(statusmixer,0,0);
1754 if (netdl->pseudomode == 2)
1757 lt = netdl->cneuron[0];
1758 li = netdl->cneuron[2];
1760 for(
int i=0;i<evonet->
nselected;i++,v++,li++)
1762 if (li > netdl->cneuron[3])
1765 li = netdl->cneuron[2];
1768 layout->addWidget(
new QLabel(evonet->
neuronl[lt],
this),1,i);
1769 EvoSlider* slide =
new EvoSlider(v,(0 - evonet->
getWrange()),evonet->
getWrange(),
this);
1770 connect( slide, SIGNAL(networkChanged()), netdl->rendNetwork, SLOT(update()) );
1771 layout->addWidget(slide,2,i);
1772 layout->addWidget(
new QLabel(evonet->
neuronl[li],
this),3,i);
1778 l = netdl->cneuron[0];
1779 for(
int i=0;i<evonet->
nselected;i++,v++,l++)
1781 layout->addWidget(
new QLabel(evonet->
neuronl[l],
this),1,i);
1782 EvoSlider* slide =
new EvoSlider(v,(0 - evonet->
getWrange()),evonet->
getWrange(),
this);
1783 connect( slide, SIGNAL(networkChanged()), netdl->rendNetwork, SLOT(update()) );
1784 layout->addWidget(slide,2,i);
1794 layout->addWidget(
new QLabel(evonet->
neuronl[i],
this),1,i);
1796 connect( slide, SIGNAL(networkChanged()), netdl->rendNetwork, SLOT(update()) );
1797 layout->addWidget(slide,2,i);
1806 #if defined(_MSC_VER)
1807 #pragma warning(pop)