Rekurencja w LabVIEW

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Pierre
Posty: 13
Rejestracja: 27 cze 2007 00:00

Rekurencja w LabVIEW

Post autor: Pierre »

Witam,

Próbuję stworzyć VI, który będzie rekurencyjnie dodawał kolejną tablicę do istniejącej (budowa struktury sieci neuronowej). Problem jest taki, że LabVIEW nie pozwala na zagnieżdżenie VI'a w tym samym VI'u. Udało mi się to osiągnąć poprzez referencję i pierwsze uruchomienie działa. Jednak próba uruchomienia pierwszego powtórzenia generuje błąd.
W jaki sposób można to zrobić?

Pozdrawiam
Pierre
bogdani
Administrator
Posty: 1315
Rejestracja: 30 lip 2003 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Ruda Śląska
Kontakt:

Rekurencja w LabVIEW

Post autor: bogdani »

Witaj
W VI Properties w sekcji Execution powinieneś zaznaczyć Reentrant execution, co spowoduje, że ponowne odwołanie się do tego VIja tworzy jego kopię i uruchomienie jej.
Pozwala to na równoległe uruchamianie tych samych VIjów.
bogdani
Ktoś ci pomógł na forum? Podziękuj dając pochwałę.

Obrazek Obrazek Obrazek
Pierre
Posty: 13
Rejestracja: 27 cze 2007 00:00

Re: Rekurencja w LabVIEW

Post autor: Pierre »

To wiem i tak jest zrobione.
Opiszę dokładniej na czym polega problem:
Powyższego VI'a wywołuję jako subVI z innego VI'a i uruchamia sie bez problemu. Jeśli nie będę chciał wywoływać go dalej (rekurencyjnie) to program będzie działał. Zostanie dodana jedna warstwa i sterowanie powróci do VI'a głównego. Natomiast jeśli zdecyduje się dodać jeszcze jedną warstwę to otrzymuję komunikat zamieszczony poniżej, gdzie Tworzenie.vi to ten główny a cała aplikacja się zatrzymuje.
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Rekurencja w LabVIEW

Post autor: vugie »

Tutaj jest dokładniej napisane jak zrobić rekurencyjny VI, a tutaj jest przykład.
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rekurencja w LabVIEW

Post autor: jogurt_owocowy »

No toś mnie vugie uprzedził - akurat napisałeś jak zacząłem robić przykład ] Ale skoro już zrobiłem to go umieszczę.
Mamy kod silni w C:

Kod: Zaznacz cały

int factorial(int liczba) {
 int sil;
 if (liczba<0) return 0; /* wywołanie jest bezsensowne, zwracamy 0 jako kod błędu */
 if (liczba==0 || liczba==1) return 1;
 sil = liczba*silnia(liczba-1);
 return sil; }
A tak wygląda jego odpowiednik w LV:
[img]http://www.labview.pl/uploads/veir/recu ... torial.gif[/img]
przy czym w opcjach viaja musi być zaznaczona opcja Reentrant Execution!
Prosta sprawa, ale rodzi się pytanie: skoro się da, to dlaczego nie można zrobić tego po prostu wrzucając bloczek na diagram? Najwyraźniej z jakichś powodów nie chciano otwierać drogi do rekurencji w LV i wypadałoby uszanować tę wolę albo cierpieć wolne, pamięciożerne programy.
Poza tym warto pamiętać, że (jeśli mnie pamięć nie myli) każdy algorytm rekurencyjny da się zapisać w postaci iteracyjnej.
Pozdrawiam ]
Ostatnio zmieniony 07 sty 2008 22:19 przez jogurt_owocowy, łącznie zmieniany 1 raz.
PMaj
Posty: 231
Rejestracja: 04 sty 2004 00:00

Re: Rekurencja w LabVIEW

Post autor: PMaj »

witam
jogurt_owocowy pisze:Poza tym warto pamiętać, że (jeśli mnie pamięć nie myli) każdy algorytm rekurencyjny da się zapisać w postaci iteracyjnej
nie każdy się da i bardzo często rekurencji brakuje

pozdrawiam

pmaj
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Pierre
Posty: 13
Rejestracja: 27 cze 2007 00:00

Rekurencja w LabVIEW

Post autor: Pierre »

Dzięki vugie. Po zastosowaniu poleceń jest lepiej ale niestety nie jest dobrze. Komunikat nie wyskakuje, program się nie zatrzymuje ale nie otwiera się kolejny Front panel, na czym mi zależy. W opcjach subVI jest możliwość zaznaczenia opcji 'Show front panel when called' ale niestety przy referencji tego nie ma :/
Czy na to też jest jakiś trik?
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rekurencja w LabVIEW

Post autor: jogurt_owocowy »

nie każdy się da i bardzo często rekurencji brakuje
No... nie brakuje, bo jest (jak widać) i kto chce, może korzystać.
A co do tego czy się da czy nie, to kiedyś obiło mi się o uszy na jakimś wykładzie, że każdy algorytm rekurencyjny ma swój iteracyjny odpowiednik. M.in. TUTAJ też tak piszą.
Ostatnio zmieniony 07 sty 2008 23:08 przez jogurt_owocowy, łącznie zmieniany 1 raz.
PMaj
Posty: 231
Rejestracja: 04 sty 2004 00:00

Re: Rekurencja w LabVIEW

Post autor: PMaj »

ok, rzeczywiście rekurencji nie brakuje, bo jest.

co do tego ze każdy algorytm się da zapisać: z tego co wiem, to nie da się udowodnić, ze nie każdy algorytm nie może być zapisany iteracyjnie, a nawet da się udowodnić, ze każdy algorytm da się zapisać iteracyjnie. ALE np. problemu przestawiania różnej wielkości klocków z patyka pierwszego na trzeci przy pomocy drugiego (wieże Hanoi) nie udało się zapisać iteracyjnie jeszcze nikomu, natomiast rekurencyjnie to tylko 5 linijek.

pzdrv
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

Re: Rekurencja w LabVIEW

Post autor: jogurt_owocowy »

Jeśli masz rację z tymi wieżami Hanoi to możesz dorzucić swoje trzy grosze do Wikipedii. Jest tam jakieś rozwiązanie iteracyjne na trzy linijki - nie wiem jak z jego poprawnością, a nie mam niestety czasu na sprawdzanie.

Pozdrawiam :]
PMaj
Posty: 231
Rejestracja: 04 sty 2004 00:00

Re: Rekurencja w LabVIEW

Post autor: PMaj »

Witam

Również nie będę się wgryzał czy jest ono poprawne. To, że ten problem nie jest rozwiązany iteracyjnie usłyszałem od mądrzejszej ode mnie osoby (informatyka) i wziąłem za pewnik, co - jak widzę - może nie być prawdą. Jeżeli jest poprawne tym lepiej, nie mniej jednak jakiś czas temu (2 - 3 lata temu) nie znalazłem fragmentu kodu rozwiązującego go iteracyjnie, stąd nauczyłem się rekurencji :) będąc w przekonaniu, że nie każdy kawałek kodu da się iteracyjnie zapisać - mój błąd

pozdrawiam
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Pierre
Posty: 13
Rejestracja: 27 cze 2007 00:00

Re: Rekurencja w LabVIEW

Post autor: Pierre »

Ciekawie rozwinęła się ta dyskusja :)
Nie jestem informatykiem z wykształcenia i nie wiem czy każdy algorytm da się zapisać na oba sposoby. Niemniej chciałem sprawdzić czy LabVIEW obsługuje rekurencyjne wywołania.

Jak na ten czas odpowiedź brzmi: TAK, pod warunkiem że nie będziemy chcieli wyświetlać kolejnego front panelu przy każdym wywołaniu.

Możliwe że ja tego zrobić nie umiem ale jeśli faktycznie istnieje takie ograniczenie to LV ma ode mnie duży minus.

Dzięki za wszystkie wskazówki, a swój program rozwiążę iteracyjnie :)
Awatar użytkownika
bartus
Posty: 141
Rejestracja: 07 maja 2007 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Wrocław/Żory

Rekurencja w LabVIEW

Post autor: bartus »

ale nie uwazasz ze to byloby bez sensu troche? bo jakbys mial rekurencyjnie policzyc np 500 ! to wtedy mialbys 500 paneli otwartych.
Przynajmniej ja tak to widze, zreszta otwarcie front panela nie potrzebnie zuzywa zasoby procesora ;)
Jest pare rzeczy dla których warto zyc - TO,UE i nie zmienia sie nic :)
Pierre
Posty: 13
Rejestracja: 27 cze 2007 00:00

Rekurencja w LabVIEW

Post autor: Pierre »

@bartus
Przy liczeniu 500! jest to bez sensu, ale jeśli kolejne powtórzenie wymaga zmiany jakiegoś parametru to już zaczyna pojawiać się sens takiego rozwiązania. Nie będę sie upierał, że jest to rozwiązanie najlepsze. Faktem natomiast jest to, że programista powinien ocenić co łatwiej mu zrobić, a oprogramowanie powinno umożliwić mu utworzenie choćby najbardziej wymyślnego rozwiązania.
Ja po prostu byłem ciekaw czy coś takiego się uda, bo w moim przypadku z założenia nie miałoby się to powtarzać więcej razy jak 3 - 4. W tym momencie obojętnie czy będę w pętli otwierał te okienka jedno po drugim czy żeby się otwierały jedno na drugim i razem zamknęły (na co liczyłem).
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: Rekurencja w LabVIEW

Post autor: vugie »

Dodam tylko, że LV 8.5 obsługuje rekurencję, ale tylko dla wywołań wewnątrz klasy.

Widziałem też na LAVA zrobiony XNode, który automatycznie tworzy dynamiczne wywołanie rekurencyjne w dowolnym VI. Ale rekurencja w tej formie jest bardzo nieefektywna.
ODPOWIEDZ