Před chvílí odešel kámoš Tonda, s kterým jsem od jedné odpoledne psal projekt do inteligentních systémů. Projekt jsme ještě neudělali, byť je z 80% celý. Jde o aplikaci ve SmallDEVSu, což je implementace DEVSu v programovacím jazyce Smalltalk. V podstatě to vypadá skoro stejně jako známější Squeak, jen to má navíc třídy a GUI pro práci s DEVSem.
Úkolem je udělat jednoduchou neuronovou síť, která se učí na základě vkládaných vstupů určitou operaci (třeba xor je taková typická, my chceme dělat operaci "větší než"). Tonda ji naimplementoval v C++, já jsem se vrhl do přepsání toho programu ve Smalltalku. Šlo do od ruky, Smalltalk mě chytil, pak jsme dopsali, začalo se ladit a problém... naoko bylo vše správně, ale někde byla chyba - neuronová síť nevracela správné výsledky. Dali jsme se do debugování, kontrolujeme každičký řádek, každý znak, počítáme závorky, debugovací pomocné výpisy snad na každém řádku... no prostě aspoň 8 hodin jsme hledali chybu. A pak jsme ji "našli":
...
Transcript show: (ii at: 1);cr. "tady se vypíše správná hodnota"
(x = 7) ifTrue: [
Transcript show: (ii at: 1);cr. "tady se vypíše špatná (jiná) hodnota"
...
Operátor = ani operaci ifTrue: jsme nijak nemodifikovali. Tak jak se sakra mohl řetězec ii změnit??? Jak by se v čistě objektově orientovaném jazyce, jako je Smalltalk, objevit chyba, která se často záhadně objevuje třeba v C, když sáhnu blbě do paměti? Nikde tam se samotnou pamětí přece nepracuju.
S tím už jsme to po jedné hodině ráno vzdali, napsali email garantovi, že jsme objevili takovou chybu a jde se spát... Pokud se nenajde řešení, tak mu to odevzdáme takhle s tím, že je chyba ve Squeaku a hotovo. Sáákra, to je zas pech!
Úkolem je udělat jednoduchou neuronovou síť, která se učí na základě vkládaných vstupů určitou operaci (třeba xor je taková typická, my chceme dělat operaci "větší než"). Tonda ji naimplementoval v C++, já jsem se vrhl do přepsání toho programu ve Smalltalku. Šlo do od ruky, Smalltalk mě chytil, pak jsme dopsali, začalo se ladit a problém... naoko bylo vše správně, ale někde byla chyba - neuronová síť nevracela správné výsledky. Dali jsme se do debugování, kontrolujeme každičký řádek, každý znak, počítáme závorky, debugovací pomocné výpisy snad na každém řádku... no prostě aspoň 8 hodin jsme hledali chybu. A pak jsme ji "našli":
...
Transcript show: (ii at: 1);cr. "tady se vypíše správná hodnota"
(x = 7) ifTrue: [
Transcript show: (ii at: 1);cr. "tady se vypíše špatná (jiná) hodnota"
...
Operátor = ani operaci ifTrue: jsme nijak nemodifikovali. Tak jak se sakra mohl řetězec ii změnit??? Jak by se v čistě objektově orientovaném jazyce, jako je Smalltalk, objevit chyba, která se často záhadně objevuje třeba v C, když sáhnu blbě do paměti? Nikde tam se samotnou pamětí přece nepracuju.
S tím už jsme to po jedné hodině ráno vzdali, napsali email garantovi, že jsme objevili takovou chybu a jde se spát... Pokud se nenajde řešení, tak mu to odevzdáme takhle s tím, že je chyba ve Squeaku a hotovo. Sáákra, to je zas pech!
1 komentář:
Tak jsem se dozvěděl, že to asi bude tím, že pole ii máme alokovaný napevno, tzn.:
ii := #(0 0 0 0 0).
Změnil jsem to na:
ii := Array new: 5.
(1 to: 5) do: [:x| ii at: x put: 0].
a pořád to jede blbě, další debugování... :-/
Okomentovat