From 9811b0a26b439931516f45950068c4101a45db57 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 19 May 2015 13:16:27 +0200
Subject: [PATCH] +aarbology binary

---
 aarbology2/makefile                           | 178 ++++++++++++++++++
 aarbology2/src/aarbology.cpp                  | 101 ++++++++++
 .../src/arbology/exact/ExactSubtreeMatch.cpp  |  20 ++
 .../src/arbology/exact/ExactSubtreeMatch.h    |   2 +
 examples2/tree/RankedTree.xml                 |  55 +++++-
 examples2/tree/RankedTree2.xml                | 103 ++++++++++
 makefile                                      |   1 +
 7 files changed, 459 insertions(+), 1 deletion(-)
 create mode 100644 aarbology2/makefile
 create mode 100644 aarbology2/src/aarbology.cpp
 create mode 100644 examples2/tree/RankedTree2.xml

diff --git a/aarbology2/makefile b/aarbology2/makefile
new file mode 100644
index 0000000000..86b9297bee
--- /dev/null
+++ b/aarbology2/makefile
@@ -0,0 +1,178 @@
+SHELL:=/bin/bash
+EXECUTABLE:=aarbology2
+
+define NEW_LINE
+
+
+endef
+
+export NEW_LINE
+
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
+
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
+
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
+
+all:
+	@echo "What to do master?"
+
+obj%/makefile: makefile
+	mkdir -p $(dir $@)
+	echo "\
+	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	SRCDIR:=$${NEW_LINE}\
+	DEPTH:=$${NEW_LINE}\
+	OBJECTS_BASE_DIR:=$${NEW_LINE}\
+	$${NEW_LINE}\
+	define NEW_LINE$${NEW_LINE}\
+	$${NEW_LINE}\
+	$${NEW_LINE}\
+	endef$${NEW_LINE}\
+	$${NEW_LINE}\
+	export NEW_LINE$${NEW_LINE}\
+	$${NEW_LINE}\
+	CXXFLAGS:= -std=c++11 \$$(CXX_OTHER_FLAGS) -c -Wall -pedantic -Wextra -Werror -fPIC -I/usr/include/libxml2/ -I../../\$$(DEPTH)alib2std/src -I../../\$$(DEPTH)alib2data/src/ -I../../\$$(DEPTH)alib2algo/src/ -I../../\$$(DEPTH)alib2elgo/src/$${NEW_LINE}\
+	$${NEW_LINE}\
+	SOURCES:= \$$(shell find ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR) -maxdepth 1 -type f -name \"*.cpp\")$${NEW_LINE}\
+	DEPENDENCIES:= \$$(patsubst ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d, \$$(SOURCES))$${NEW_LINE}\
+	OBJECTS:= \$$(patsubst %.d, %.o, \$$(DEPENDENCIES))$${NEW_LINE}\
+	SOURCES_DIRS:= \$$(shell find ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR) -maxdepth 1 -mindepth 1 -type d)$${NEW_LINE}\
+	OBJECTS_DIRS:= \$$(patsubst ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%, %/, \$$(SOURCES_DIRS))$${NEW_LINE}\
+	OBJECTS_DIRS_MAKEFILES:= \$$(patsubst %, %makefile, \$$(OBJECTS_DIRS))$${NEW_LINE}\
+	$${NEW_LINE}\
+	.PHONY: all$${NEW_LINE}\
+	.PRECIOUS: \$$(DEPENDECIES) \$$(OBJECTS_DIRS_MAKEFILES)$${NEW_LINE}\
+	$${NEW_LINE}\
+	all: \$$(OBJECTS_DIRS) \$$(OBJECTS)$${NEW_LINE}\
+	$${NEW_LINE}\
+	%.d: makefile$${NEW_LINE}\
+		@echo \"\\$${NEW_LINE}\
+		\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\") = \\$$\$$(shell (\\$$\$$(CXX) -M \\$$\$$(CXXFLAGS) \$$(patsubst ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) 2>/dev/null || echo \\\"\$$(patsubst ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) FORCE\\\") | sed \\\"s/.*://g;s/\\\\\\\\\\\\\\\\//g\\\")\$$\$${NEW_LINE}\\$${NEW_LINE}\
+		\$$(patsubst %.d,%.o, \$$@): \\$$\$$(\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\")) makefile\$$\$${NEW_LINE}\\$${NEW_LINE}\
+			\\$$\$$(CXX) \\$$\$$(CXXFLAGS) \\$$\$$< -o \$$(patsubst %.d,%.o, \$$@)\$$\$${NEW_LINE}\\$${NEW_LINE}\
+		\" > \$$@$${NEW_LINE}\
+	$${NEW_LINE}\
+	%/makefile: makefile$${NEW_LINE}\
+		mkdir -p \$$(dir \$$@)$${NEW_LINE}\
+		cp makefile \$$@$${NEW_LINE}\
+	$${NEW_LINE}\
+	%/: FORCE | %/makefile$${NEW_LINE}\
+		@accesstime=\`stat -c %Y \$$@\` && \\$${NEW_LINE}\
+		\$$(MAKE) -C \$$@ SRCDIR=\$$(SRCDIR)\$$(notdir \$$(patsubst %/, %, \$$@))/ DEPTH=\$$(DEPTH)../ OBJECTS_BASE_DIR=\$$(OBJECTS_BASE_DIR) SOURCES_BASE_DIR=\$$(SOURCES_BASE_DIR) CXX_OTHER_FLAGS=\"\$$(CXX_OTHER_FLAGS)\" && \\$${NEW_LINE}\
+		accesstime2=\`stat -c %Y \$$@\` && \\$${NEW_LINE}\
+		if [ "\$$\$$accesstime" -ne "\$$\$$accesstime2" ]; then \\$${NEW_LINE}\
+			touch .; \\$${NEW_LINE}\
+		fi$${NEW_LINE}\
+	$${NEW_LINE}\
+	FORCE:$${NEW_LINE}\
+	$${NEW_LINE}\
+	-include \$$(DEPENDENCIES)" > $@
+
+gcc-debug: build-gcc-debug
+
+llvm-debug: build-llvm-debug
+
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
+	$(RM) -r doc
+
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
+
+
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
+
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
+	mkdir -p $(dir $@)
+	clang++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
+
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
+
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
+
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
+
+
+
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
+
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
+
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
+
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
+
+
+
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
+
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
+
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
+
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
+
+
+
+FORCE:
+
+
+
+doc:
+	doxygen
+
diff --git a/aarbology2/src/aarbology.cpp b/aarbology2/src/aarbology.cpp
new file mode 100644
index 0000000000..60460031e0
--- /dev/null
+++ b/aarbology2/src/aarbology.cpp
@@ -0,0 +1,101 @@
+/*
+ * aarbology.cpp
+ *
+ *  Created on: 26. 3. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#include <tclap/CmdLine.h>
+#include <vector>
+
+#include <factory/XmlDataFactory.hpp>
+#include <exception/AlibException.h>
+#include <tree/Tree.h>
+#include <container/Container.h>
+
+#include <arbology/exact/ExactSubtreeMatch.h>
+
+int main(int argc, char* argv[]) {
+	try {
+		TCLAP::CmdLine cmd("Arbology algorithm access binary", ' ', "0.01");
+
+		std::vector<std::string> allowed;
+		allowed.push_back("exactSubtreeMatch");
+		TCLAP::ValuesConstraint<std::string> allowedVals( allowed );
+
+		TCLAP::ValueArg<std::string> algorithm(	"a",	"algorithm",	"Execute algorithm",		false,	"exactSubtreeMatch",	&allowedVals);
+		cmd.add(algorithm);
+
+		TCLAP::MultiArg<std::string> subject(	"s",	"subject",	"Subject tree from file",	false,	"file");
+		cmd.add( subject );
+
+		TCLAP::MultiArg<std::string> pattern(	"p",	"pattern",	"Pattern tree from file",	false,	"file");
+		cmd.add( pattern );
+
+		cmd.parse(argc,argv);
+
+		int needPattern = 0;
+		int needSubject = 0;
+		if( algorithm.getValue() == "exactSubtreeMatch") {
+			needPattern = needSubject = 1;
+		} else {
+		}
+
+		std::deque<std::deque<sax::Token>> subjectTokens;
+		if(subject.isSet()) {
+			for(const std::string& fileName : subject.getValue()) {
+				std::deque<sax::Token> tmp;
+				if(fileName == "-") {
+					sax::SaxParseInterface::parseStdin(tmp);
+				} else {
+					sax::SaxParseInterface::parseFile(fileName, tmp);
+				}
+				subjectTokens.emplace_back(std::move(tmp));
+			}
+		} else if(needSubject) {
+			std::deque<sax::Token> tmp;
+			sax::SaxParseInterface::parseStdin(tmp);
+			subjectTokens.emplace_back(std::move(tmp));
+		}
+
+		std::deque<std::deque<sax::Token>> patternTokens;
+		if(pattern.isSet()) {
+			for(const std::string& fileName : pattern.getValue()) {
+				std::deque<sax::Token> tmp;
+				if(fileName == "-") {
+					sax::SaxParseInterface::parseStdin(tmp);
+				} else {
+					sax::SaxParseInterface::parseFile(fileName, tmp);
+				}
+				patternTokens.emplace_back(std::move(tmp));
+			}
+		} else if(needPattern) {
+			std::deque<sax::Token> tmp;
+			sax::SaxParseInterface::parseStdin(tmp);
+			patternTokens.emplace_back(std::move(tmp));
+		}
+
+		if( algorithm.getValue() == "exactSubtreeMatch") {
+			tree::Tree subject = alib::XmlDataFactory::fromTokens<tree::Tree>(subjectTokens.front());
+			tree::Tree pattern = alib::XmlDataFactory::fromTokens<tree::Tree>(patternTokens.front());
+			std::set<unsigned> res = arbology::exact::ExactSubtreeMatch::match(subject, pattern);
+			alib::XmlDataFactory::toStdout(res);
+			return 0;
+		} else {
+			throw exception::AlibException( "Invalid algorithm" );
+			return 1;
+		}
+	} catch( const exception::AlibException & exception ) {
+		alib::XmlDataFactory::toStdout( exception );
+		return 1;
+	} catch(const TCLAP::ArgException& exception) {
+		std::cout << exception.error() << std::endl;
+		return 2;
+	} catch (const std::exception& exception) {
+		std::cerr << "Exception caught: " << exception.what() << std::endl;
+		return 3;
+	} catch(...) {
+		std::cerr << "Unknown exception caught." << std::endl;
+		return 127;
+	}
+}
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp
index 0870594266..fb89ade3de 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp
@@ -8,6 +8,7 @@
 #include "ExactSubtreeMatch.h"
 #include <exception/AlibException.h>
 #include <tree/ranked/RankedTree.h>
+#include <tree/ranked/PrefixRankedNotation.h>
 #include <tree/unranked/UnrankedTree.h>
 
 #include <deque>
@@ -71,6 +72,20 @@ std::set<unsigned> ExactSubtreeMatch::match(const tree::RankedTree& subject, con
 	return occ;
 }
 
+std::set<unsigned> ExactSubtreeMatch::match(const tree::PrefixRankedNotation& subject, const tree::PrefixRankedNotation& pattern) {
+	std::set<unsigned> occ;
+	for(unsigned i = 0; i <= subject.getContent().size() - pattern.getContent().size(); i++) {
+		unsigned j = 0;
+		for(; j < pattern.getContent().size(); j++) {
+			if(pattern.getContent()[j] != subject.getContent()[i+j]) break;
+		}
+
+		if( j == pattern.getContent().size() )
+			occ.insert(i);
+	}
+	return occ;
+}
+
 void ExactSubtreeMatch::Visit(void* data, const tree::UnrankedTree& subject, const tree::UnrankedTree& pattern) const {
 	std::set<unsigned> & res = *((std::set<unsigned>*) data);
 	res = this->match(subject, pattern);
@@ -81,6 +96,11 @@ void ExactSubtreeMatch::Visit(void* data, const tree::RankedTree& subject, const
 	res = this->match(subject, pattern);
 }
 
+void ExactSubtreeMatch::Visit(void* data, const tree::PrefixRankedNotation& subject, const tree::PrefixRankedNotation& pattern) const {
+	std::set<unsigned> & res = *((std::set<unsigned>*) data);
+	res = this->match(subject, pattern);
+}
+
 const ExactSubtreeMatch ExactSubtreeMatch::EXACT_SUBTREE_MATCH;
 
 } /* namespace exact */
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatch.h b/alib2algo/src/arbology/exact/ExactSubtreeMatch.h
index bbfd582ee8..de77fa513e 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatch.h
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatch.h
@@ -30,6 +30,7 @@ public:
 
 	static std::set<unsigned> match(const tree::UnrankedTree& subject, const tree::UnrankedTree& pattern);
 	static std::set<unsigned> match(const tree::RankedTree& subject, const tree::RankedTree& pattern);
+	static std::set<unsigned> match(const tree::PrefixRankedNotation& subject, const tree::PrefixRankedNotation& pattern);
 private:
 	static bool matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern);
 	static bool matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern);
@@ -39,6 +40,7 @@ private:
 
 	void Visit(void*, const tree::UnrankedTree& subject, const tree::UnrankedTree& pattern) const;
 	void Visit(void*, const tree::RankedTree& subject, const tree::RankedTree& pattern) const;
+	void Visit(void*, const tree::PrefixRankedNotation& subject, const tree::PrefixRankedNotation& pattern) const;
 
 	static const ExactSubtreeMatch EXACT_SUBTREE_MATCH;
 };
diff --git a/examples2/tree/RankedTree.xml b/examples2/tree/RankedTree.xml
index cfa71eadf9..bdf21190ff 100644
--- a/examples2/tree/RankedTree.xml
+++ b/examples2/tree/RankedTree.xml
@@ -1,2 +1,55 @@
 <?xml version="1.0"?>
-<RankedTree><rankedAlphabet><RankedSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel><Integer>2</Integer></RankedSymbol><RankedSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel><Integer>1</Integer></RankedSymbol><RankedSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel><Integer>0</Integer></RankedSymbol></rankedAlphabet><rankedNode><RankedSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel><Integer>2</Integer></RankedSymbol><rankedNode><RankedSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel><Integer>2</Integer></RankedSymbol><rankedNode><RankedSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel><Integer>2</Integer></RankedSymbol><rankedNode><RankedSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel><Integer>1</Integer></RankedSymbol><rankedNode><RankedSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel><Integer>2</Integer></RankedSymbol><rankedNode><RankedSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel><Integer>0</Integer></RankedSymbol></rankedNode><rankedNode><RankedSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel><Integer>0</Integer></RankedSymbol></rankedNode></rankedNode></rankedNode><rankedNode><RankedSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel><Integer>0</Integer></RankedSymbol></rankedNode></rankedNode><rankedNode><RankedSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel><Integer>0</Integer></RankedSymbol></rankedNode></rankedNode><rankedNode><RankedSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel><Integer>0</Integer></RankedSymbol></rankedNode></rankedNode></RankedTree>
+<RankedTree>
+  <rankedAlphabet>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>a</Character>
+      </PrimitiveLabel>
+      <Integer>2</Integer>
+    </RankedSymbol>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>b</Character>
+      </PrimitiveLabel>
+      <Integer>1</Integer>
+    </RankedSymbol>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>c</Character>
+      </PrimitiveLabel>
+      <Integer>0</Integer>
+    </RankedSymbol>
+  </rankedAlphabet>
+  <rankedNode>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>b</Character>
+      </PrimitiveLabel>
+      <Integer>1</Integer>
+    </RankedSymbol>
+    <rankedNode>
+      <RankedSymbol>
+        <PrimitiveLabel>
+          <Character>a</Character>
+        </PrimitiveLabel>
+        <Integer>2</Integer>
+      </RankedSymbol>
+      <rankedNode>
+        <RankedSymbol>
+          <PrimitiveLabel>
+            <Character>c</Character>
+          </PrimitiveLabel>
+          <Integer>0</Integer>
+        </RankedSymbol>
+      </rankedNode>
+      <rankedNode>
+        <RankedSymbol>
+          <PrimitiveLabel>
+            <Character>c</Character>
+          </PrimitiveLabel>
+          <Integer>0</Integer>
+        </RankedSymbol>
+      </rankedNode>
+    </rankedNode>
+  </rankedNode>
+</RankedTree>
diff --git a/examples2/tree/RankedTree2.xml b/examples2/tree/RankedTree2.xml
new file mode 100644
index 0000000000..24601d1d27
--- /dev/null
+++ b/examples2/tree/RankedTree2.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<RankedTree>
+  <rankedAlphabet>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>a</Character>
+      </PrimitiveLabel>
+      <Integer>2</Integer>
+    </RankedSymbol>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>b</Character>
+      </PrimitiveLabel>
+      <Integer>1</Integer>
+    </RankedSymbol>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>c</Character>
+      </PrimitiveLabel>
+      <Integer>0</Integer>
+    </RankedSymbol>
+  </rankedAlphabet>
+  <rankedNode>
+    <RankedSymbol>
+      <PrimitiveLabel>
+        <Character>a</Character>
+      </PrimitiveLabel>
+      <Integer>2</Integer>
+    </RankedSymbol>
+    <rankedNode>
+      <RankedSymbol>
+        <PrimitiveLabel>
+          <Character>a</Character>
+        </PrimitiveLabel>
+        <Integer>2</Integer>
+      </RankedSymbol>
+      <rankedNode>
+        <RankedSymbol>
+          <PrimitiveLabel>
+            <Character>a</Character>
+          </PrimitiveLabel>
+          <Integer>2</Integer>
+        </RankedSymbol>
+        <rankedNode>
+          <RankedSymbol>
+            <PrimitiveLabel>
+              <Character>b</Character>
+            </PrimitiveLabel>
+            <Integer>1</Integer>
+          </RankedSymbol>
+          <rankedNode>
+            <RankedSymbol>
+              <PrimitiveLabel>
+                <Character>a</Character>
+              </PrimitiveLabel>
+              <Integer>2</Integer>
+            </RankedSymbol>
+            <rankedNode>
+              <RankedSymbol>
+                <PrimitiveLabel>
+                  <Character>c</Character>
+                </PrimitiveLabel>
+                <Integer>0</Integer>
+              </RankedSymbol>
+            </rankedNode>
+            <rankedNode>
+              <RankedSymbol>
+                <PrimitiveLabel>
+                  <Character>c</Character>
+                </PrimitiveLabel>
+                <Integer>0</Integer>
+              </RankedSymbol>
+            </rankedNode>
+          </rankedNode>
+        </rankedNode>
+        <rankedNode>
+          <RankedSymbol>
+            <PrimitiveLabel>
+              <Character>c</Character>
+            </PrimitiveLabel>
+            <Integer>0</Integer>
+          </RankedSymbol>
+        </rankedNode>
+      </rankedNode>
+      <rankedNode>
+        <RankedSymbol>
+          <PrimitiveLabel>
+            <Character>c</Character>
+          </PrimitiveLabel>
+          <Integer>0</Integer>
+        </RankedSymbol>
+      </rankedNode>
+    </rankedNode>
+    <rankedNode>
+      <RankedSymbol>
+        <PrimitiveLabel>
+          <Character>c</Character>
+        </PrimitiveLabel>
+        <Integer>0</Integer>
+      </RankedSymbol>
+    </rankedNode>
+  </rankedNode>
+</RankedTree>
diff --git a/makefile b/makefile
index 41eae4c46e..c16f5a982b 100644
--- a/makefile
+++ b/makefile
@@ -8,6 +8,7 @@ CORE_LIB = alib2data
 ALGO_LIB = alib2algo
 ELGO_LIB = alib2elgo
 SUBDIRS_BINS = aecho2 \
+		aarbology2 \
 		aconversions2 \
 		aconvert2 \
 		acompaction2 \
-- 
GitLab