From e102e63303e8c91fcb2d65133128b650334d18e4 Mon Sep 17 00:00:00 2001 From: Constantin Fischer Date: Wed, 10 Jun 2015 13:34:14 +0200 Subject: [PATCH 1/6] copied files for personal changes --- .../constantin/Makefile.template | 18 + .../constantin/{ => exercise}/input | 0 .../constantin/{ => exercise}/orbit | Bin .../constantin/{ => exercise}/orbit.cc | 0 .../constantin/{ => exercise}/output | 0 coxeter_group_orbits/constantin/generators.h | 378 ++++++++++++++++++ coxeter_group_orbits/constantin/orbit.h | 37 ++ .../constantin/stl_wrappers.h | 83 ++++ .../constantin/test_orbits.cc | 98 +++++ coxeter_group_orbits/constantin/types.h | 55 +++ 10 files changed, 669 insertions(+) create mode 100644 coxeter_group_orbits/constantin/Makefile.template rename coxeter_group_orbits/constantin/{ => exercise}/input (100%) rename coxeter_group_orbits/constantin/{ => exercise}/orbit (100%) rename coxeter_group_orbits/constantin/{ => exercise}/orbit.cc (100%) rename coxeter_group_orbits/constantin/{ => exercise}/output (100%) create mode 100644 coxeter_group_orbits/constantin/generators.h create mode 100644 coxeter_group_orbits/constantin/orbit.h create mode 100644 coxeter_group_orbits/constantin/stl_wrappers.h create mode 100644 coxeter_group_orbits/constantin/test_orbits.cc create mode 100644 coxeter_group_orbits/constantin/types.h diff --git a/coxeter_group_orbits/constantin/Makefile.template b/coxeter_group_orbits/constantin/Makefile.template new file mode 100644 index 0000000..8437f04 --- /dev/null +++ b/coxeter_group_orbits/constantin/Makefile.template @@ -0,0 +1,18 @@ +SHELL = /bin/sh + +.SUFFIXES: +.SUFFIXES: .cc .o + +BOOSTDIR = /the/path/to/your/boost # was: /home/julian/software/boost_1_57_0 + +INCLUDEDIR = -I. -I$(BOOSTDIR) +LIBDIR = -L$(BOOSTDIR)/lib +LIBS = -lboost_unit_test_framework +CFLAGS = -Wall -Wextra -Wpedantic -std=c++1y -O3 -g +CC = g++ + +test_orbits: test_orbits.o + $(CC) $(LIBDIR) $(CFLAGS) $< $(LIBS) -o $@ + +test_orbits.o: test_orbits.cc orbit.h + $(CC) $(INCLUDEDIR) $(CFLAGS) -c $< -o $@ diff --git a/coxeter_group_orbits/constantin/input b/coxeter_group_orbits/constantin/exercise/input similarity index 100% rename from coxeter_group_orbits/constantin/input rename to coxeter_group_orbits/constantin/exercise/input diff --git a/coxeter_group_orbits/constantin/orbit b/coxeter_group_orbits/constantin/exercise/orbit similarity index 100% rename from coxeter_group_orbits/constantin/orbit rename to coxeter_group_orbits/constantin/exercise/orbit diff --git a/coxeter_group_orbits/constantin/orbit.cc b/coxeter_group_orbits/constantin/exercise/orbit.cc similarity index 100% rename from coxeter_group_orbits/constantin/orbit.cc rename to coxeter_group_orbits/constantin/exercise/orbit.cc diff --git a/coxeter_group_orbits/constantin/output b/coxeter_group_orbits/constantin/exercise/output similarity index 100% rename from coxeter_group_orbits/constantin/output rename to coxeter_group_orbits/constantin/exercise/output diff --git a/coxeter_group_orbits/constantin/generators.h b/coxeter_group_orbits/constantin/generators.h new file mode 100644 index 0000000..f6a45d2 --- /dev/null +++ b/coxeter_group_orbits/constantin/generators.h @@ -0,0 +1,378 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +#ifndef __GENERATORS_H_ +#define __GENERATORS_H_ + +#include +#include +#include +#include "types.h" + +GeneratorList simple_roots_type_A (const int n) +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 ... 0 0 + 0 1 -1 0 ... 0 0 + ... + 0 0 0 0 ... 1 -1 + In particular, they lie in the plane (sum of coordinates = 0) + */ + GeneratorList R(n, n+1); + for (int i=0; i n-1, + */ + VectorType v(n); + v[n-1] = 1; + GeneratorList G = simple_roots_type_A(n-1); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_C (const int n) +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 ... 0 0 + 0 1 -1 0 ... 0 0 + ... + 0 0 0 0 ... 1 -1 + 0 0 0 0 ... 0 2 + + The Dynkin diagram is: + + 0 ---- 1 ---- ... ---- n-2 <--(4)-- n-1, + */ + VectorType v(n); + v[n-1] = 2; + GeneratorList G = simple_roots_type_A(n-1); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_D (const int n) +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 ... 0 0 + 0 1 -1 0 ... 0 0 + ... + 0 0 0 0 ... 1 -1 + 0 0 0 0 ... 1 1 + The indexing of the Dynkin diagram is + + n-2 + / + 0 - 1 - 2 - ... - n-3 + \ + n-1 + + */ + VectorType v(n); + v[n-2] = v[n-1] = 1; + GeneratorList G = simple_roots_type_A(n-1); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_E6() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 0 0 + 0 1 -1 0 0 0 + 0 0 1 -1 0 0 + 0 0 0 1 -1 0 + 0 0 0 1 1 0 +-1/2(1 1 1 1 1 -sqrt(3)) + + The indexing of the Dynkin diagram is + + + 3 + | + | + 0 ---- 1 ---- 2 ---- 4 ---- 5 + + */ + VectorType v(6); + for (int i=0; i<5; ++i) + v[i] = -0.5; + v[5] = 0.5 * sqrt(3); + GeneratorList G = simple_roots_type_D(5); + for (int i=0; i<5; ++i) + G[i].push_back(0); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_E7() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 0 0 0 + 0 1 -1 0 0 0 0 + 0 0 1 -1 0 0 0 + 0 0 0 1 -1 0 0 + 0 0 0 0 1 -1 0 + 0 0 0 0 1 1 0 +-1/2(1 1 1 1 1 1 -sqrt(2)) + + The indexing of the Dynkin diagram is + + + 4 + | + | + 0 ---- 1 ---- 2 ---- 3 ---- 5 ---- 6 + + */ + VectorType v(7); + for (int i=0; i<6; ++i) + v[i] = -0.5; + v[6] = 0.5 * sqrt(2); + GeneratorList G = simple_roots_type_D(6); + for (int i=0; i<6; ++i) + G[i].push_back(0); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_E8() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 0 0 0 0 + 0 1 -1 0 0 0 0 0 + ... + 0 0 0 0 0 1 -1 0 + 0 0 0 0 0 1 1 0 +-1/2(1 1 1 1 1 1 1 1) + + These are the coordinates in the even coordinate system. + The indexing of the Dynkin diagram is + + + 5 + | + | + 0 ---- 1 ---- 2 ---- 3 ---- 4 ---- 6 ---- 7 + + */ + VectorType v(8); + for (int i=0; i<8; ++i) + v[i] = -0.5; + GeneratorList G = simple_roots_type_D(7); + for (int i=0; i<7; ++i) + G[i].push_back(0); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_F4() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 + 0 1 -1 0 + 0 0 1 0 + -1/2 -1/2 -1/2 -1/2 + + The Dynkin diagram is: + + 0 ---- 1 --(4)--> 2 ---- 3 + */ + GeneratorList R(4,4); + R(0,0) = R(1,1) = R(2,2) = 1; + R(0,1) = R(1,2) = -1; + R(3,0) = R(3,1) = R(3,2) = R(3,3) = -0.5; + return R; +} + +GeneratorList simple_roots_type_G2() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 + -1 2 -1 + + Notice that each row sums to zero. + + The Dynkin diagram is: + + 0 <--(6)-- 1 + */ + GeneratorList R(2,3); + R(0,0) = 1; + R(0,1) = R(1,0) = R(1,2) = -1; + R(1,1) = 2; + return R; +} + +GeneratorList simple_roots_type_H3() +{ + const NumberType tau(0.5 + 0.5 * sqrt(5)); // golden ratio + + /* + For H_3, the Dynkin diagram is + + 0 --(5)-- 1 ---- 2, + + and the simple root vectors are, + + 2 0 0 + a b -1 + 0 0 2 + + with a=-tau and b=1/tau. Notice they all have length 2. + + */ + + GeneratorList R(3,3); + R(0,0) = R(2,2) = 2; + R(1,0) = -tau; R(1,1) = tau - 1; R(1,2) = -1; + return R; +} + +GeneratorList simple_roots_type_H4() +{ + const NumberType tau(0.5 + 0.5 * sqrt(5)); // golden ratio + + /* + For H_4, the Dynkin diagram is + + 0 --(5)-- 1 ---- 2 ---- 3, + + and the simple root vectors are, according to + [John H. Stembridge, A construction of H_4 without miracles, + Discrete Comput. Geom. 22, No.3, 425-427 (1999)], + + a b b b + -1 1 0 0 + 0 -1 1 0 + 0 0 -1 1 + + with a=(1+tau)/2 and b=(1-tau)/2, so that the length of each root is sqrt{2}. + + */ + GeneratorList R(4, 4); + + R(0,0) = (1+tau) * 0.5; + R(0,1) = R(0,2) = R(0,3) = (1-tau) * 0.5; + + for (int i=0; i<3; ++i) { + R(i+1, i) = -1; + R(i+1, i+1) = 1; + } + return R; +} + + + +GeneratorList simple_roots(char type, int dim) +{ + switch(type) { + case 'a': + case 'A': + return simple_roots_type_A(dim); + + case 'b': + case 'B': + return simple_roots_type_B(dim); + + case 'c': + case 'C': + return simple_roots_type_C(dim); + + case 'd': + case 'D': + return simple_roots_type_D(dim); + + case 'e': + case 'E': + switch(dim) { + case 6: + return simple_roots_type_E6(); + case 7: + return simple_roots_type_E7(); + case 8: + return simple_roots_type_E8(); + default: + throw InvalidGroupException(); + } + + case 'f': + case 'F': + switch(dim) { + case 4: + return simple_roots_type_F4(); + default: + throw InvalidGroupException(); + } + + case 'g': + case 'G': + switch(dim) { + case 2: + return simple_roots_type_G2(); + default: + throw InvalidGroupException(); + } + + case 'h': + case 'H': + switch(dim) { + case 3: + return simple_roots_type_H3(); + case 4: + return simple_roots_type_H4(); + default: + throw InvalidGroupException(); + } + + default: + throw NotImplementedException(); + } +} + +#endif // __GENERATORS_H_ + +// Local Variables: +// mode:C++ +// c-basic-offset:3 +// indent-tabs-mode:nil +// End: diff --git a/coxeter_group_orbits/constantin/orbit.h b/coxeter_group_orbits/constantin/orbit.h new file mode 100644 index 0000000..3396c11 --- /dev/null +++ b/coxeter_group_orbits/constantin/orbit.h @@ -0,0 +1,37 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +#ifndef __ORBIT_H_ +#define __ORBIT_H_ + +#include +#include "types.h" +#include "generators.h" + + +Orbit orbit(const GeneratorList& generators, const VectorType& v) +{ + return std::set(); +} + + +#endif // __ORBIT_H_ + +// Local Variables: +// mode:C++ +// c-basic-offset:3 +// indent-tabs-mode:nil +// End: diff --git a/coxeter_group_orbits/constantin/stl_wrappers.h b/coxeter_group_orbits/constantin/stl_wrappers.h new file mode 100644 index 0000000..581011f --- /dev/null +++ b/coxeter_group_orbits/constantin/stl_wrappers.h @@ -0,0 +1,83 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +//#ifndef __STL_WRAPPERS_H__ +//#define __STL_WRAPPERS_H__ + +#include +#include +#include +#include + + +template +inline std::ostream& +operator<<(std::ostream& wrapped, const std::array& item) +{ + wrapped << '{'; + bool first = true; + for (auto const& element : item) { + wrapped << (!first ? "," : "") << element; + first = false; + } + return wrapped << '}'; +} + + +// teach Boost.Test how to print std::vector +template +inline std::ostream& +operator<<(std::ostream& wrapped, std::vector const& item) +{ + wrapped << '{'; + bool first = true; + for (auto const& element : item) { + wrapped << (!first ? "," : "") << element; + first = false; + } + return wrapped << '}'; +} + +template +inline std::ostream& +operator<<(std::ostream& wrapped, std::pair const& item) +{ + return wrapped << '<' << item.first << ',' << item.second << '>'; +} + +template +inline std::ostream& +operator<<(std::ostream& wrapped, std::map const& item) +{ + wrapped << '{'; + bool first = true; + for (auto const& element : item) { + wrapped << (!first ? "," : "") << element; + first = false; + } + return wrapped << '}'; +} + + +//#endif // __STL_WRAPPERS_H__ + + +// Local Variables: +// mode:C++ +// c-basic-offset:3 +// indent-tabs-mode:nil +// End: + diff --git a/coxeter_group_orbits/constantin/test_orbits.cc b/coxeter_group_orbits/constantin/test_orbits.cc new file mode 100644 index 0000000..d061d0c --- /dev/null +++ b/coxeter_group_orbits/constantin/test_orbits.cc @@ -0,0 +1,98 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +#define BOOST_TEST_MODULE orbits +#include + +#include "orbit.h" +#include "stl_wrappers.h" + +BOOST_AUTO_TEST_CASE( generators ) +{ + std::ostringstream oss; + oss << simple_roots_type_A(4) << std::endl + << simple_roots_type_B(4) << std::endl + << simple_roots_type_C(4) << std::endl + << simple_roots_type_D(4) << std::endl + << simple_roots_type_E6() << std::endl + << simple_roots_type_E7() << std::endl + << simple_roots_type_E8() << std::endl + << simple_roots_type_F4() << std::endl + << simple_roots_type_H3() << std::endl + << simple_roots_type_H4() << std::endl; + + BOOST_CHECK_EQUAL(oss.str(), + "{{1,-1,0,0,0},{0,1,-1,0,0},{0,0,1,-1,0},{0,0,0,1,-1}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,-1},{0,0,0,1}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,-1},{0,0,0,2}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,-1},{0,0,1,1}}\n" + "{{1,-1,0,0,0,0},{0,1,-1,0,0,0},{0,0,1,-1,0,0},{0,0,0,1,-1,0},{0,0,0,1,1,0},{-0.5,-0.5,-0.5,-0.5,-0.5,0.866025}}\n" + "{{1,-1,0,0,0,0,0},{0,1,-1,0,0,0,0},{0,0,1,-1,0,0,0},{0,0,0,1,-1,0,0},{0,0,0,0,1,-1,0},{0,0,0,0,1,1,0},{-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0.707107}}\n" + "{{1,-1,0,0,0,0,0,0},{0,1,-1,0,0,0,0,0},{0,0,1,-1,0,0,0,0},{0,0,0,1,-1,0,0,0},{0,0,0,0,1,-1,0,0},{0,0,0,0,0,1,-1,0},{0,0,0,0,0,1,1,0},{-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,0},{-0.5,-0.5,-0.5,-0.5}}\n" + "{{2,0,0},{-1.61803,0.618034,-1},{0,0,2}}\n" + "{{1.30902,-0.309017,-0.309017,-0.309017},{-1,1,0,0},{0,-1,1,0},{0,0,-1,1}}\n" + ); +} + +struct b3_fixture { + b3_fixture() + : generators(simple_roots('B', 3)) + {} + GeneratorList generators; +}; + +BOOST_FIXTURE_TEST_CASE( b3_orbit_012, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 2, 3}).size(), (size_t) 48); +} + +BOOST_FIXTURE_TEST_CASE( b3_orbit_12, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 1, 3}).size(), (size_t) 24); +} + +BOOST_FIXTURE_TEST_CASE( b3_orbit_02, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 2, 2}).size(), (size_t) 24); +} + +BOOST_FIXTURE_TEST_CASE( b3_orbit_01, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 2, 0}).size(), (size_t) 24); +} + +BOOST_FIXTURE_TEST_CASE( b3_orbit_0, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 0, 0}).size(), (size_t) 6); +} + +BOOST_FIXTURE_TEST_CASE( b3_orbit_1, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 1, 0}).size(), (size_t) 12); +} + +BOOST_FIXTURE_TEST_CASE( b3_orbit_2, b3_fixture ) +{ + BOOST_CHECK_EQUAL(orbit(generators, {1, 1, 1}).size(), (size_t) 8); +} + + +// Local Variables: +// mode:C++ +// c-basic-offset:3 +// indent-tabs-mode:nil +// End: diff --git a/coxeter_group_orbits/constantin/types.h b/coxeter_group_orbits/constantin/types.h new file mode 100644 index 0000000..665360a --- /dev/null +++ b/coxeter_group_orbits/constantin/types.h @@ -0,0 +1,55 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +#ifndef __TYPES_H_ +#define __TYPES_H_ + +#include +#include + +class NotImplementedException : public std::exception {}; +class InvalidGroupException : public std::exception {}; + +typedef long double NumberType; // this might work +typedef std::vector VectorType; +typedef std::set Orbit; + +class GeneratorList : public std::vector { +public: + GeneratorList(int r, int c) + : std::vector(r) + { + for (int i=0; i Date: Tue, 23 Jun 2015 14:01:22 +0200 Subject: [PATCH 2/6] Input precessing and orbit calculation added --- coxeter_group_orbits/ash/generators.h | 378 ++++++++++++++++++ coxeter_group_orbits/ash/orbit.h | 72 +++- coxeter_group_orbits/ash/stl_wrappers.h | 83 ++++ coxeter_group_orbits/ash/test_orbits.cc | 29 ++ coxeter_group_orbits/ash/types.h | 88 ++++ .../constantin/Makefile.template | 18 - coxeter_group_orbits/constantin/calc_orbit | Bin 0 -> 42597 bytes coxeter_group_orbits/constantin/calc_orbit.cc | 111 +++++ .../constantin/exercise/orbit.cc | 1 - coxeter_group_orbits/constantin/generators.h | 1 + coxeter_group_orbits/constantin/input | 2 + coxeter_group_orbits/constantin/orbit.h | 107 ++++- coxeter_group_orbits/constantin/output | 0 coxeter_group_orbits/constantin/types.h | 4 +- 14 files changed, 853 insertions(+), 41 deletions(-) create mode 100644 coxeter_group_orbits/ash/generators.h create mode 100644 coxeter_group_orbits/ash/stl_wrappers.h create mode 100644 coxeter_group_orbits/ash/types.h delete mode 100644 coxeter_group_orbits/constantin/Makefile.template create mode 100755 coxeter_group_orbits/constantin/calc_orbit create mode 100644 coxeter_group_orbits/constantin/calc_orbit.cc create mode 100644 coxeter_group_orbits/constantin/input create mode 100644 coxeter_group_orbits/constantin/output diff --git a/coxeter_group_orbits/ash/generators.h b/coxeter_group_orbits/ash/generators.h new file mode 100644 index 0000000..f6a45d2 --- /dev/null +++ b/coxeter_group_orbits/ash/generators.h @@ -0,0 +1,378 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +#ifndef __GENERATORS_H_ +#define __GENERATORS_H_ + +#include +#include +#include +#include "types.h" + +GeneratorList simple_roots_type_A (const int n) +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 ... 0 0 + 0 1 -1 0 ... 0 0 + ... + 0 0 0 0 ... 1 -1 + In particular, they lie in the plane (sum of coordinates = 0) + */ + GeneratorList R(n, n+1); + for (int i=0; i n-1, + */ + VectorType v(n); + v[n-1] = 1; + GeneratorList G = simple_roots_type_A(n-1); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_C (const int n) +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 ... 0 0 + 0 1 -1 0 ... 0 0 + ... + 0 0 0 0 ... 1 -1 + 0 0 0 0 ... 0 2 + + The Dynkin diagram is: + + 0 ---- 1 ---- ... ---- n-2 <--(4)-- n-1, + */ + VectorType v(n); + v[n-1] = 2; + GeneratorList G = simple_roots_type_A(n-1); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_D (const int n) +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 ... 0 0 + 0 1 -1 0 ... 0 0 + ... + 0 0 0 0 ... 1 -1 + 0 0 0 0 ... 1 1 + The indexing of the Dynkin diagram is + + n-2 + / + 0 - 1 - 2 - ... - n-3 + \ + n-1 + + */ + VectorType v(n); + v[n-2] = v[n-1] = 1; + GeneratorList G = simple_roots_type_A(n-1); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_E6() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 0 0 + 0 1 -1 0 0 0 + 0 0 1 -1 0 0 + 0 0 0 1 -1 0 + 0 0 0 1 1 0 +-1/2(1 1 1 1 1 -sqrt(3)) + + The indexing of the Dynkin diagram is + + + 3 + | + | + 0 ---- 1 ---- 2 ---- 4 ---- 5 + + */ + VectorType v(6); + for (int i=0; i<5; ++i) + v[i] = -0.5; + v[5] = 0.5 * sqrt(3); + GeneratorList G = simple_roots_type_D(5); + for (int i=0; i<5; ++i) + G[i].push_back(0); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_E7() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 0 0 0 + 0 1 -1 0 0 0 0 + 0 0 1 -1 0 0 0 + 0 0 0 1 -1 0 0 + 0 0 0 0 1 -1 0 + 0 0 0 0 1 1 0 +-1/2(1 1 1 1 1 1 -sqrt(2)) + + The indexing of the Dynkin diagram is + + + 4 + | + | + 0 ---- 1 ---- 2 ---- 3 ---- 5 ---- 6 + + */ + VectorType v(7); + for (int i=0; i<6; ++i) + v[i] = -0.5; + v[6] = 0.5 * sqrt(2); + GeneratorList G = simple_roots_type_D(6); + for (int i=0; i<6; ++i) + G[i].push_back(0); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_E8() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 0 0 0 0 + 0 1 -1 0 0 0 0 0 + ... + 0 0 0 0 0 1 -1 0 + 0 0 0 0 0 1 1 0 +-1/2(1 1 1 1 1 1 1 1) + + These are the coordinates in the even coordinate system. + The indexing of the Dynkin diagram is + + + 5 + | + | + 0 ---- 1 ---- 2 ---- 3 ---- 4 ---- 6 ---- 7 + + */ + VectorType v(8); + for (int i=0; i<8; ++i) + v[i] = -0.5; + GeneratorList G = simple_roots_type_D(7); + for (int i=0; i<7; ++i) + G[i].push_back(0); + G.push_back(v); + return G; +} + +GeneratorList simple_roots_type_F4() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 0 + 0 1 -1 0 + 0 0 1 0 + -1/2 -1/2 -1/2 -1/2 + + The Dynkin diagram is: + + 0 ---- 1 --(4)--> 2 ---- 3 + */ + GeneratorList R(4,4); + R(0,0) = R(1,1) = R(2,2) = 1; + R(0,1) = R(1,2) = -1; + R(3,0) = R(3,1) = R(3,2) = R(3,3) = -0.5; + return R; +} + +GeneratorList simple_roots_type_G2() +{ + /* + Read rowwise, these simple root vectors are + 1 -1 0 + -1 2 -1 + + Notice that each row sums to zero. + + The Dynkin diagram is: + + 0 <--(6)-- 1 + */ + GeneratorList R(2,3); + R(0,0) = 1; + R(0,1) = R(1,0) = R(1,2) = -1; + R(1,1) = 2; + return R; +} + +GeneratorList simple_roots_type_H3() +{ + const NumberType tau(0.5 + 0.5 * sqrt(5)); // golden ratio + + /* + For H_3, the Dynkin diagram is + + 0 --(5)-- 1 ---- 2, + + and the simple root vectors are, + + 2 0 0 + a b -1 + 0 0 2 + + with a=-tau and b=1/tau. Notice they all have length 2. + + */ + + GeneratorList R(3,3); + R(0,0) = R(2,2) = 2; + R(1,0) = -tau; R(1,1) = tau - 1; R(1,2) = -1; + return R; +} + +GeneratorList simple_roots_type_H4() +{ + const NumberType tau(0.5 + 0.5 * sqrt(5)); // golden ratio + + /* + For H_4, the Dynkin diagram is + + 0 --(5)-- 1 ---- 2 ---- 3, + + and the simple root vectors are, according to + [John H. Stembridge, A construction of H_4 without miracles, + Discrete Comput. Geom. 22, No.3, 425-427 (1999)], + + a b b b + -1 1 0 0 + 0 -1 1 0 + 0 0 -1 1 + + with a=(1+tau)/2 and b=(1-tau)/2, so that the length of each root is sqrt{2}. + + */ + GeneratorList R(4, 4); + + R(0,0) = (1+tau) * 0.5; + R(0,1) = R(0,2) = R(0,3) = (1-tau) * 0.5; + + for (int i=0; i<3; ++i) { + R(i+1, i) = -1; + R(i+1, i+1) = 1; + } + return R; +} + + + +GeneratorList simple_roots(char type, int dim) +{ + switch(type) { + case 'a': + case 'A': + return simple_roots_type_A(dim); + + case 'b': + case 'B': + return simple_roots_type_B(dim); + + case 'c': + case 'C': + return simple_roots_type_C(dim); + + case 'd': + case 'D': + return simple_roots_type_D(dim); + + case 'e': + case 'E': + switch(dim) { + case 6: + return simple_roots_type_E6(); + case 7: + return simple_roots_type_E7(); + case 8: + return simple_roots_type_E8(); + default: + throw InvalidGroupException(); + } + + case 'f': + case 'F': + switch(dim) { + case 4: + return simple_roots_type_F4(); + default: + throw InvalidGroupException(); + } + + case 'g': + case 'G': + switch(dim) { + case 2: + return simple_roots_type_G2(); + default: + throw InvalidGroupException(); + } + + case 'h': + case 'H': + switch(dim) { + case 3: + return simple_roots_type_H3(); + case 4: + return simple_roots_type_H4(); + default: + throw InvalidGroupException(); + } + + default: + throw NotImplementedException(); + } +} + +#endif // __GENERATORS_H_ + +// Local Variables: +// mode:C++ +// c-basic-offset:3 +// indent-tabs-mode:nil +// End: diff --git a/coxeter_group_orbits/ash/orbit.h b/coxeter_group_orbits/ash/orbit.h index 145b894..a5a93f0 100644 --- a/coxeter_group_orbits/ash/orbit.h +++ b/coxeter_group_orbits/ash/orbit.h @@ -17,33 +17,67 @@ #ifndef __ORBIT_H_ #define __ORBIT_H_ +#include #include +#include #include +#include +#include "types.h" +#include "generators.h" -class NotImplementedException : public std::exception {}; -typedef int NumberType; // this probably isn't going to work -typedef std::vector VectorType; -typedef std::vector GeneratorList; -typedef std::set Orbit; + NumberType scalarProduct(const VectorType& x, const VectorType& y) + { + NumberType sca = 0.0; -GeneratorList simple_roots(char type, int dim) -{ - switch(type) { - case 'b': - case 'B': - if (dim != 3) throw new NotImplementedException(); - return {{1,-1,0},{0,1,-1},{0,0,1}}; + return std::inner_product(x.begin(), x.end(), y.begin(), sca); + } + + VectorType scalarMultiplication(const VectorType& p, const NumberType a) + { + VectorType tmp (p); + for (VectorType::size_type i = 0; i != tmp.size(); i++){ + tmp[i] *= a; + } + return tmp; + } + + VectorType vectorSubtraction(const VectorType& p, const VectorType& n) + { + VectorType tmp (p); + for (VectorType::size_type i = 0; i != n.size(); i++){ + tmp[i] -= n[i]; + } + return tmp; + } - default: - throw new NotImplementedException(); + VectorType reflection(const VectorType& p, const VectorType& n) + { + VectorType p_ref = vectorSubtraction(p, scalarMultiplication(n, 2 * (scalarProduct(p,n) / scalarProduct(n,n)))); + + return p_ref; } -} -Orbit orbit(const GeneratorList& generators, const VectorType& v) -{ - return std::set(); -} + + Orbit orbitConstruction(const GeneratorList& generators, const VectorType& v, Orbit& solution) + { + VectorType ref; + + for(VectorType::size_type i = 0; i != generators.size(); i++){ + ref = reflection(v,generators[i]); + if(solution.find(ref) == solution.end()){ + solution.insert(ref); + orbitConstruction(generators, ref, solution); + } + } + return solution; + } + + Orbit orbit(const GeneratorList& generators, const VectorType& v) + { + Orbit wholeOrbit; + return orbitConstruction(generators, v, wholeOrbit); + } #endif // __ORBIT_H_ diff --git a/coxeter_group_orbits/ash/stl_wrappers.h b/coxeter_group_orbits/ash/stl_wrappers.h new file mode 100644 index 0000000..581011f --- /dev/null +++ b/coxeter_group_orbits/ash/stl_wrappers.h @@ -0,0 +1,83 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +//#ifndef __STL_WRAPPERS_H__ +//#define __STL_WRAPPERS_H__ + +#include +#include +#include +#include + + +template +inline std::ostream& +operator<<(std::ostream& wrapped, const std::array& item) +{ + wrapped << '{'; + bool first = true; + for (auto const& element : item) { + wrapped << (!first ? "," : "") << element; + first = false; + } + return wrapped << '}'; +} + + +// teach Boost.Test how to print std::vector +template +inline std::ostream& +operator<<(std::ostream& wrapped, std::vector const& item) +{ + wrapped << '{'; + bool first = true; + for (auto const& element : item) { + wrapped << (!first ? "," : "") << element; + first = false; + } + return wrapped << '}'; +} + +template +inline std::ostream& +operator<<(std::ostream& wrapped, std::pair const& item) +{ + return wrapped << '<' << item.first << ',' << item.second << '>'; +} + +template +inline std::ostream& +operator<<(std::ostream& wrapped, std::map const& item) +{ + wrapped << '{'; + bool first = true; + for (auto const& element : item) { + wrapped << (!first ? "," : "") << element; + first = false; + } + return wrapped << '}'; +} + + +//#endif // __STL_WRAPPERS_H__ + + +// Local Variables: +// mode:C++ +// c-basic-offset:3 +// indent-tabs-mode:nil +// End: + diff --git a/coxeter_group_orbits/ash/test_orbits.cc b/coxeter_group_orbits/ash/test_orbits.cc index 1e6e1a9..d061d0c 100644 --- a/coxeter_group_orbits/ash/test_orbits.cc +++ b/coxeter_group_orbits/ash/test_orbits.cc @@ -18,6 +18,35 @@ #include #include "orbit.h" +#include "stl_wrappers.h" + +BOOST_AUTO_TEST_CASE( generators ) +{ + std::ostringstream oss; + oss << simple_roots_type_A(4) << std::endl + << simple_roots_type_B(4) << std::endl + << simple_roots_type_C(4) << std::endl + << simple_roots_type_D(4) << std::endl + << simple_roots_type_E6() << std::endl + << simple_roots_type_E7() << std::endl + << simple_roots_type_E8() << std::endl + << simple_roots_type_F4() << std::endl + << simple_roots_type_H3() << std::endl + << simple_roots_type_H4() << std::endl; + + BOOST_CHECK_EQUAL(oss.str(), + "{{1,-1,0,0,0},{0,1,-1,0,0},{0,0,1,-1,0},{0,0,0,1,-1}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,-1},{0,0,0,1}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,-1},{0,0,0,2}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,-1},{0,0,1,1}}\n" + "{{1,-1,0,0,0,0},{0,1,-1,0,0,0},{0,0,1,-1,0,0},{0,0,0,1,-1,0},{0,0,0,1,1,0},{-0.5,-0.5,-0.5,-0.5,-0.5,0.866025}}\n" + "{{1,-1,0,0,0,0,0},{0,1,-1,0,0,0,0},{0,0,1,-1,0,0,0},{0,0,0,1,-1,0,0},{0,0,0,0,1,-1,0},{0,0,0,0,1,1,0},{-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0.707107}}\n" + "{{1,-1,0,0,0,0,0,0},{0,1,-1,0,0,0,0,0},{0,0,1,-1,0,0,0,0},{0,0,0,1,-1,0,0,0},{0,0,0,0,1,-1,0,0},{0,0,0,0,0,1,-1,0},{0,0,0,0,0,1,1,0},{-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5}}\n" + "{{1,-1,0,0},{0,1,-1,0},{0,0,1,0},{-0.5,-0.5,-0.5,-0.5}}\n" + "{{2,0,0},{-1.61803,0.618034,-1},{0,0,2}}\n" + "{{1.30902,-0.309017,-0.309017,-0.309017},{-1,1,0,0},{0,-1,1,0},{0,0,-1,1}}\n" + ); +} struct b3_fixture { b3_fixture() diff --git a/coxeter_group_orbits/ash/types.h b/coxeter_group_orbits/ash/types.h new file mode 100644 index 0000000..d87d9ba --- /dev/null +++ b/coxeter_group_orbits/ash/types.h @@ -0,0 +1,88 @@ +/* Copyright (c) 2015 + Julian Pfeifle + julian.pfeifle@upc.edu + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + +#ifndef __TYPES_H_ +#define __TYPES_H_ + +#include +#include +#include +#include +#include + +class NotImplementedException : public std::exception {}; +class InvalidGroupException : public std::exception {}; + +typedef long double NumberType; // this might work + +class ImpreciseVector : public std::vector +{ +public: + /*using std::vector::vector; + /*using vector::push_back; + using vector::operator[]; + using vector::begin; + using vector::end; + using vector::size;*/ + ImpreciseVector() : std::vector() {}; + ImpreciseVector(int i) : std::vector(i) {}; + ImpreciseVector(const std::vector& v) : std::vector(v) {}; + ImpreciseVector(std::initializer_list v) : std::vector(v) {}; + + friend bool operator <(const ImpreciseVector& v1, const ImpreciseVector& v2 ) + { + float epsilon = 0.00001; + std::vector tmp(v1.size()); + + for (std::vector::size_type i = 0; i != tmp.size(); i++){ + tmp[i] = v1[i] - v2[i]; + } + + if((std::inner_product(tmp.begin(), tmp.end(), tmp.begin(), 0.0) / (std::inner_product(v1.begin(), v1.end(), v1.begin(), 0.0) * std::inner_product(v2.begin(), v2.end(), v2.begin(), 0.0))) < epsilon) + return false; + else + return static_cast>(v1) < static_cast>(v2); + } +}; + +typedef std::vector CoxeterVectorType; +typedef ImpreciseVector VectorType; //std::vector VectorType;// +typedef std::set Orbit; + +class GeneratorList : public std::vector { +public: + GeneratorList(int r, int c) : std::vector(r) + { + for (int i=0; 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 MZn<~v$!h8U0r%r7+W-In literal 0 HcmV?d00001 diff --git a/coxeter_group_orbits/constantin/calc_orbit.cc b/coxeter_group_orbits/constantin/calc_orbit.cc new file mode 100644 index 0000000..3535286 --- /dev/null +++ b/coxeter_group_orbits/constantin/calc_orbit.cc @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "orbit.h" +#include +//#include +//#include "stdlib.h" + +//determining the current RAM usage (from http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process) +#include "stdlib.h" +#include "stdio.h" +#include "string.h" + +int parseLine(char* line){ + int i = strlen(line); + while (*line < '0' || *line > '9') line++; + line[i-3] = '\0'; + i = atoi(line); + return i; + } + + + int getValue(){ //Note: this value is in KB! + FILE* file = fopen("/proc/self/status", "r"); + int result = -1; + char line[128]; + + + while (fgets(line, 128, file) != NULL){ + if (strncmp(line, "VmRSS:", 6) == 0){ + result = parseLine(line); + break; + } + } + fclose(file); + return result; + } + +int main(int argc, char *argv[]) +{ + std::ifstream iFile(argv[1]); + std::ofstream oFile(argv[2]); + std::string input = ""; + char type; + int dim; + VectorType point; + bool print_flag = false; + if (argc == 4) { + std::string flag(argv[3]); + print_flag = flag == "-p"; + } + + //read the input file + if (iFile.is_open()) { + //read the type and dimension + if (iFile.good()) { + std::getline(iFile, input); + std::stringstream ss(input); + if (ss.good()) { + char t; + if (ss >> t) { + type = t; + } + int d; + if (ss >> d) { + dim = d; + } + } + } + //read the input point + if (iFile.good()) { + std::getline(iFile, input); + std::stringstream ss(input); + long double coo = 0; + while (ss.good()) { + if (ss >> coo) { + point.push_back(coo); + } + } + } + } + +// try +// { + std::set orb = orbit(simple_roots(type,dim),point); + + //generate the output + if (oFile.is_open()) { + oFile << orb.size() << std::endl; + if (print_flag) { + for (auto p : orb) { + for (size_t i=0; i #include "types.h" + GeneratorList simple_roots_type_A (const int n) { /* diff --git a/coxeter_group_orbits/constantin/input b/coxeter_group_orbits/constantin/input new file mode 100644 index 0000000..f1db73e --- /dev/null +++ b/coxeter_group_orbits/constantin/input @@ -0,0 +1,2 @@ +B6 +1.4 0.2 4.3 4.4 17.5 4 diff --git a/coxeter_group_orbits/constantin/orbit.h b/coxeter_group_orbits/constantin/orbit.h index 3396c11..4c2f486 100644 --- a/coxeter_group_orbits/constantin/orbit.h +++ b/coxeter_group_orbits/constantin/orbit.h @@ -20,11 +20,114 @@ #include #include "types.h" #include "generators.h" +#include +#include +#include +#include +#include +#include +#include +#include +// //determining the current RAM usage (from http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process) +// #include "stdlib.h" +// #include "stdio.h" +// #include "string.h" +// +// int parseLine(char* line){ +// int i = strlen(line); +// while (*line < '0' || *line > '9') line++; +// line[i-3] = '\0'; +// i = atoi(line); +// return i; +// } +// +// +// int getValue(){ //Note: this value is in KB! +// FILE* file = fopen("/proc/self/status", "r"); +// int result = -1; +// char line[128]; +// +// +// while (fgets(line, 128, file) != NULL){ +// if (strncmp(line, "VmRSS:", 6) == 0){ +// result = parseLine(line); +// break; +// } +// } +// fclose(file); +// return result; +// } -Orbit orbit(const GeneratorList& generators, const VectorType& v) +// GeneratorList normalize_generators(const GeneratorList& generators) +// { +// GeneratorList newGens = generators; +// for (size_t i=0; i error_radius) { + return lhs < rhs; + } + } + return false; + } +}; + +std::set orbit(const GeneratorList& generators, const VectorType& v/*, const long double eps=0*/) //is it possible to make the comparator variable? { - return std::set(); +// const GeneratorList normGens = normalize_generators(generators); + + if (generators[0].size() != v.size()) { + throw DimensionMismatchException(); + } + + std::set orbit({v}); + std::set points1({v}), points2; + std::set *currPoints = &points1, *nextPoints = &points2; + + GeneratorList scaled_generators(generators.size(),generators[0].size()); + for (size_t i=0; i(),2/ip)); //type sensitive operation + } + + size_t wordlength = 0; + do { + ++wordlength; + for (auto iter=(*currPoints).begin(); iter!=(*currPoints).end(); iter = (*currPoints).erase(iter)) { + for (size_t i=0; i newPoint((*iter).size()); + NumberType weight = 0; + weight = std::inner_product((*iter).begin(), (*iter).end(), generators[i].begin(), weight); + for (size_t j=0; j<(*iter).size(); ++j) { + newPoint[j] = (*iter)[j] - weight*scaled_generators(i,j); + } + if (orbit.insert(newPoint).second) { + (*nextPoints).insert(newPoint); + } + } + } + std::swap(currPoints,nextPoints); +// std::cout << "iteration " << wordlength << " processed using " << getValue()/1000 << "mb of RAM" << std::endl; +// std::cout << orbit.size() << std::endl; + } while (!(*currPoints).empty()); + + return orbit; } diff --git a/coxeter_group_orbits/constantin/output b/coxeter_group_orbits/constantin/output new file mode 100644 index 0000000..e69de29 diff --git a/coxeter_group_orbits/constantin/types.h b/coxeter_group_orbits/constantin/types.h index 665360a..0e32045 100644 --- a/coxeter_group_orbits/constantin/types.h +++ b/coxeter_group_orbits/constantin/types.h @@ -22,10 +22,12 @@ class NotImplementedException : public std::exception {}; class InvalidGroupException : public std::exception {}; +class DimensionMismatchException : public std::exception {}; + typedef long double NumberType; // this might work typedef std::vector VectorType; -typedef std::set Orbit; +// typedef std::set Orbit; class GeneratorList : public std::vector { public: From e92272f0a1ca6a552a8fa9e09cfcffe2d917fc4f Mon Sep 17 00:00:00 2001 From: Constantin Fischer Date: Tue, 23 Jun 2015 14:47:58 +0200 Subject: [PATCH 3/6] added a document for the groups' results --- coxeter_group_orbits/Auswertung.ods | Bin 0 -> 18809 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 coxeter_group_orbits/Auswertung.ods diff --git a/coxeter_group_orbits/Auswertung.ods b/coxeter_group_orbits/Auswertung.ods new file mode 100644 index 0000000000000000000000000000000000000000..9f8c5ad4cfe9ec5dbd430a4af98a75965d6320fb GIT binary patch literal 18809 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 Date: Tue, 23 Jun 2015 18:31:53 +0200 Subject: [PATCH 4/6] removed the abs function in the comparator --- coxeter_group_orbits/constantin/calc_orbit | Bin 42597 -> 42597 bytes coxeter_group_orbits/constantin/orbit.h | 22 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/coxeter_group_orbits/constantin/calc_orbit b/coxeter_group_orbits/constantin/calc_orbit index ceece163492b389a612b63640c80188f1ae55909..43a59a3f47847a3c2578099502ade0822796aa6a 100755 GIT binary patch delta 2770 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 diff --git a/coxeter_group_orbits/constantin/orbit.h b/coxeter_group_orbits/constantin/orbit.h index 4c2f486..4ecd44c 100644 --- a/coxeter_group_orbits/constantin/orbit.h +++ b/coxeter_group_orbits/constantin/orbit.h @@ -75,11 +75,11 @@ struct Error_radius_comp { // const long double error_radius; - const long double error_radius = 0.0001; + const long double error_radius = 0.00001; // Error_radius_comp(/*long double eps*/); /*: error_radius(eps) {}*/ bool operator() (const VectorType& lhs, const VectorType& rhs) const { for (size_t i=0; i error_radius) { + if (lhs[i]-rhs[i] > error_radius || rhs[i]-lhs[i] > error_radius) { return lhs < rhs; } } @@ -106,9 +106,23 @@ std::set orbit(const GeneratorList& generators, c std::transform(generators[i].begin(), generators[i].end(), scaled_generators[i].begin(), std::bind1st(std::multiplies(),2/ip)); //type sensitive operation } - size_t wordlength = 0; +// for (size_t i=0; i [ "; +// for (size_t j=0; j newPoint((*iter).size()); From 1437bb3b689122c10f30a560ba5e29317617e9ec Mon Sep 17 00:00:00 2001 From: Constantin Fischer Date: Tue, 30 Jun 2015 11:37:06 +0200 Subject: [PATCH 5/6] Merged changes from master and correction of the orbit calculation together with some general improvements --- coxeter_group_orbits/constantin/calc_orbit | Bin 42597 -> 42344 bytes coxeter_group_orbits/constantin/calc_orbit.cc | 20 ++- .../constantin/exercise/orbit | Bin .../constantin/exercise/orbit.cc | 28 ++-- coxeter_group_orbits/constantin/orbit.h | 130 +++++------------- 5 files changed, 63 insertions(+), 115 deletions(-) mode change 100755 => 100644 coxeter_group_orbits/constantin/exercise/orbit diff --git a/coxeter_group_orbits/constantin/calc_orbit b/coxeter_group_orbits/constantin/calc_orbit index 43a59a3f47847a3c2578099502ade0822796aa6a..d6cfbc03d61942c2ec7b1b106e1ac328c67a21d6 100755 GIT binary patch delta 14082 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 H+<^Z9>gt&? diff --git a/coxeter_group_orbits/constantin/calc_orbit.cc b/coxeter_group_orbits/constantin/calc_orbit.cc index 3535286..aef5548 100644 --- a/coxeter_group_orbits/constantin/calc_orbit.cc +++ b/coxeter_group_orbits/constantin/calc_orbit.cc @@ -1,3 +1,19 @@ +/* Copyright (c) 2015 + Constantin Fischer + cfischer@mailbox.tu-berlin.de + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + #include #include #include @@ -85,8 +101,6 @@ int main(int argc, char *argv[]) } } -// try -// { std::set orb = orbit(simple_roots(type,dim),point); //generate the output @@ -104,8 +118,6 @@ int main(int argc, char *argv[]) std::cout << "orbit size = " << orb.size() << std::endl; std::cout << "RAM usage = " << getValue()/1000 << "mB" << std::endl; -// } -// catch(...) {} return 0; } \ No newline at end of file diff --git a/coxeter_group_orbits/constantin/exercise/orbit b/coxeter_group_orbits/constantin/exercise/orbit old mode 100755 new mode 100644 diff --git a/coxeter_group_orbits/constantin/exercise/orbit.cc b/coxeter_group_orbits/constantin/exercise/orbit.cc index cbf05f4..3f67849 100644 --- a/coxeter_group_orbits/constantin/exercise/orbit.cc +++ b/coxeter_group_orbits/constantin/exercise/orbit.cc @@ -1,3 +1,19 @@ +/* Copyright (c) 2015 + Constantin Fischer + cfischer@mailbox.tu-berlin.de + + This program 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; either version 3, or (at your option) any + later version: http://www.gnu.org/licenses/gpl.txt. + + This program 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. +-------------------------------------------------------------------------------- +*/ + #include #include #include @@ -6,8 +22,6 @@ #include #include #include -//#include -//#include "stdlib.h" int main() { @@ -62,10 +76,6 @@ int main() //normalize the normal vectors for (int i=0; i words(normals.size()-1); -// words.reserve(normals.size()-1); -// std::iota(words.begin(), words.end(),0); //generate the orbit (up to wordLength) std::set > orbit = {point}; @@ -110,9 +117,6 @@ int main() oFile << normals[i][j] << " "; } } -// for (int i=0; i #include -#include -#include -#include +# include #include -#include -#include - -// //determining the current RAM usage (from http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process) -// #include "stdlib.h" -// #include "stdio.h" -// #include "string.h" -// -// int parseLine(char* line){ -// int i = strlen(line); -// while (*line < '0' || *line > '9') line++; -// line[i-3] = '\0'; -// i = atoi(line); -// return i; -// } -// -// -// int getValue(){ //Note: this value is in KB! -// FILE* file = fopen("/proc/self/status", "r"); -// int result = -1; -// char line[128]; -// -// -// while (fgets(line, 128, file) != NULL){ -// if (strncmp(line, "VmRSS:", 6) == 0){ -// result = parseLine(line); -// break; -// } -// } -// fclose(file); -// return result; -// } - -// GeneratorList normalize_generators(const GeneratorList& generators) -// { -// GeneratorList newGens = generators; -// for (size_t i=0; i error_radius || rhs[i]-lhs[i] > error_radius) { - return lhs < rhs; + if (fabs(lhs[i]-rhs[i]) > error_radius) { + return lhs[i] < rhs[i]; } } + return false; } }; -std::set orbit(const GeneratorList& generators, const VectorType& v/*, const long double eps=0*/) //is it possible to make the comparator variable? -{ -// const GeneratorList normGens = normalize_generators(generators); - +std::set orbit(const GeneratorList& generators, const VectorType& v) +{ if (generators[0].size() != v.size()) { - throw DimensionMismatchException(); + throw DimensionMismatchException(); } - - std::set orbit({v}); - std::set points1({v}), points2; - std::set *currPoints = &points1, *nextPoints = &points2; + NumberType ip = 0; GeneratorList scaled_generators(generators.size(),generators[0].size()); for (size_t i=0; i(),2/ip)); //type sensitive operation + ip = 0; + ip = std::inner_product(generators[i].begin(),generators[i].end(),generators[i].begin(), ip); + std::transform(generators[i].begin(), generators[i].end(), scaled_generators[i].begin(), std::bind1st(std::multiplies(),2/ip)); //type sensitive operation } -// for (size_t i=0; i [ "; -// for (size_t j=0; j orbit({v}); + std::queue newPoints({v}); + VectorType mirrorPoint(v.size()); + NumberType weight = 0; do { -// ++wordlength; - for (auto iter=(*currPoints).begin(); iter!=(*currPoints).end(); iter = (*currPoints).erase(iter)) { - for (size_t i=0; i newPoint((*iter).size()); - NumberType weight = 0; - weight = std::inner_product((*iter).begin(), (*iter).end(), generators[i].begin(), weight); - for (size_t j=0; j<(*iter).size(); ++j) { - newPoint[j] = (*iter)[j] - weight*scaled_generators(i,j); + mirrorPoint = newPoints.front(); + newPoints.pop(); + for (size_t i=0; i Date: Wed, 8 Jul 2015 17:42:40 +0200 Subject: [PATCH 6/6] Added a note in the code expressing the problem with the inprecise calculations --- coxeter_group_orbits/Auswertung.ods | Bin 18809 -> 19195 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/coxeter_group_orbits/Auswertung.ods b/coxeter_group_orbits/Auswertung.ods index 9f8c5ad4cfe9ec5dbd430a4af98a75965d6320fb..29ea76ad18756ddec5d61820a3149ff2e0a88f3d 100644 GIT binary patch delta 5493 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 g4owmc(IA7zYO?>)H95h@%C|xP1LFN;IRF3v