Matematyka i C#

Wiele razy już w przeciągu ostatnich 2-3 lat szukałem jakiejś porządnej biblioteki implementującej podstawowe algorytmy z algebry liniowej i ogólnie z matematyki. Wbrew pozorom znalezienie tychże dla platformy .NET nie jest takie trywialne..

Po odpytaniu google o jakikolwiek silnik matematyczny natrafiamy na cenioną open sourcową bibliotekę GSL. Z mojego punktu widzenia ma ona jedną wadę: jest mocno nastawianona na środowisko Linuksowe. O ile istnieją wersje przeportowane na system Win32 (nie mówię tutaj o Cygwinie) to nie były już aktualizowane kilka lat. A o automagicznym podpięciu się z poziomu C# można praktyczznie pomarzyć..

Następna kolekcja matematyczna jak wpadła mi w ręce to dnAnalytics. Muszę przyznać, że jest ona bardzo dobrze przygotowana zapewniając bardzo wygodny i intyuicyjny intefejs programistyczny. Z podstawowych możliwości udostępnianych mogę wymienić własną implementację struktury do obsługi macierzy i wektorów, możliwość wczytywania i zapisywania danych z/do plików CSV, chyba wszystkie najważniejsze operacje na macierzach oraz szereg algorytmów do rozwiązywania równań, dekompozycji macierzy (SVD, LU, QR) i co najważniejsze ma zaimplementowane wsparcie dla natywnej biblioteki Intel Math Kernel Library, dzięki czemu znacząco zyskujemy na wydajności. Niestety dnAnalytics miał jedną wadę: nie w pełni wykorzystywał możliwości MKL.

W ten sposób dotarłem (całkiem przypadkowo) od ILNumerics.Net. Porównując z dnAnalytics to ma raczej trochę inny interfejs (ani nie lepszy, ani nie gorszy, po prostu inny) przypominający bardziej język skryptowy  z Scilaba czy Matlaba (między innymi odwoływanie się do pól macierzy). A skoro jestem przy macierzach to warto wspomnieć, że w tym przypadku nie jesteśmy ograniczeni tylko do dwóch wymiarów i typu double, ale dzięki typom generycznym możemy wykorzystać niemal dowolny typ numeryczny w wielomiarowej przestrzeni. Malutkim minusem jest brak obsługi plików CSV do których przyzwyczaiła mnie dnAnalytics, ale coś za coś. Na zakończenie jeszcze jeden ogromny plus: w pełni wykorzystuje zestaw funkcji LINPACK z natywnej biblioteki MKL, a także dodatkowo z konkurencyjnej biblioteki firmy AMD. Dla zachowania kompatybilności z platformą mono powstała również specjalna wersja natywnego silnika matematycznego.

Podsumowując dnAnalytics jest bardzo przejrzystą biblioteką nadającą się do projektów w których nie wymaga się dużej wydajności i ograniczamy się do dwóch wymiarów. ILNumerics.Net jest natomiast prawdziwą perełką wśród otwartych bibliotek matematycznych, a dzięki porządnemu połączeniu z MKL i pochodnymi jest naprawdę wydajnym tworem.

Wpis dokonany przez Przemysław Walkowiak dnia 29 July 2008.
Tagi: , , , | Brak komentarzy

Visual Studio 2008 SP1 Beta i .NET 3.5 SP1 Beta

Parę dni temu coś mnie podkusiło do instalacji wersji beta nowego service packa do VS2008 i .NET3.5. Instalacja przeszła względnie bezboleśnie (musiałem tylko zwolnić trochę miejsca na dysku;) ).

I wszystko byłoby OK, gdyby nie fakt, że RubiksCube v2 przestał działać..
A dokładniej po wykonaniu dowolnego ruchu wywalał się bliżej nieokreślony błąd w PresentationCore.dll (bliżej nieokreślony, bo opisu błędu wogóle nie było). Co lepsze przed SP1 Beta aplikacja działała prawidłowo...

Błędu szukałem komentując po kolei poszczególne fragmenty kodu i dotarłem do takiej konstrukcji

  1. if (model == null)
  2. {
  3. model = new Model3DGroup();
  4. }
  5. else
  6. {
  7. model.Children.Clear();
  8. }

Gdzie model jest typu Model3DGroup. Doszedłem do tego, że aplikacja wywalała się przez linijkę 7. Nie wiem dlaczego tak się zachowywał, ale błąd naprawiłem w następujący sposób:

  1. if (model == null)
  2. {
  3. model = new Model3DGroup();
  4. }
  5. else
  6. {
  7. model.Children = new Model3DCollection();
  8. }

I jak na razie aplikacja śmiga :P

Wpis dokonany przez Przemysław Walkowiak dnia 24 May 2008.
Tagi: , , , , , | Brak komentarzy

Debugger w Visual Studio

Jak wiadomo debugger dla programisty to jest bardzo ważne narzędzie, które potrafi znacząco ułatwić pracę. Moim zdaniem w Visual Studio znajduje się chyba jeden z najlepszych pod względem intuicyjnego używania (aczkolwiek dawno nie korzystałem z produktów Borlanda, tam może też się co nieco zmieniło;) ). Nie będę tutaj opisywał jak z poziomu środowiska IDE obsługiwać to narzędzie, gdyż to raczej każdy już sie z tym zapoznał, ale jak z niego korzystać z poziomu kodu.

W ogólności służy do tego klasaSystem.Diagnostics.Debugger. Co prawda posiada ona tylko trzy metody przydatne dla programisty, ale liczba ich nie jest istotna;).

  • Debugger.Break() - powoduje zatrzymanie działania programu i włączenie debuggera (coś a la standardowy breakpoint)
  • Debugger.Launch() - uruchamia debugger i podłącza go do aktualnego procesu, ale jeszcze go nie zatrzymuje
  • Debugger.Log(int level, string category, string message - wykorzystuje w przypadku, gdy chcemy wysłać na konsolę debuggera informację zwrotną. Nie potrzebujemy w tym wypadku tworzyć aplikacji konsolowej - w ogóle nie musi ona posiadać jakiegokolwiek okna ;)

Ciekawostką jest to, że wywołania tych metod zostają usuwane w wersji Release projektu. Są one dostępne jedynie w wersji Debug.
Przydatności metody Log() chyba nie trzeba tłumaczyć. Zawsze przecież przydają się dodatkowe informacje w przypadku, gdy badamy rozbudowaną i przebiegającą przez wiele iteracji funkcję.

Break() możemy oczywiście zastąpić standardowym Breakpointem z IDE, ale ma taką zaletę, że zadziała nawet wtedy gdy nie będziemy uruchamiali aplikacji z VisualStudio. Przydatne przy badaniu WebService'ów zainstalowanych na IIS;)

Sąsiednią klasą towarzyszącą System.Diagnostics.Debugger jest System.Diagnostics.Debug udostęniająca asercje (Assert(bool condition) - przy czym warunek musi być spełniony, aby program działał poprawnie) oraz bardziej rozbudowane metody do obsługi wyjścia w konsoli debuggera takie jak Write, WriteIf, WriteLine, WriteLineIf, Indent, Unindent, Print. W każdym bądź razie polecam się z nimi zapoznać :)

Wpis dokonany przez Przemysław Walkowiak dnia 2 March 2008.
Tagi: , , , | Brak komentarzy

Mechanizm refleksji

Jednym z przyczyn dla której platforma .NET jest tak elastyczna jest mechanizm refleksji. Prościej mówiąc modyfikacja programu w czasie jego działania. Przykładem użycia może być wywoływanie metod nieznając ich nazw w czasie pisania programu albo tworzenie obiektów z klas znajdujących się w zewnętrznych bibliotekach (inaczej: system wtyczek).
Żeby nie było nie występuje on tylko w produktach firmy Microsoft, ale także w innych językach: PHP, Java, Perl, Ruby. W których został zaimplementowany już dosyć dawno.
Więcej »

Wpis dokonany przez Przemysław Walkowiak dnia 3 August 2007.
Tagi: , , | 2 komentarzy

RubikCube v2 - animacje obrotów ścian

Oto screencast z prezentacji pierwszej prototypowej wersji RubiksCube. Jak narazie wielu efektów nie widać, ale to jest prawie, że dopiero początek.
W tej chwili jest zrobiony silnik do obsługi kostki Rubika oraz wizualizacja z wykorzystaniem technologi WPF.
Get the Flash Player to see this player.

Wpis dokonany przez Przemysław Walkowiak dnia 25 July 2007.
Tagi: , , , , , | Brak komentarzy

Microsoft Visual Studio codename Orcas beta 1

W zeszłym tygodniu zainstalowałem najnowszą, dostępną publicznie wersje środowiska programistycznego Microsoftu. W sumie na dysku leżała już od ponad miesiąca, ale jakoś bałem się ją instalować. Przerażała mnie objętość wersji instalacyjnej: 4.5GB spakowane rar'em, według mnie to trochę dużo.

W zeszłym tygodniu zainteresowałem się trzecią wersją frameworka .NET, ale wsparcie tegoż w Visual Studio 2005 nie było najwyższych lotów, a zwłaszcza modułu WPF. Krótko mówiąc trochę to przymulało ;) W takim razie warto było przetestować następną wersję Visual Studio. Przyjrzałem się dokładniej opisowi Orcasa i dowiedziałem się jednej istotnej rzeczy, która zmieniła moje zdanie na temat objętości instalki. Ta instalka nie zawiera tylko Orcasa, ale także pełną dokumentację MSDN co zmienia postać rzeczy.
Więcej »

Wpis dokonany przez Przemysław Walkowiak dnia 23 July 2007.
Tagi: , , , | 3 komentarzy