Commit 218a6951 authored by Yann Jacquelet's avatar Yann Jacquelet
Browse files

Implement the kmean algorithh and start to optimize it.

	Implement the first version with vectors and matrices.

	* mln/clustering/k_mean.hh: New library component.

	* use/clustering/k_mean: New directory.
	* use/clustering/k_mean/Makefile.am: New makefile.
	* use/clustering/k_mean/k_mean.cc: New source file.

	* tests/clustering/k_mean: New directory.
	* tests/clustering/k_mean/Makefile.am: New makefile.
	* tests/clustering/k_mean/k_mean.cc: New source file.

	Implement the second version with image and working in 1d.

	* mln/clustering/kmean1d.hh: New library component.

	* use/clustering/kmean1d: New directory.
	* use/clustering/kmean1d/Makefile.am: New makefile.
	* use/clustering/kmean1d/kmean1d.cc: New source file.

	* demo/clustering/kmean1d: New directory.
	* demo/clustering/kmean1d/Makefile.am: New makefile.
	* demo/clustering/kmean1d/kmean1d.cc: New source file.

	Implement transformation between RG space and RGB space.

	* mln/fun/v2v/rg_to_rgb.hh: New library component.
	* use/fun/v2v/rg_to_rgb: New directory.
	* use/fun/v2v/rg_to_rgb/Makefile.am: New makefile.
	* use/fun/v2v/rg_to_rgb/rg_to_rgb.cc: New source file.

	Implement the third version working in 2d (r/g).

	* mln/clustering/kmean2d.hh: New library component.

	* use/clustering/kmean2d: New directory.
	* use/clustering/kmean2d/Makefile.am: New makefile.
	* use/clustering/kmean2d/kmean2d.cc: New source file.

	* demo/clustering/kmean2d: New directory.
	* demo/clustering/kmean2d/Makefile.am: New makefile.
	* demo/clustering/kmean2d/kmean2d.cc: New source file.

	Implement the fourth version working in 3d (rgb).

	* mln/clustering/kmean3d.hh: New library component.

	* use/clustering/kmean3d: New directory.
	* use/clustering/kmean3d/Makefile.am: New makefile.
	* use/clustering/kmean3d/kmean3d.cc: New source file.

	* demo/clustering/kmean3d: New directory.
	* demo/clustering/kmean3d/Makefile.am: New makefile.
	* demo/clustering/kmean3d/kmean3d.cc: New source file.

	Implement the fith version as a function (working in rgb space).

	* mln/clustering/kmean_rgb.hh: New library component.

	* use/clustering/kmean_rgb: New directory.
	* use/clustering/kmean_rgb/Makefile.am: New makefile.
	* use/clustering/kmean_rgb/kmean_rgb.cc: New source file.

	* demo/clustering/kmean_rgb: New directory.
	* demo/clustering/kmean_rgb/Makefile.am: New makefile.
	* demo/clustering/kmean_rgb/kmean_rgb.cc: New source file.

	Benchmark distance algorithm for the kmean algorithm.

	* bench/clustering/distance: New directory.
	* bench/clustering/distance/Makefile.am: New makefile.
	* bench/clustering/distance/distance.cc: New source file.
parent 2290b5c2
2010-06-28 Yann Jacquelet <jacquelet@lrde.epita.fr>
Implement the kmean algorithh and start to optimize it.
Implement the first version with vectors and matrices.
* mln/clustering/k_mean.hh: New library component.
* use/clustering/k_mean: New directory.
* use/clustering/k_mean/Makefile.am: New makefile.
* use/clustering/k_mean/k_mean.cc: New source file.
* tests/clustering/k_mean: New directory.
* tests/clustering/k_mean/Makefile.am: New makefile.
* tests/clustering/k_mean/k_mean.cc: New source file.
Implement the second version with image and working in 1d.
* mln/clustering/kmean1d.hh: New library component.
* use/clustering/kmean1d: New directory.
* use/clustering/kmean1d/Makefile.am: New makefile.
* use/clustering/kmean1d/kmean1d.cc: New source file.
* demo/clustering/kmean1d: New directory.
* demo/clustering/kmean1d/Makefile.am: New makefile.
* demo/clustering/kmean1d/kmean1d.cc: New source file.
Implement transformation between RG space and RGB space.
* mln/fun/v2v/rg_to_rgb.hh: New library component.
* use/fun/v2v/rg_to_rgb: New directory.
* use/fun/v2v/rg_to_rgb/Makefile.am: New makefile.
* use/fun/v2v/rg_to_rgb/rg_to_rgb.cc: New source file.
Implement the third version working in 2d (r/g).
* mln/clustering/kmean2d.hh: New library component.
* use/clustering/kmean2d: New directory.
* use/clustering/kmean2d/Makefile.am: New makefile.
* use/clustering/kmean2d/kmean2d.cc: New source file.
* demo/clustering/kmean2d: New directory.
* demo/clustering/kmean2d/Makefile.am: New makefile.
* demo/clustering/kmean2d/kmean2d.cc: New source file.
Implement the fourth version working in 3d (rgb).
* mln/clustering/kmean3d.hh: New library component.
* use/clustering/kmean3d: New directory.
* use/clustering/kmean3d/Makefile.am: New makefile.
* use/clustering/kmean3d/kmean3d.cc: New source file.
* demo/clustering/kmean3d: New directory.
* demo/clustering/kmean3d/Makefile.am: New makefile.
* demo/clustering/kmean3d/kmean3d.cc: New source file.
Implement the fith version as a function (working in rgb space).
* mln/clustering/kmean_rgb.hh: New library component.
* use/clustering/kmean_rgb: New directory.
* use/clustering/kmean_rgb/Makefile.am: New makefile.
* use/clustering/kmean_rgb/kmean_rgb.cc: New source file.
* demo/clustering/kmean_rgb: New directory.
* demo/clustering/kmean_rgb/Makefile.am: New makefile.
* demo/clustering/kmean_rgb/kmean_rgb.cc: New source file.
Benchmark distance algorithm for the kmean algorithm.
* bench/clustering/distance: New directory.
* bench/clustering/distance/Makefile.am: New makefile.
* bench/clustering/distance/distance.cc: New source file.
2010-06-24 Yann Jacquelet <jacquelet@lrde.epita.fr>
Define documentation files.
......
......@@ -33,8 +33,7 @@ n'y a rien à copier. Rendons-nous dans le répertoire de compilation et lançon
le makefile.
#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$
cd ../../../build/demo/annotating/hsv
#:cd ../../../build/demo/annotating/hsv
#:~/git/olena/scribo/sandbox/green/build/demo/annotating/hsv$ make clean all
L'exécutable est généré par le makefile, il porte le nom du
......@@ -168,6 +167,14 @@ de comptage puisqu'il est décrit sous la forme de triplets de float
contient une séquence d'appels pour les routines permettant de
considérer la dimension de la teinte comme circulaire.
Après réflexion, le code des histogrammes et tous les accumulateurs
qui en découlent devraient être rangés dans l'espace de nommage
mln::accu::histo. Cela permettrait de ne pas parasiter mln::accu::stat
avec tous les éléments propres aux histogrammes et de ne pas faire un
espace de nommage à rallonge en introduisant histo dans stat. Donc
mln::accu::stat semble être une bonne postion pour le rangement final
du code relatif aux histogrammes.
a) version 1d
......@@ -198,7 +205,6 @@ c) version 3d RGB
* use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
d) version 3d HSL
* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
......@@ -245,23 +251,145 @@ IX KMEANS
Ce travail m'avait été demandé par théo. Je le laisse inachevé, quelque part
perdu pendant l'optimisation du code et sa transformation en canevas.
a) Première implémentation avec matrices et vecteurs
Cette version est bien documentée et permet de mieux comprendre les autres
versions. Par ailleurs, elle n'est pas spécialement optimisée ce qui fait
qu'elle colle davantage au modèle de l'algorithme kmean traditionnel.
* mln/clustering/k_mean.hh: Première implémentation avec matrices et vecteurs.
* use/clustering/k_mean: Code minimal utilisant cette première implémentation.
* tests/clustering/k_mean: Tests unitaires sur la permière version.
b) Seconde implémentation avec image en 1d
Cette seconde version intègre une optimisation testée par théo il y a
longtemps. Je me demande si ce n'étais pas pendant sa thèse qu'il
avait travaillé sur cette version. Bref, dans la mesure où
l'optimisation passe par la création d'un histogramme, cette version
devient dépendante des histogrammes réalisés plutôt (il est aussi
dépendant de la sauvegarde au format gnuplot shell). L'idée générale
de l'optimisation est de ne plus raisonner sur l'image, mais sur
l'histogramme. Car à un moment donné, la classification ne tient
compte que de la valeur du pixel en intensité (pas de ses coordonnées
dans l'image). Donc tout pixel de même intensité sera classé de
manière identique. D'où l'intérêt de travailler avec les
histogrammes. Les limites de cette optimisation se trouvent dans la
taille des histogrammes. L'optimisation marche à merveille pour de
faibles quantifications (8 bits c'est parfait). Par contre, lorsque
l'on passe à un histogramme couleur, la taille de l'histogramme
devient problématique et peut dépasser la taille de l'image. Cette
optimisation n'a alors plus aucun sens.
* mln/clustering/kmean1d.hh: Implémentation 1d avec des images.
* use/clustering/kmean1d : Code minimal utilisant cette seconde implémentation.
* demo/clustering/kmean1d : Demonstrateur.
La visualisation de la convergence des moyennes, générée par le
démonstrateur, n'est pas très lisible. La lecture textuelle du fichier
gnuplot shell (mean_cnv.sh) permet d'interpréter ce qui se passe, par
contre le graphique est à refaire.
c) kmean2d
Cette troisième version est identique à la seconde, sauf qu'elle
permet de faire la classification dans un espace à deux
dimensions. Malheureusement, un tel travail dans cet espace coûte
beaucoup plus cher à l'exécution.
* mln/fun/v2v/rg_to_rgb.hh: Transformation de l'espace RG vers l'espace RGB.
* use/fun/v2v/rg_to_rgb: Exemple de code pour l'utilisation de rg_to_rgb.
* mln/clustering/kmean2d.hh: Implémentation 2d avec des images.
* mln/clustering/kmean3d.hh: Implémentation 3d avec des images.
* mln/clustering/kmean_rgb.hh: Impl. 3d aplatie et en cours de mise en canevas.
* use/clustering/kmean2d : Code minimal utilisant cette seconde implémentation.
* demo/clustering/kmean2d : Demonstrateur.
* tests/clustering/k_mean: Tests unitaires sur la permière version.
* tests/clustering/kmean1d: Tests unitaire sur la version 1d.
La visualisation de la convergence des moyennes est cette fois-ci
complètement aboutie. Le fichier semble avoir quelques soucis, il
manque des lignes dans le splot initial, en remettre pour qu'il y en
ait autant que les blocs de données. L'espace des couleurs étant le
bicanal r/g, on peut visualiser sur une troisième dimension
l'évolution des centres dans l'espace initial. L'effet est très réussi
et aussi très parlant. Chaque run, correspond alors à une trajectoire
particulière. L'affichage des variations des variances a été rénové et
est lui aussi beaucoup plus lisible.
d) kmean3d
Cette quatrième version est la copie conforme de la version
précédente. Les problèmes de visualisation sur les fichiés générés
sont les mêmes. L'affichage des convergences est identique. Le recours
à une dégradation de l'image d'entrée est impérative pour avoir des
temps encore acceptables.
* demo/clustering/kmean1d: Utilisation de la version 1d.
* demo/clustering/kmean2d: Utilisation de la version 2d.
* demo/clustering/kmean3d: Utilisation de la version 3d.
* mln/clustering/kmean3d.hh: Implémentation 3d avec des images.
* use/clustering/kmean3d : Code minimal utilisant cette quatrième impl.
* demo/clustering/kmean3d : Demonstrateur.
e) kmean aplati
Cette cinquième version est très spéciale. Elle doit permettre de
gagner du temps d'exécution. Le concept est simple au départ, tout
écrire d'un seul tenant. L'exercice est fastidieux et difficile
(intellectuellement). Une fois fait, il faut réfléchir à ce qui peut
être mis sous forme de canevas. Par exemple, la manière de calculer
les distances peut être une information paramétrable. Cela pemettrait
de faire un benchmark in situ. La transcription actuelle compile. Elle
n'intègre pas tous les outils de debuggage que nous pouvions avoir sur
les autres versions. Par ailleurs, comme le code est réuni en une
seule fonction, nous avons pour l'instant une seule sortie, l'image de
labels de la classification réalisée. A partir de cette image, nous
pouvons en reconstruire d'autres. Il manque quand même la possibilité
d'observer les convergences. Le travail était en cours, à prendre donc
avec beaucoup de pincettes. La dernière exécution house.ppm, 3
centres, 10 itérations et 10 runs fonctionne parfaitement sur les
premiers runs puis l'affichage s'emballe sans que l'on y comprenne
rien. Un dump dans un fichier révèle le non appariement de certaines
traces (entering/exiting). Une piste à suivre est la sortie anticipée
d'une de mes boucles sans pour autant fermer une trace ... ???
* mln/clustering/kmean_rgb.hh: Implémentation 3d avec des images.
* use/clustering/kmean_rgb : Code minimal utilisant cette quatrième impl.
* demo/clustering/kmean_rgb: Utilisation de la version aplatie.
f) optimisation possible
Le calcul des distances entre les points et les différents centres
peut être réalisé par des transformées. Certes, les distances ne seront
pas les mêmes que la distance euclidienne, mais elles s'en approchent
et cela constitue très certainement une très bonne approximation pour
l'objectif que nous cherchons à atteindre. Le but de ce benchmark est
de regarder quel type de transformation est le plus rapide pour
arriver à nos fins en fonction des données d'entrée. Cette
optimisation n'a pas encore été intégrée dans le code, et reste une
piste à exploiter.
* bench/clustering/distance: Comparaison algorithmes d'évaluation des distances.
==> to do
Une routine du benchmark ne compile plus. Il semble qu'il y ait un
mauvais appel à la fonction at_ dans la routine
influence_zone_geodesic.hh ligne 127. Le but du benchmark est de
tester les distances en 2d et 3d pour des voisinages différents (c04,
c08, c06, c18, c26) sur les routines distance euclidienne classique,
zone d'influence geodesique et zone d'influence "front". La première
serie de test vise à garder une taille d' image constante et
d'augmenter le nombre de centres pour voir comment se comporte les
algorithmes et la seconde serie, vise à garder un nombre constant de
centres et à agrandir progressivement l'image. Attention, le benchmark
essaye d'être assez exhaustif et donc se paye par un temps d'execution
assez long. Les différents fichiers générés reprennent les différents
tests effectués et montrent l'évolution du temps de calcul suivant la
progression du paramètre observé (taille de l'image ou nombre de
centres).
==> to do : le changelog + commit + give it to scribo-z branch
X REGIONAL MAXIMA
-----------------
......
#
# Generic Makefile
#
#########
# TOOLS #
#########
#LOADLIBES= -lboost_filesystem
INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
INCLUDES2= -I$(HOME)/git/olena/milena
INCLUDES= $(INCLUDES1) $(INCLUDES2)
#CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
ECHO= echo
RM= rm
MKDIR= mkdir -p
CP= cp
SOURCE_PATTERN= green/bench
BUILD__PATTERN= green/build/bench
ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
# Case where make is done from build directory.
SOURCE_DIR= $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
BUILD__DIR= $(PWD)/
else
# Case where make is done from source directory.
SOURCE_DIR= $(PWD)/
BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
endif
SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
OBJ= $(patsubst %.cc,%.o,$(SRC))
SOURCE_MAKEFILE=Makefile.am
BUILD__MAKEFILE=Makefile
TARGET_FILE= $(notdir $(PWD))
SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
#############
# BOOTSTRAP #
#############
bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
# Create, if nessary, the destination directory
$(BUILD__DIR):
$(MKDIR) $(BUILD__DIR)
# Copy, if nessary, all the files, except the Makefile.am
$(BUILD__F_PATH): $(SOURCE_F_PATH)
$(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
# Copy if nessary, the Makefile.am into Makefile
$(BUILD__M_PATH): $(SOURCE_M_PATH)
$(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
#######
# ALL #
#######
# We assume that the call is done from the build directory.
# With the directive vpath, hidden files are found in the source directory.
all: $(TARGET_F_PATH)
$(TARGET_F_PATH): $(OBJ_F_PATH)
$(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
$(OBJ_F_PATH):$(SRC_F_PATH)
$(COMPILE.cc) $(OUTPUT_OPTION) $<
#########
# CLEAN #
#########
# Force every time the deletion
clean: clean_target clean_obj clean_dst clean_old #clean_make
clean_target:
-@$(RM) $(TARGET_F_PATH) &> /dev/null
clean_obj:
-@$(RM) $(OBJ_F_PATH) &> /dev/null
clean_dst:
-@$(RM) $(BUILD_F_PATH) &> /dev/null
clean_make:
-@$(RM) $(BUILD_M_PATH) &> /dev/null
clean_old:
-@$(RM) $(OLD_F_PATH) &> /dev/null
#########
# PRINT #
#########
print: print_tools print_bootstrap
print_tools:
@$(ECHO) "HOME = $(HOME)"
@$(ECHO) "INCLUDES = $(INCLUDES)"
@$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
@$(ECHO) "ECHO = $(ECHO)"
@$(ECHO) "RM = $(RM)"
@$(ECHO) "MKDIR = $(MKDIR)"
@$(ECHO) "CP = $(CP)"
@$(ECHO)
print_bootstrap:
@$(ECHO) "PWD = $(PWD)"
@$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
@$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
@$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
@$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
@$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
@$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
@$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
@$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
@$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
@$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
@$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
@$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
@$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
@$(ECHO) "SRC = $(SRC)"
@$(ECHO) "OBJ = $(OBJ)"
@$(ECHO) "OLD = $(OLD)"
@$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
@$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
@$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
@$(ECHO)
This diff is collapsed.
#
# Generic Makefile
#
#########
# TOOLS #
#########
#LOADLIBES= -lboost_filesystem
INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
INCLUDES2= -I$(HOME)/git/olena/milena
INCLUDES= $(INCLUDES1) $(INCLUDES2)
CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
#CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
ECHO= echo
RM= rm
MKDIR= mkdir -p
CP= cp
SOURCE_PATTERN= green/demo
BUILD__PATTERN= green/build/demo
ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
# Case where make is done from build directory.
SOURCE_DIR= $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
BUILD__DIR= $(PWD)/
else
# Case where make is done from source directory.
SOURCE_DIR= $(PWD)/
BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
endif
SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
OBJ= $(patsubst %.cc,%.o,$(SRC))
SOURCE_MAKEFILE=Makefile.am
BUILD__MAKEFILE=Makefile
TARGET_FILE= $(notdir $(PWD))
SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
#############
# BOOTSTRAP #
#############
bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
# Create, if nessary, the destination directory
$(BUILD__DIR):
$(MKDIR) $(BUILD__DIR)
# Copy, if nessary, all the files, except the Makefile.am
$(BUILD__F_PATH): $(SOURCE_F_PATH)
$(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
# Copy if nessary, the Makefile.am into Makefile
$(BUILD__M_PATH): $(SOURCE_M_PATH)
$(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
#######
# ALL #
#######
# We assume that the call is done from the build directory.
# With the directive vpath, hidden files are found in the source directory.
all: $(TARGET_F_PATH)
$(TARGET_F_PATH): $(OBJ_F_PATH)
$(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
$(OBJ_F_PATH):$(SRC_F_PATH)
$(COMPILE.cc) $(OUTPUT_OPTION) $<
#########
# CLEAN #
#########
# Force every time the deletion
clean: clean_target clean_obj clean_dst clean_old #clean_make
clean_target:
-@$(RM) $(TARGET_F_PATH) &> /dev/null
clean_obj:
-@$(RM) $(OBJ_F_PATH) &> /dev/null
clean_dst:
-@$(RM) $(BUILD_F_PATH) &> /dev/null
clean_make:
-@$(RM) $(BUILD_M_PATH) &> /dev/null
clean_old:
-@$(RM) $(OLD_F_PATH) &> /dev/null
#########
# PRINT #
#########
print: print_tools print_bootstrap
print_tools:
@$(ECHO) "HOME = $(HOME)"
@$(ECHO) "INCLUDES = $(INCLUDES)"
@$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
@$(ECHO) "ECHO = $(ECHO)"
@$(ECHO) "RM = $(RM)"
@$(ECHO) "MKDIR = $(MKDIR)"
@$(ECHO) "CP = $(CP)"
@$(ECHO)
print_bootstrap:
@$(ECHO) "PWD = $(PWD)"
@$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
@$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
@$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
@$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
@$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
@$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
@$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
@$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
@$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
@$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
@$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
@$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
@$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
@$(ECHO) "SRC = $(SRC)"
@$(ECHO) "OBJ = $(OBJ)"
@$(ECHO) "OLD = $(OLD)"
@$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
@$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
@$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
@$(ECHO)
// Copyright (C) 2007,2008,2009,2010 EPITA LRDE
//
// This file is part of Olena.
//
// Olena is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation, version 2 of the License.
//
// Olena is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Olena. If not, see <http://www.gnu.org/licenses/>.
//
// As a special exception, you may use this file as part of a free
// software project without restriction. Specifically, if other files
// instantiate templates or use macros or inline functions from this
// file, or you compile this file and link it with other files to produce
// an executable, this file does not by itself cause the resulting
// executable to be covered by the GNU General Public License. This
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
/// \file
///
/// \brief This is a demonstrator for kmean1d.
///
/// The demonstrator produces five kind of results. The file
/// "color.ppm" allow us to localize the different center in the
/// image. There is an equivalent file "label.pgm" that's do the same
/// thing but inplace of a specific color, it gives the label of each
/// center. It's quit easy with xv, to transform the label image in
/// the color one. The file "mean.pgm" replaces each label by the mean
/// of the points that contributate to their center. It is a kind of
/// abstraction of the reality of the image, of its complexity. In
/// file "variance_cnv.sh" abscissa axis stands for the convergence
/// evolution and the ordinate axis for each runs. The "mean_cnv.sh"