Sonntag, 16. Oktober 2011

Mandelbrot - Qt and CUDA with OpenGL Visual Studio 2010


Do you like Mandelbrot Set? Do you like Animations? Wanna have all together right now? Here it comes. (It has been supposed to be an exciting announcement, nevermind...)

A small demonstration example for CUDA with OpenGL Pixelbuffer put together in a Qt4 Application.



Source Project Solution VS 2010 "qt4_mandelbrot"
16.04.12: This example is "deprecated". I have reworked and bugfixed it for the Linux tutorial, see here. I will release the VS2010 edition soon, but you can copy the new source from the Linux tutorial.
19.10.11: Bugfix: cudaGLSetGLDevice(0) must be called only in initGL()

(Requirements see previous tutorial on qt and cuda in vs2010)


In my previous tutorial on Qt, CUDA, VS2010 I have shown you how to integrate all the libs together. You have been able to run an empty CUDA kernel in a Qt Application. It already has an OpenGL Widget (yet black empty screen). Now you want to create a 2D Image with Pixel-Fun-Stuff processed right on the GPU. OpenGL is just used as Presenter.

Before I have started I had following questions:
  1. How to connect .cu source with .cpp source ?
    (i.e. running kernel functions by extern classes)
  2. How to calculate and paint the result on gpu side ?
    (without involving cpu cycles/host such as memcopy)
1. Our cuda source is compiled by nvcc as you know. On the other hand we have classes in C++ such as our OpenGL Widget or our custom class SimplePBO which is our "Pixelbuffer-CUDA-Manager". Since SimplePBO accesses the kernel function in kernelPBO.cu, we have to declare the accessing function. This is done in globals.h.
extern "C" void launch_kernel(uchar4*, unsigned int, unsigned int, int);
(You cannot include your .cu files, since they are not simply C files. The implementation on cuda side will be linked after compilation, so launch_kernel() will find its definition here.)

2. I assume you know how to create and bind textures in OpenGL. You may heard of pixel buffer objects too. It's well explained on this site. We will allocate our image space on gpu side creating a pixelbuffer object. CUDA will use this object for pixel manipulation (of course on gpu side as well). Our image then will be bound to an OpenGL Quad as texture. I want to give you an encouraging quote from one of my references ([1]):
As we will see, CUDA and OpenGL interoperability is very fast!
The reason (aside from the speed of CUDA) is that CUDA maps OpenGL buffer(s) into the CUDA memory space with a call to cudaGLMapBufferObject(). On a single GPU system, no data movement is required! Once provided with a pointer, CUDA programmers are then free to exploit their knowledge of CUDA to write fast and efficient kernels that operate on the mapped OpenGL buffers. ([1])
But there is a little restriction you should know: The Pixelbuffer Access is exclusive. Only one can access the pixel buffer at the same time, either CUDA or OpenGL.

I also recommend presentation [3] about CUDA and OpenGL, especially the part starting on page 22 (Steps To Draw An Image From Cuda). You will see how to work with the pixel buffer in OpenGL and Cuda.

In our Demonstration Project we use Qt (QGLBuffer) for dealing with the Pixelbuffer, so we dont have to care for OpenGL extensions (maybe glew for proc adresses and so on). We create the pixel buffer object as follows (simplePBO.cpp::createPBO()):

pixelBuffer = new QGLBuffer(QGLBuffer::PixelUnpackBuffer);
pixelBuffer->setUsagePattern(QGLBuffer::DynamicCopy);
pixelBuffer->create();

pixelBuffer->bind();
pixelBuffer->allocate(size_tex_data);

HANDLE_ERROR( cudaGLRegisterBufferObject( pixelBuffer->bufferId() ) );

In simplePBO.cpp::initCuda() the first cuda device is choosen ( cudaGLSetGLDevice(0) ). You will have to change on your own, if it doesnt fit. You can check your cuda devices with this little exe I wrote from [2]: CUDA Device Checker (output on console). A more advanced GUI based CUDA Checker you can obtain here named as CUDA-Z.

Ok, I do not want to explain every method here, just catch the code and explore the comments and consider the references [1; 3].

Last thing I want to mention is the image size. Due to the thread dimensions (16 per block) image size has to be a multiple of 16. So dont get confused about it. You also could set a fixed image size of 512 or 528 or something like that (see simplePBO.cpp::initCuda()).


References:
[1] - CUDA, Supercomputing for the Masses, from http://drdobbs.com/cpp/222600097
[2] - CUDA By Example, An Introduction To General-Purpose GPU Programming. Book source codes you can download here
[3] - What Every CUDA Programmer Should Know About OpenGL, PDF Version

Freitag, 14. Oktober 2011

Visual Studio 2010 with Qt and CUDA and OpenGL

How to integrate CUDA in Visual Studio 2010 and how to write your Qt App with OpenGL using CUDA.

Source download
(tested on Win7 VS2010, Geforce 9800GT).
(for project/solution you still have to follow the howto :P)

Assuming you have at least:
  • Windows 7 32bit/64bit (XP?)
  • Visual Studio 2010 (not Express Edition)
  • Qt 4.7.4 (howto integrate in vs2010)
  • CUDA capable gpu (see nvidia)
  • CUDA Toolkit 4.0 (32bit or 64bit)
    - Developer Drivers
    - CUDA Toolkit
    - GPU Computing SDK
    - Parallel Nsight 2.0 (makes integration in vs2010)
Howto:

Setup cuda syntax highlighting:
  • copy usertype.dat to visual studio as following (Win7):
    C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\doc\syntax_highlighting\visual_studio_8\usertype.dat
    TO
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
  • in your .cu files just add following headers for command recognition
    #include <cuda.h>
    #include <cuda_runtime.h>
    #include <device_launch_parameters.h>
Create Qt Project and connect .cu files with cuda.
  1. create a qt4 gui project (Qt4 Projects - Qt Application) in vs2010 (i will call it qt4_test2)
  2. follow the wizard and add OpenGL Library in the second step
    - (if you have 64bit consider the libgles32.lib linking bug, see notes in howto integrate in vs2010)
  3. right click on project in solution explorer and click "Build Customizations" ("Buildanpassungen")
    - select CUDA 4.0 ...
  4. go to Project Properties
    Add in Linker - Additional Dependencies
    - cudart.lib (cuda runtime library)
    Change Linker - System SubSystem to
    - Console (we want to see printf(), GUI will work though)
    In VC++ Directories
    - add $(CUDA_INC_PATH) to "Include Paths" (german "Includeverzeichnisse")
    Cutil Library
    If no cutil32.lib / cutil64.lib is there, just compile C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common\cutil_vs2010.sln
    Then add to your own project properties - VC++ Directories:
    - add $(NVSDKCOMPUTE_ROOT)\C\common\inc (Include Directories)
    - add $(NVSDKCOMPUTE_ROOT)\C\common\lib\Win32\ (Library Directories) (or x64\)
    or just copy *.dll from ..lib\Win32\ to ..lib\bin\
  5. add a new qt class (not gui class) to be our opengl widget
    - Classname = AppGLWidget
    - BaseClass = QGLWidget
    - Constructor = QWidget *parent
  6. open the qt4_test2.ui (this is our QMainWindow) (will start the qt designer)
    - make the central widget as AppGLWidget (see screenshots)

  7. add to source a new cuda c/c++ file (.cu)
    - kernel.cu
    - right click on kernel.cu for properties and choose "CUDA C/C++" Compiler as type.
    (if there isnt anything you may have forgotten step 3)
  8. insert the following code to the certain files:
AppGLWidget.h:
extern "C" void launch_kernel();

AppGLWidget.cpp in constructor method:
launch_kernel();

kernel.cu:

#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>

__global__ void kernel()
{
 // ...
}

extern "C" void launch_kernel()
{
 printf("RUN CUDA KERNEL\n");
 kernel<<<1,1>>>();
}



Compile and go crazy.

Note: You will have to repeat project setting for Release configuration (assuming we've just been in Debug configuration).

Note: If you get asked at compiling that build must be finished ... you cant really get rid off it. it's an annoying bug of qt visual add-in. it's on the bug list (critical?). if you know more, just tell me.


For a more decent example in OpenGL using Pixelbuffer Objects for 2D procedural textures, see my next post: Qt4 Mandelbrot with CUDA.

Qt 4.7.4 and Visual Studio 2010 Integration

How to integrate Qt 4.7.4 in Visual Studio 2010 (32bit/64bit).

// i rewrote this howto for my mind but most of it comes from here (thanks)
// http://thomasstockx.blogspot.com/2011/03/qt-472-in-visual-studio-2010.html

My environment:
Assuming you have at least:
  • Visual Studio 2010 (not the express edition :P)
    (i will not cover alternative ways (mingw g++) here, but if you have tuts on it, let me know.)
  • on windows xp it should work but tell me if not (with error description of course :))
  • ServicePack 1 for Visual Studio 2010
    http://www.microsoft.com/download/en/details.aspx?id=23691
    if link doesnt work, google for visual studio 2010 service pack and download the web installer
    if i recall download size was beyond 500MB
  • maybe this patch is still needed for vs2010 (only if u go for x64)
    http://archive.msdn.microsoft.com/KB2280741

How to:
  1. extract qt source to dir (i'll use C:\Qt\4.7.4)

  2. setup path in system environment variables
    - add new variable QTDIR with path to source (C:\Qt\4.7.4)
    - edit variable PATH and insert "%QTDIR%\bin;"
    - add variable QMAKESPEC="win32-msvc2010" (works also for 64bit)

  3. start command prompt from visual studio tools:
    (it's a normal cmd with further environment vars for compiling)
    - there are several command prompt files:
    - 32bit: take the normal command prompt without any additions
    (I have "Visual Studio-Eingabeaufforderung (2010)" here :) )

    - 64bit: compiling take "...x64 Win64"
    ("Eingabeaufforderung von Visual Studio x64 Win64 (2010)" in german version)

    // if you do not really need 64bit i will recommend 32 bit
    // if you want both you perhaps have to create another dir such as Qt\4.7.4_64bit\


  4. type in that command console
    $ cd %QTDIR%
    $ configure -shared -debug-and-release -opensource -opengl desktop -platform win32-msvc2010 -no-qt3support -no-webkit -mp -no-phonon -no-phonon-backend
    $ nmake

    // -mp = multiple processors for compiling with MSVC (-MP) // so you dont need "jom"
    // -platform win32-msvc2010 works also for 64bit if you took VS2010 x64 console
    // Qt Libs are compiled as 64bit then


  5. compiling is done, now go for visual studio add-in (i have v1.1.9)
    http://qt.nokia.com/downloads/visual-studio-add-in
    - install it :)

  6. run vs2010 and set qt dir in Qt -> Qt Options (C:\Qt\4.7.4)


NOTE: configure for static libs
if you want static libs running configure -static ... you will get a very big output (30gigs and more) because examples and demos will compiled as static (bigger exes). unfortunately you cannot disable compiling examples and demo by configure argument as you may know from linux (-nomake examples ...). you could disable compiling by modifying pro files respectively or you dont care cuz you have enough space. you also can clean the examples and demos afterwards by moving into these directories and run "nmake clean."


Note: 64bit Qt and OpenGL ("libgles32.lib" linker error)
If you have compiled on x64 you will get a linker error in Qt OpenGL based projects because of a "bug". Linker additional dependencies point to a "libgles32.lib". Well, we are not on an embedded system so remove this and insert opengl32.lib instead of it.
(Project Properties and Linker and then Input and Additional Dependencies if i translated it correct.)

Note: 64bit Qt Libs
You cannot create 32bit qt projects of course. Linking against x64 compiled Qt Libs will fail.

Note: Enabling 64bit compiling in VS2010
Project Properties and Configurations Manager (top right button). Create a new configuration and choose x64.

Note: Qt GUI with forms and Console for debug output (qDebug, printf, etc)
Project Properties and Linker and System and change SubSystem to Console (GUI will work though).

Montag, 6. Juni 2011

Collatz Vermutung weiterhin nur eine Vermutung

Es ist kaum paar Wochen her, als ich hier ein paar Bilderchen und ein Programm zur Collatzfolge (und auch collatzähnlichen Folgen) veröffentlicht habe, schon erscheint ein anfänglich interessanter Beweisvorschlag zur Collatzvermutung. Die Vorveröffentlichung von Gerhard Opfer (Professor Hamburg im Ruhestand, war Schüler von Collatz) umfasst etwa nur 14 Seiten zuzüglich Anhang:

hbam2011-09.pdf

Er verwendet fast durchgängig dabei die älteren Arbeiten von Lothar Berg und Günter Meinardus. Eine davon ist:
The 3n+1 Collatz Problem and Functional Equations (1995)

Der Beweisvorschlag von Opfer ist leider falsch. Wenn ich das richtig verstanden habe, stellt er eine neue unbewiesene Behauptung auf, die ähnlich schwierig zu beweisen sein dürfte wie das Collatzproblem selbst. Er scheint sich damit auf hohem Niveau im Kreis gedreht zu haben:
http://mathlesstraveled.com/2011/06/04/the-collatz-conjecture-is-safe-for-now/

Ich kenn mich da zu wenig aus. So wie sich das alles anhört, wären 14 Seiten und etwas Modifizieren von alten Arbeiten ein sehr sonderbares Ergebnis gewesen für dies alte, recht hartnäckige Problem. Die Pdf umfasst zwar 32 Seiten, die rund 20 Seiten Tabellen hab ich aber mal abgezogen, weil das für mich nach Anhang aussieht und nicht zum Beweis gehört.

Vielleicht erhalten wir auch die Aussage, dass das CollatzProblem nicht (formal) beweisbar ist. Ein Ansatz dazu kursiert bereits:
http://arxiv.org/abs/math/0312309
Scheint jedoch ebenfalls fehlerhaft.

Das ist der "neue" Albtraum nach Fermats Theorem (93 von Wiles bewiesen, 95 veröffentlicht). Ok, wir hätten noch die NP!=P Vermutung, was aber nicht so leicht zu erfassen ist wie das Collatz Problem und der Komplexitätstheorie zugehörig ist. Zahlentheoretische Probleme wie Fermats Theorem oder eben das Collatzproblem sind viel hübscher und garantieren einem 10, 20 Jahre Aufenthalt aufm Dachboden mit anschließender Sicherheitsverwahrung in der Klappse oder mit anschließendem Ruhm (letzteres trifft jedoch mit Wahrscheinlichkeit Null ein).
Nun gibt es auch noch die Riemannsche Vermutung, auch Zahlentheorie, involviert aber auch komplexe Analysis, die auch sehr schön ist, aber eben nicht mehr so leicht erfassbar. Es gibt natürlich noch eine Menge andere ungelöste Probleme, aber für heute reichts :)

Dienstag, 24. Mai 2011

Historische Kursdaten in Gnuplot darstellen

Wie man Kursdaten in Gnuplot plottet :) GnuPlot und Kursdaten werden benötigt. Es gibt diverse Möglichkeiten, an historische Kursdaten zu kommen. Nicht immer sind diese einfach als csv einfach zu downloaden, manchmal muss man Tabellen in Dateien hinüberkopieren und nachbearbeiten.

Historische Kursdaten kostenlos im Internet:
http://www.jblaustein.de/finanzen/historische_kurse/historische_kurse.html

Ich hab mich kurzerhand für onvista.de entschieden und die Kursdaten in der Tabelle in eine csv kopiert, die Kommas ins englische Dot ersetzen lassen, wobei ich noch den Tausendtrenner zuvor entfernen musste, was jedoch in Kate bzw mit regulären Ausdrücken kein Problem war.


Dollar und Gold historische Kursdaten von Mai 2003 bis Mai 2011

(Die Dollarkurs-Kurve erinnert mich irgendwie stark an meine Collatz-Kurvendiagramme ;) )

Download
CSV Datei: Gold in US Dollar die Feinunze
CSV Datei: US/EUR Devisenkurs

Gnuplot: Skript für GnuPlot

Freitag, 20. Mai 2011

Wärmegewitter vom 19./22. 05. 2011

Eine kleine Bilderserie über Wolken und die gewittrige Entwicklung vom 19. 05. 2011.



Video Zeitraffer youtube:


Wetterbericht 22.05.11
Ebenfalls Gewitterpotenzial, jedoch unerfüllt an dem Tag, in der Entwicklung hier festgehalten:



Video Zeitraffer youtube:

Mittwoch, 18. Mai 2011

Bachelorarbeit Transportoptimierung

Nach nun über einem Jahr werde ich nun meine Bachelorarbeit unter der creative commons Lizenz veröffentlichen. Seit der Einreichung und Bewertung habe ich noch einige kleine Korrekturen vorgenommen.

Sie steht ab sofort zum Download bereit:
Bachelorarbeit "Transportparadoxon in der Transportoptimierung"

Creative Commons Lizenzvertrag
Die Bachelorarbeit "Transportparadoxon" von Matthias Werner steht unter einer Creative Commons Namensnennung-NichtKommerziell-KeineBearbeitung 3.0 Lizenz.


Abstract:
Das Transport- oder auch das more-for-less-Paradoxon besagt, dass durch einen geforderten Mehrtransport die Gesamtkosten des neuen optimalen Transportplans sinken. In dieser Arbeit werden verschiedene Ressourcen- und Kostenstrukturen untersucht, um Voraussetzungen für das Transport-Paradoxon oder für die Immunität zu erhalten.
Neben dem klassischen Transportproblem werden unendlich-dimensionale und offene Transportmodelle untersucht.

Samstag, 14. Mai 2011

Collatz Folge - Fortsetzung #2

(15.05. Inzwischen nochmal nachgelegt zu Version 0.5)

Collatz Tool

Soeben Collatz Tool v0.4 "geupdatet". Bilder der Collatz Folgen sind nun online als Webalbum unter picasa zu finden.

Darunter sind Screenshots aus dem aktuellen OpenGL Projekt zu sehen, an dem ich arbeite. Für den ersten Härtetest dienten quasi die Daten der Collatz Folgen. Bei einer Million Daten merkte man dann doch schon die Belastung bei der GPU Übertragung (DisplayListenKompilierung), jedoch liefen die Kernfunktionen flüssig (auf einen dual-core mit NVidia 9800GT 512MB).

Die Daten werden dabei blockweise aufgereiht, sodass die ersten bspw. 512 Werte der Collatz Folge (bei steigender Startnummer nach Terminierung) neben den nächsten 512 Werten anliegen. So ergeben sich 512 Stränge mit je 512 Werten. Man sieht wie die Kurven steigen und dann irgendwann wieder bei 1 terminieren. Dann fängt die nächste Folge mit dem nächsten Startwert an.


Screenshot aus dem View3d Projekt (128x128 Daten)

Mittwoch, 11. Mai 2011

Collatz Folge - Fortsetzung

Habe das Programm zur Collatz Folge weiterentwickelt.
Siehe Collatz Tool.
Einige Resultate in Kurzfassung:
(Die folgenden Bilder und weitere finden sich auch auf picasa)


Collatz: 23 bis 5022 - Verlauf der Zahlen


Collatz: 23 bis 5022
oberes TeilDiagramm: Anzahl der Rechenschritte bis Terminierung bei 1
Das Wachstum der Rechenschrittanzahl scheint immer schwächer anzuwachsen (ähnlich der log-Funktion, siehe nächstes Bild). Und wieder sind periodische Muster zu erkennen.
unteres TeilDiagramm: größte Zahl, die in der Folge erreicht wurde.


Collatz: 23 bis 5022 (wie eben, nur logarithmische Skalierung)


Collatz: 23 bis 5022 (wie oben, nur logarithmische Skalierung)


Collatz: 280 bis 289 je Zahl ein Farbwert der Regenbogenpalette

Würde gerne ein bissl mehr dazu raussuchen, wäre bestimmt auch ein nettes Seminarthema, aber mehr Zeit werde ich dem hier nicht widmen. Ich mag jedoch das Problem: eine einfache Fragestellung, eine einfache Formel, keine einfache Lösung. Typisch Zahlentheorie. Das erste "zahlentheoretische" Problem, mit dem ich mich damals vor etwa 8 Jahren befasst habe - in PHP - hatte mit gd (graf. Lib, kam ca. 2003 mit PHP 4.3 raus) rumgespielt. Das war ineffizient, aber geil. ;)

(Bilder wurden mit R erstellt)

Mittwoch, 4. Mai 2011

Source Code Header Replacer mit sed

Da ich in die Verlegenheit kam, den Lizenztext aller meiner Quellcode Dateien zu ändern, hab ich mir kurzerhand ein mini sed Skript zusammengebastelt. Es löscht zunächst den alten Lizenztext aus den Dateien und fügt dann den neuen Lizenztext ein, der aus einer Datei geholt wird. Man kann sich eine Vorschau anzeigen lassen, indem man die Option "-i" weglässt.
Die ersten 20 Zeilen der alten Quellcodedateien mögen der alte Lizenztext sein.

## replace headers script
# delete first 20 rows (old license text)
sed -i '1,20d' *.h
# maybe you have to insert newline at top
sed -i '1i\\n' *.h
# insert header content from file
sed -i '1r ../LICENSE' *.h

Ein Einzeiler für cpp und h Dateien:
find . -regex '.*\(cpp\|h\)' -exec sed -e '1,19d; 20 c\\n' -e '21r ./LICENSE' '{}' \;

- lösche die ersten 19 Zeilen
- ersetze letzte Zeile (20. Zeile) mit Leerzeile
- füge nach erste (Leer)Zeile Lizenztext aus Datei ein

(-e "1,20d; 21r ./LICENSE" hatte bei mir nicht funktioniert, da er den Lizenztext leider zwischen der ersten und zweiten Zeile eingefügt hatte, und nicht vor der ersten Zeile)

Sonntag, 1. Mai 2011

Handliches transcode Skript für Videokonvertierung

20. 05. 11: kleines Update. Das Skript hatte ich neu geschrieben und nun merk ich langsam, dass es nich so toll ist, wie ich mir das so dachte. Empfehle es nun nicht unbedingt, es sei denn, man will nur Zeitraffer machen und evtl Audio drunterlegen oder sich transcode mal näher anschauen. Mit ffmpeg bin ich in manchen Sachen doch schneller.

--

Ich verwende für die avi Konvertierung der Digitalkamerafilme (Canon Legria FS20, mod/mpeg Format, Interlaced top field first) transcode und ffmpeg.

Momentan hab ich folgende Funktionen in Gebrauch:
Video ...
- einfach konvertieren
- mit Audio unterlegen
- in Zeitrafferaufnahme konvertieren (timelapse)
- mit Rahmen oder Wegschneiden
- Zwei Pass Enkodierung

Download Skript:
mpgtranscode.sh



Mehrere Dateien konvertieren:
for i in `ls *.mod`; do
trap 'echo "Abort transcoding..."; exit;' 2
./mpgtranscode.sh $i ${i/%mod/avi}
done

Transcode:
FilterEinstellungen
ExportEinstellungen
Interlace/progressive (Interlace vs. Progressive Scan)
Deinterlacing Filters

Interlace Problematik:
If you get the (interlace) option wrong, there will be no difference on a PC monitor, but when viewed on a TV the video will be very jittery; in this case, try the opposite setting
Deinterlacing ist irreversibel. Falls der Zielplayer interlaced Filme darstellen kann, sollte man auf Deinterlacing verzichten. Für youtube sollte man Videos deinterlacen, auch wenn youtube inzwischen teilweise interlaced Videos (nur HD?) darstellen kann, soweit wie ich das mitbekommen hab.

Um herauszufinden, in welchem Interlace Mode ein Video aufgenommen wurde, kann man mit mplayer das Video folgendermaßen abspielen:
$ mplayer -vf tfields=1:0 video.mpg
If the motion looks smooth then the field dominance is top field first; if the motion is not smooth it is bottom field first. To verify the field order play the video again with
$ mplayer -vf tfields=1:1 video.mpg
(siehe Checking Interlace Order)

Donnerstag, 28. April 2011

Collatz Folge mit Big Integers

Collatz Tool (Konsole, Windows / Linux):
- berechnet Collatz Folgen und collatzähnliche Folgen
- Ausgabe in CSV Format in Datei
- zwei Ausgabevarianten (vollständig und aggregiert)
- Optionen und Parameter über Konsoleneingabe konfigurierbar



Update 15.05.11: Version 0.5.
Update 14.05.11: Version 0.4.
Update 08.05.11: Windows Version hinzugefügt + Version 0.3.


Sourceforge Project (Download + SVN):
https://sourceforge.net/projects/collatztool/

Download:
Source:

collatz_0.5_src.zip

Windows 32bit:
collatz_0.5_win32bin.zip
(Kompiliert mit gcc 4.5.0, mingw32)

R Skripte:
collatz_r_scripts.zip


Aus Collatz Problem Bilder

Bilder der visualisierten Daten auf picasa



Ein Artikel auf matheplanet erinnerte mich wieder an ein altes Problem: die Collatz-Folge und die bisher noch ungelöste Frage, ob sie für jede Zahl irgendwann wieder bei Eins terminiert. Siehe auch im Wiki-Artikel zum Collatz-Problem.

Da ich ohnehin mal nach einer Möglichkeit gesucht hatte, mit beliebigen natürlichen Zahlen zu rechnen, fand ich nun etwas Zeit, mal das ganze anhand des Collatz-Problems umzusetzen. Denkbar einfach eigentlich, wenn man folgende Bibliothek verwendet:

http://sourceforge.net/projects/cpp-bigint/
(GPL)

Man kann das Collatz-Problem ein wenig modifizieren und erneut die Frage stellen, ob diese für eine beliebige Zahl terminiert oder in einem Zyklus landet. Statt mit dem Faktor 3 kann man auch 5 oder 7 oder ... nehmen.
Die Zahlen werden jedoch schnell recht groß, sodass die Integer Datentypen hinfällig sind. Zum Experimentieren hab ich also mal ein Mini C++ Programm geschrieben, das obige Bibliothek verwendet.


Beispiel mit Faktor 7 und Startzahl 7. Die Anzahl der Stellen wächst nahezu linear (entspricht logarithmischer Skalierung der Zahlen).

Bild 1 in Gnuplot
Bild 2 in R spaßeshalber mit Regressionsgeraden

--

Inzwischen hab ich das Programm noch erweitert, sodass per Konsole die Optionen eingegeben werden können.

collatz tool (2011/04/28) - License GPL v2
OPTIONS:
-f factor - collatz factor (3)
-s startnumber - number where to start (23)
-m maxloops - maximum of loops (10000)
-o output - output file where all the numbers and digits will be saved ("output.csv")


Eine Ausgabe:
./collatz -f 7 -m 1000 -s 7 -o "myoutput.csv"

Time: 605 ms
Finished!

Startnumber: 7 Factor: 7
Last number:
165059775843459228273519944627021462143091242535195009952629545650013760819089 (Length: 78)

1000 iterations done (of max. 1000).

Output successfully written to myoutput.csv


Der QuellCode kann im Folgenden heruntergeladen werden. Die BigInteger Bibliothek ist mit enthalten. Die GPL Lizenz ist dabei zu berücksichtigen.

Anbei die einfache sowie erweiterte Version und die gnuplot und R Dateien, wen es interessiert.

Download:
Source:

collatz_0.5_src.zip

Windows 32bit:
collatz_0.5_win32bin.zip
(Kompiliert mit gcc 4.5.0, mingw32)

R Skripte:
collatz_r_scripts.zip

Veraltet:
Windows 32bit:
collatz_0.3_win32bin.zip
collatz_0.3_src_vsproject.zip

Linux Source:
collatz_0.1.tar.bz2
collatz_0.3.tar.gz
gnuplot_r.zip

Weitere Artikel zu Collatz:

http://11235813tdd.blogspot.com/2011/05/collatz-folge-fortsetzung.html


http://11235813tdd.blogspot.com/2011/05/collatz-folge-fortsetzung-2.html

http://11235813tdd.blogspot.com/2011/06/collatz-vermutung-weiterhin-nur-eine.html

Montag, 24. Januar 2011

Wikiweb Wikipedia Visualisierung

Wer processing kennt und wikipedia mal als Netz visualisiert haben möchte, kann sich das sketchbook von anthony mattox anschauen.
Die Seiten auf Wiki werden nach Links durchsucht und als Knoten dargestellt. Aus processing heraus können die Links aufgerufen werden. Bilder bzw. Dateien werden durch ein Quadrat, Links als Kreis-Icon repräsentiert.

Die von anthony mattox angebotenen SourceFiles sind jedoch noch nicht ganz aktualisiert (geht vom veralteten wiki-quelltext aus).
Ich habe lediglich ein paar Veränderungen vorgenommen, und zwar gleich so, dass es für die deutsche Wiki läuft (einschließlich Umlaute).
Zu beachten ist, dass unter linux die Funktion "link()" möglicherweise nicht funktioniert. Es erscheint die Fehlermeldung:
Could not find gnome-open or kde-open, the open() command may not work.

Der Browser muss dann in java über einen execute-Befehl direkt aufgerufen werden. Im beigefügten sketchbook gibt es unter "functions" die Funktion "void callLink(String iurl)", die nach Bedarf auch auf andere Browser angepasst werden kann.

Windows
Download

Linux (auf Firefox-Browser angepasst)
Download



Urheber bleibt anthony mattox, lizensiert unter creative common license.

Sonntag, 2. Januar 2011

QTfeedback first release

After some work i finally got it compiled on Windows.
You can get and test it:
http://sourceforge.net/projects/qtfeedback/files/qtfeedback_v1.0.zip/download

View some Screenshots on:
https://sourceforge.net/projects/qtfeedback/

It is more like beta version and not tested on other systems though.
You need libnoise (dll included) and OpenGL 2.0 or newer. Otherwise your texture will stay white.

Features so far:
  • Coloring sources with your own gradients (alphachannel supported)
  • Three different Feedback Methods (*)
  • Heightfield as one Feedback Plane (using libnoise)
  • Make Screenshots of your Feedback Fractals
  • some more features such as texture distortion ...

* Actually there is not much difference between the feedback modes. Mode 1 uses rendered scene to refeedback it like on a second layer. Cant explain it. Try and see, if you switch feedback option on source object.

The second mode is not easier to explain. First render pass uses a more little and mirrored heightfield. Second Pass is normal which uses feedback texture from first stage.

Uh i will have to find a logo for the executable...