28.12.06

Programátorské strasti

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!

1 komentář:

m1c4a1 řekl(a)...

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í... :-/