From 08beb34060ebbc05db9edb12392dcf616bfd4b22 Mon Sep 17 00:00:00 2001 From: Richard Roberts Date: Mon, 25 Oct 2010 21:16:20 +0000 Subject: [PATCH] Moved doc and wrap to experimental --- doc/LieGroups.lyx | 3233 ------------------------ doc/LieGroups.pdf | Bin 128770 -> 0 bytes doc/images/circular.pdf | Bin 62900 -> 0 bytes doc/images/circular.png | Bin 1493 -> 0 bytes doc/images/gtsam-structure.graffle | 1302 ---------- doc/images/gtsam-structure.pdf | Bin 29463 -> 0 bytes doc/images/n-steps.pdf | Bin 62899 -> 0 bytes doc/images/n-steps.png | Bin 1427 -> 0 bytes doc/macros.lyx | 294 --- doc/math.lyx | 2225 ---------------- doc/math.pdf | Bin 119284 -> 0 bytes gtsam-broken.h | 144 -- gtsam.h | 160 -- wrap/.cvsignore | 5 - wrap/Argument.cpp | 85 - wrap/Argument.h | 51 - wrap/Class.cpp | 85 - wrap/Class.h | 45 - wrap/Constructor.cpp | 100 - wrap/Constructor.h | 43 - wrap/Makefile.am | 41 - wrap/Method.cpp | 139 - wrap/Method.h | 46 - wrap/Module.cpp | 228 -- wrap/Module.h | 45 - wrap/expected/@Point2/Point2.m | 15 - wrap/expected/@Point2/dim.cpp | 10 - wrap/expected/@Point2/dim.m | 5 - wrap/expected/@Point2/x.cpp | 10 - wrap/expected/@Point2/x.m | 5 - wrap/expected/@Point2/y.cpp | 10 - wrap/expected/@Point2/y.m | 5 - wrap/expected/@Point3/Point3.m | 14 - wrap/expected/@Point3/norm.cpp | 10 - wrap/expected/@Point3/norm.m | 5 - wrap/expected/@Test/Test.m | 14 - wrap/expected/@Test/create_ptrs.cpp | 11 - wrap/expected/@Test/create_ptrs.m | 5 - wrap/expected/@Test/print.cpp | 9 - wrap/expected/@Test/print.m | 5 - wrap/expected/@Test/return_TestPtr.cpp | 11 - wrap/expected/@Test/return_TestPtr.m | 5 - wrap/expected/@Test/return_bool.cpp | 11 - wrap/expected/@Test/return_bool.m | 5 - wrap/expected/@Test/return_double.cpp | 11 - wrap/expected/@Test/return_double.m | 5 - wrap/expected/@Test/return_field.cpp | 11 - wrap/expected/@Test/return_field.m | 5 - wrap/expected/@Test/return_int.cpp | 11 - wrap/expected/@Test/return_int.m | 5 - wrap/expected/@Test/return_matrix1.cpp | 11 - wrap/expected/@Test/return_matrix1.m | 5 - wrap/expected/@Test/return_matrix2.cpp | 11 - wrap/expected/@Test/return_matrix2.m | 5 - wrap/expected/@Test/return_pair.cpp | 13 - wrap/expected/@Test/return_pair.m | 5 - wrap/expected/@Test/return_ptrs.cpp | 13 - wrap/expected/@Test/return_ptrs.m | 5 - wrap/expected/@Test/return_size_t.cpp | 11 - wrap/expected/@Test/return_size_t.m | 5 - wrap/expected/@Test/return_string.cpp | 11 - wrap/expected/@Test/return_string.m | 5 - wrap/expected/@Test/return_vector1.cpp | 11 - wrap/expected/@Test/return_vector1.m | 5 - wrap/expected/@Test/return_vector2.cpp | 11 - wrap/expected/@Test/return_vector2.m | 5 - wrap/expected/make_geometry.m | 44 - wrap/expected/new_Point2_.cpp | 9 - wrap/expected/new_Point2_.m | 4 - wrap/expected/new_Point2_dd.cpp | 11 - wrap/expected/new_Point2_dd.m | 4 - wrap/expected/new_Point3_ddd.cpp | 12 - wrap/expected/new_Point3_ddd.m | 4 - wrap/expected/new_Test_.cpp | 9 - wrap/expected/new_Test_.m | 4 - wrap/geometry.h | 39 - wrap/hello.cpp | 26 - wrap/testSpirit.cpp | 105 - wrap/testWrap.cpp | 117 - wrap/utilities.cpp | 68 - wrap/utilities.h | 60 - wrap/wrap-matlab.h | 438 ---- wrap/wrap.cpp | 58 - 83 files changed, 9628 deletions(-) delete mode 100644 doc/LieGroups.lyx delete mode 100644 doc/LieGroups.pdf delete mode 100644 doc/images/circular.pdf delete mode 100644 doc/images/circular.png delete mode 100644 doc/images/gtsam-structure.graffle delete mode 100644 doc/images/gtsam-structure.pdf delete mode 100644 doc/images/n-steps.pdf delete mode 100644 doc/images/n-steps.png delete mode 100644 doc/macros.lyx delete mode 100644 doc/math.lyx delete mode 100644 doc/math.pdf delete mode 100644 gtsam-broken.h delete mode 100644 gtsam.h delete mode 100644 wrap/.cvsignore delete mode 100644 wrap/Argument.cpp delete mode 100644 wrap/Argument.h delete mode 100644 wrap/Class.cpp delete mode 100644 wrap/Class.h delete mode 100644 wrap/Constructor.cpp delete mode 100644 wrap/Constructor.h delete mode 100644 wrap/Makefile.am delete mode 100644 wrap/Method.cpp delete mode 100644 wrap/Method.h delete mode 100644 wrap/Module.cpp delete mode 100644 wrap/Module.h delete mode 100644 wrap/expected/@Point2/Point2.m delete mode 100644 wrap/expected/@Point2/dim.cpp delete mode 100644 wrap/expected/@Point2/dim.m delete mode 100644 wrap/expected/@Point2/x.cpp delete mode 100644 wrap/expected/@Point2/x.m delete mode 100644 wrap/expected/@Point2/y.cpp delete mode 100644 wrap/expected/@Point2/y.m delete mode 100644 wrap/expected/@Point3/Point3.m delete mode 100644 wrap/expected/@Point3/norm.cpp delete mode 100644 wrap/expected/@Point3/norm.m delete mode 100644 wrap/expected/@Test/Test.m delete mode 100644 wrap/expected/@Test/create_ptrs.cpp delete mode 100644 wrap/expected/@Test/create_ptrs.m delete mode 100644 wrap/expected/@Test/print.cpp delete mode 100644 wrap/expected/@Test/print.m delete mode 100644 wrap/expected/@Test/return_TestPtr.cpp delete mode 100644 wrap/expected/@Test/return_TestPtr.m delete mode 100644 wrap/expected/@Test/return_bool.cpp delete mode 100644 wrap/expected/@Test/return_bool.m delete mode 100644 wrap/expected/@Test/return_double.cpp delete mode 100644 wrap/expected/@Test/return_double.m delete mode 100644 wrap/expected/@Test/return_field.cpp delete mode 100644 wrap/expected/@Test/return_field.m delete mode 100644 wrap/expected/@Test/return_int.cpp delete mode 100644 wrap/expected/@Test/return_int.m delete mode 100644 wrap/expected/@Test/return_matrix1.cpp delete mode 100644 wrap/expected/@Test/return_matrix1.m delete mode 100644 wrap/expected/@Test/return_matrix2.cpp delete mode 100644 wrap/expected/@Test/return_matrix2.m delete mode 100644 wrap/expected/@Test/return_pair.cpp delete mode 100644 wrap/expected/@Test/return_pair.m delete mode 100644 wrap/expected/@Test/return_ptrs.cpp delete mode 100644 wrap/expected/@Test/return_ptrs.m delete mode 100644 wrap/expected/@Test/return_size_t.cpp delete mode 100644 wrap/expected/@Test/return_size_t.m delete mode 100644 wrap/expected/@Test/return_string.cpp delete mode 100644 wrap/expected/@Test/return_string.m delete mode 100644 wrap/expected/@Test/return_vector1.cpp delete mode 100644 wrap/expected/@Test/return_vector1.m delete mode 100644 wrap/expected/@Test/return_vector2.cpp delete mode 100644 wrap/expected/@Test/return_vector2.m delete mode 100644 wrap/expected/make_geometry.m delete mode 100644 wrap/expected/new_Point2_.cpp delete mode 100644 wrap/expected/new_Point2_.m delete mode 100644 wrap/expected/new_Point2_dd.cpp delete mode 100644 wrap/expected/new_Point2_dd.m delete mode 100644 wrap/expected/new_Point3_ddd.cpp delete mode 100644 wrap/expected/new_Point3_ddd.m delete mode 100644 wrap/expected/new_Test_.cpp delete mode 100644 wrap/expected/new_Test_.m delete mode 100644 wrap/geometry.h delete mode 100644 wrap/hello.cpp delete mode 100644 wrap/testSpirit.cpp delete mode 100644 wrap/testWrap.cpp delete mode 100644 wrap/utilities.cpp delete mode 100644 wrap/utilities.h delete mode 100644 wrap/wrap-matlab.h delete mode 100644 wrap/wrap.cpp diff --git a/doc/LieGroups.lyx b/doc/LieGroups.lyx deleted file mode 100644 index a2ab4c12e..000000000 --- a/doc/LieGroups.lyx +++ /dev/null @@ -1,3233 +0,0 @@ -#LyX 1.6.6.1 created this file. For more info see http://www.lyx.org/ -\lyxformat 345 -\begin_document -\begin_header -\textclass article -\use_default_options false -\begin_modules -theorems-std -\end_modules -\language english -\inputencoding auto -\font_roman times -\font_sans default -\font_typewriter default -\font_default_family rmdefault -\font_sc false -\font_osf false -\font_sf_scale 100 -\font_tt_scale 100 - -\graphics default -\paperfontsize 12 -\spacing single -\use_hyperref false -\papersize default -\use_geometry true -\use_amsmath 1 -\use_esint 0 -\cite_engine basic -\use_bibtopic false -\paperorientation portrait -\leftmargin 1in -\topmargin 1in -\rightmargin 1in -\bottommargin 1in -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\author "" -\author "" -\end_header - -\begin_body - -\begin_layout Title -Lie Groups for Beginners -\end_layout - -\begin_layout Author -Frank Dellaert -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Derivatives -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\deriv}[2]{\frac{\partial#1}{\partial#2}} -{\frac{\partial#1}{\partial#2}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\at}[2]{#1\biggr\rvert_{#2}} -{#1\biggr\rvert_{#2}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Jac}[3]{ \at{\deriv{#1}{#2}} {#3} } -{\at{\deriv{#1}{#2}}{#3}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Lie Groups -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\xhat}{\hat{x}} -{\hat{x}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\yhat}{\hat{y}} -{\hat{y}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Ad}[1]{Ad_{#1}} -{Ad_{#1}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\AAdd}[1]{\mathbf{\mathop{Ad}}{}_{#1}} -{\mathbf{\mathop{Ad}}{}_{#1}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\define}{\stackrel{\Delta}{=}} -{\stackrel{\Delta}{=}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\gg}{\mathfrak{g}} -{\mathfrak{g}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Rn}{\mathbb{R}^{n}} -{\mathbb{R}^{n}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SO(2), 1 -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Rtwo}{\mathfrak{\mathbb{R}^{2}}} -{\mathfrak{\mathbb{R}^{2}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SOtwo}{SO(2)} -{SO(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sotwo}{\mathfrak{so(2)}} -{\mathfrak{so(2)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\that}{\hat{\theta}} -{\hat{\theta}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\skew}[1]{[#1]_{+}} -{[#1]_{+}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SE(2), 3 -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\SEtwo}{SE(2)} -{SE(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\setwo}{\mathfrak{se(2)}} -{\mathfrak{se(2)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Skew}[1]{[#1]_{\times}} -{[#1]_{\times}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SO(3), 3 -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Rthree}{\mathfrak{\mathbb{R}^{3}}} -{\mathfrak{\mathbb{R}^{3}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SOthree}{SO(3)} -{SO(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sothree}{\mathfrak{so(3)}} -{\mathfrak{so(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\what}{\hat{\omega}} -{\hat{\omega}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SE(3),6 -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Rsix}{\mathfrak{\mathbb{R}^{6}}} -{\mathfrak{\mathbb{R}^{6}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SEthree}{SE(3)} -{SE(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sethree}{\mathfrak{se(3)}} -{\mathfrak{se(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\xihat}{\hat{\xi}} -{\hat{\xi}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Aff(2),6 -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Afftwo}{Aff(2)} -{Aff(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\afftwo}{\mathfrak{aff(2)}} -{\mathfrak{aff(2)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\aa}{a} -{a} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\ahat}{\hat{a}} -{\hat{a}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status collapsed - -\begin_layout Plain Layout -SL(3),8 -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\SLthree}{SL(3)} -{SL(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\slthree}{\mathfrak{sl(3)}} -{\mathfrak{sl(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\hh}{h} -{h} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\hhat}{\hat{h}} -{\hat{h}} -\end_inset - - -\end_layout - -\begin_layout Section -Motivation: Rigid Motions in the Plane -\end_layout - -\begin_layout Standard -We will start with a small example of a robot moving in a plane, parameterized - by a -\emph on -2D pose -\emph default - -\begin_inset Formula $(x,\, y,\,\theta)$ -\end_inset - -. - When we give it a small forward velocity -\begin_inset Formula $v_{x}$ -\end_inset - -, we know that the location changes as -\begin_inset Formula \[ -\dot{x}=v_{x}\] - -\end_inset - -The solution to this trivial differential equation is, with -\begin_inset Formula $x_{0}$ -\end_inset - - the initial -\begin_inset Formula $x$ -\end_inset - --position of the robot, -\begin_inset Formula \[ -x_{t}=x_{0}+v_{x}t\] - -\end_inset - -A similar story holds for translation in the -\begin_inset Formula $y$ -\end_inset - - direction, and in fact for translations in general: -\begin_inset Formula \[ -(x_{t},\, y_{t},\,\theta_{t})=(x_{0}+v_{x}t,\, y_{0}+v_{y}t,\,\theta_{0})\] - -\end_inset - -Similarly for rotation we have -\begin_inset Formula \[ -(x_{t},\, y_{t},\,\theta_{t})=(x_{0},\, y_{0},\,\theta_{0}+\omega t)\] - -\end_inset - -where -\begin_inset Formula $\omega$ -\end_inset - - is angular velocity, measured in -\begin_inset Formula $rad/s$ -\end_inset - - in counterclockwise direction. - -\end_layout - -\begin_layout Standard -\begin_inset Float figure -placement h -wide false -sideways false -status collapsed - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename images/circular.pdf - -\end_inset - - -\begin_inset Caption - -\begin_layout Plain Layout -Robot moving along a circular trajectory. -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -However, if we combine translation and rotation, the story breaks down! - We cannot write -\begin_inset Formula \[ -(x_{t},\, y_{t},\,\theta_{t})=(x_{0}+v_{x}t,\, y_{0}+v_{y}t,\,\theta_{0}+\omega t)\] - -\end_inset - -The reason is that, if we move the robot a tiny bit according to the velocity - vector -\begin_inset Formula $(v_{x},\, v_{y},\,\omega)$ -\end_inset - -, we have (to first order) -\begin_inset Formula \[ -(x_{\delta},\, y_{\delta},\,\theta_{\delta})=(x_{0}+v_{x}\delta,\, y_{0}+v_{y}\delta,\,\theta_{0}+\omega\delta)\] - -\end_inset - -but now the robot has rotated, and for the next incremental change, the - velocity vector would have to be rotated before it can be applied. - In fact, the robot will move on a -\emph on -circular -\emph default - trajectory. - -\end_layout - -\begin_layout Standard -The reason is that -\emph on -translation and rotation do not commute -\emph default -: if we rotate and then move we will end up in a different place than if - we moved first, then rotated. - In fact, someone once said (I forget who, kudos for who can track down - the exact quote): -\end_layout - -\begin_layout Quote -If rotation and translation commuted, we could do all rotations before leaving - home. -\end_layout - -\begin_layout Standard -\begin_inset Float figure -placement h -wide false -sideways false -status open - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename images/n-steps.pdf - -\end_inset - - -\begin_inset Caption - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:n-step-program" - -\end_inset - -Approximating a circular trajectory with -\begin_inset Formula $n$ -\end_inset - - steps. -\end_layout - -\end_inset - - -\end_layout - -\end_inset - -To make progress, we have to be more precise about how the robot behaves. - Specifically, let us define composition of two poses -\begin_inset Formula $T_{1}$ -\end_inset - - and -\begin_inset Formula $T_{2}$ -\end_inset - - as -\begin_inset Formula \[ -T_{1}T_{2}=(x_{1},\, y_{1},\,\theta_{1})(x_{2},\, y_{2},\,\theta_{2})=(x_{1}+\cos\theta_{1}x_{2}-\sin\theta y_{2},\, y_{1}+\sin\theta_{1}x_{2}+\cos\theta_{1}y_{2},\,\theta_{1}+\theta_{2})\] - -\end_inset - -This is a bit clumsy, so we resort to a trick: embed the 2D poses in the - space of -\begin_inset Formula $3\times3$ -\end_inset - - matrices, so we can define composition as matrix multiplication: -\begin_inset Formula \[ -T_{1}T_{2}=\left[\begin{array}{cc} -R_{1} & t_{1}\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -R_{2} & t_{2}\\ -0 & 1\end{array}\right]=\left[\begin{array}{cc} -R_{1}R_{2} & R_{1}t_{2}+t_{1}\\ -0 & 1\end{array}\right]\] - -\end_inset - -where the matrices -\begin_inset Formula $R$ -\end_inset - - are 2D rotation matrices defined as -\begin_inset Formula \[ -R=\left[\begin{array}{cc} -\cos\theta & -\sin\theta\\ -\sin\theta & \cos\theta\end{array}\right]\] - -\end_inset - -Now a -\begin_inset Quotes eld -\end_inset - -tiny -\begin_inset Quotes erd -\end_inset - - motion of the robot can be written as -\begin_inset Formula \[ -T(\delta)=\left[\begin{array}{ccc} -\cos\omega\delta & -\sin\omega\delta & v_{x}\delta\\ -\sin\omega\delta & \cos\omega\delta & v_{y}\delta\\ -0 & 0 & 1\end{array}\right]\approx\left[\begin{array}{ccc} -1 & -\omega\delta & v_{x}\delta\\ -\omega\delta & 1 & v_{y}\delta\\ -0 & 0 & 1\end{array}\right]=I+\delta\left[\begin{array}{ccc} -0 & -\omega & v_{x}\\ -\omega & 0 & v_{y}\\ -0 & 0 & 0\end{array}\right]\] - -\end_inset - -Let us define the -\emph on -2D twist -\emph default - vector -\begin_inset Formula $\xi=(v,\omega)$ -\end_inset - -, and the matrix above as -\begin_inset Formula \[ -\xihat\define\left[\begin{array}{ccc} -0 & -\omega & v_{x}\\ -\omega & 0 & v_{y}\\ -0 & 0 & 0\end{array}\right]\] - -\end_inset - -If we wanted -\begin_inset Formula $t$ -\end_inset - - to be large, we could split up -\begin_inset Formula $t$ -\end_inset - - into smaller timesteps, say -\begin_inset Formula $n$ -\end_inset - - of them, and compose them as follows: -\begin_inset Formula \[ -T(t)\approx\left(I+\frac{t}{n}\xihat\right)\ldots\mbox{n times}\ldots\left(I+\frac{t}{n}\xihat\right)=\left(I+\frac{t}{n}\xihat\right)^{n}\] - -\end_inset - -The result is shown in Figure -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:n-step-program" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Of course, the perfect solution would be obtained if we take -\begin_inset Formula $n$ -\end_inset - - to infinity: -\begin_inset Formula \[ -T(t)=\lim_{n\rightarrow\infty}\left(I+\frac{t}{n}\xihat\right)^{n}\] - -\end_inset - -For real numbers, this series is familiar and is actually a way to compute - the exponential function: -\begin_inset Formula \[ -e^{x}=\lim_{n\rightarrow\infty}\left(1+\frac{x}{n}\right)^{n}=\sum_{k=0}^{\infty}\frac{x^{k}}{k!}\] - -\end_inset - -The series can be similarly defined for square matrices, and the final result - is that we can write the motion of a robot along a circular trajectory, - resulting from the 2D twist -\begin_inset Formula $\xi=(v,\omega)$ -\end_inset - - -\begin_inset Formula $ $ -\end_inset - - as the -\emph on -matrix exponential -\emph default - of -\begin_inset Formula $\xihat$ -\end_inset - -: -\begin_inset Formula \[ -T(t)=e^{t\xihat}\define\lim_{n\rightarrow\infty}\left(I+\frac{t}{n}\xihat\right)^{n}=\sum_{k=0}^{\infty}\frac{t^{k}}{k!}\xihat^{k}\] - -\end_inset - -We call this mapping from 2D twists matrices -\begin_inset Formula $\xihat$ -\end_inset - - to 2D rigid transformations the -\emph on -exponential map. -\end_layout - -\begin_layout Standard -The above has all elements of Lie group theory. - We call the space of 2D rigid transformations, along with the composition - operation, the -\emph on -special Euclidean group -\emph default - -\begin_inset Formula $\SEtwo$ -\end_inset - -. - It is called a Lie group because it is simultaneously a topological group - and a manifold, which implies that the multiplication and the inversion - operations are smooth. - The space of 2D twists, together with a special binary operation to be - defined below, is called the Lie algebra -\begin_inset Formula $\setwo$ -\end_inset - - associated with -\begin_inset Formula $\SEtwo$ -\end_inset - -. - Below we generalize these concepts and then introduce the most commonly - used Lie groups and their Lie algebras. -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -Basic Lie Group Concepts -\end_layout - -\begin_layout Subsection -A Manifold and a Group -\end_layout - -\begin_layout Standard -A Lie group -\begin_inset Formula $G$ -\end_inset - - is a a group and a manifold that possesses a smooth group operation. - Associated with it is a Lie Algebra -\begin_inset Formula $\gg$ -\end_inset - - which, loosely speaking, can be identified with the tangent space at the - identity and completely defines how the groups behaves around the identity. - There is a mapping from -\begin_inset Formula $\gg$ -\end_inset - - back to -\begin_inset Formula $G$ -\end_inset - -, called the exponential map -\begin_inset Formula \[ -\exp:\gg\rightarrow G\] - -\end_inset - -which is typically a many-to-one mapping. - The corresponding inverse can be define locally around the origin and hence - is a -\begin_inset Quotes eld -\end_inset - -logarithm -\begin_inset Quotes erd -\end_inset - - -\begin_inset Formula \[ -\log:G\rightarrow\gg\] - -\end_inset - -that maps elements in a neighborhood of -\begin_inset Formula $id$ -\end_inset - - in G to an element in -\begin_inset Formula $\gg$ -\end_inset - -. -\end_layout - -\begin_layout Subsection -Lie Algebra -\end_layout - -\begin_layout Standard -The Lie Algebra -\begin_inset Formula $\gg$ -\end_inset - - is called an algebra because it is endowed with a binary operation, the - Lie bracket -\begin_inset Formula $[X,Y]$ -\end_inset - -, the properties of which are closely related to the group operation of - -\begin_inset Formula $G$ -\end_inset - -. - For example, in matrix Lie groups, the Lie bracket is given by -\begin_inset Formula $[A,B]\define AB-BA$ -\end_inset - -. -\end_layout - -\begin_layout Standard -The relationship of the Lie bracket to the group operation is as follows: - for commutative Lie groups vector addition -\begin_inset Formula $X+Y$ -\end_inset - - in -\begin_inset Formula $\gg$ -\end_inset - - mimicks the group operation. - For example, if we have -\begin_inset Formula $Z=X+Y$ -\end_inset - - in -\begin_inset Formula $\gg$ -\end_inset - -, when mapped backed to -\begin_inset Formula $G$ -\end_inset - - via the exponential map we obtain -\begin_inset Formula \[ -e^{Z}=e^{X+Y}=e^{X}e^{Y}\] - -\end_inset - -However, this does -\emph on -not -\emph default - hold for non-commutative Lie groups: -\begin_inset Formula \[ -Z=\log(e^{X}e^{Y})\neq X+Y\] - -\end_inset - -Instead, -\begin_inset Formula $Z$ -\end_inset - - can be calculated using the Baker-Campbell-Hausdorff (BCH) formula -\begin_inset CommandInset citation -LatexCommand cite -key "Hall00book" - -\end_inset - - -\begin_inset Note Note -status collapsed - -\begin_layout Plain Layout -http://en.wikipedia.org/wiki/Baker–Campbell–Hausdorff_formula -\end_layout - -\end_inset - -: -\begin_inset Formula \[ -Z=X+Y+[X,Y]/2+[X-Y,[X,Y]]/12-[Y,[X,[X,Y]]]/24+\ldots\] - -\end_inset - -For commutative groups the bracket is zero and we recover -\begin_inset Formula $Z=X+Y$ -\end_inset - -. - For non-commutative groups we can use the BCH formula to approximate it. -\end_layout - -\begin_layout Subsection -Exponential Coordinates -\end_layout - -\begin_layout Standard -For -\begin_inset Formula $n$ -\end_inset - --dimensional matrix Lie groups, as a vector space the Lie algebra -\begin_inset Formula $\gg$ -\end_inset - - is isomorphic to -\begin_inset Formula $\mathbb{R}^{n}$ -\end_inset - -, and we can define the hat operator -\begin_inset CommandInset citation -LatexCommand cite -after "page 41" -key "Murray94book" - -\end_inset - -, -\begin_inset Formula \[ -\hat{}:x\in\mathbb{R}^{n}\rightarrow\xhat\in\gg\] - -\end_inset - -which maps -\begin_inset Formula $n$ -\end_inset - --vectors -\begin_inset Formula $x\in\mathbb{R}^{n}$ -\end_inset - - to elements of -\begin_inset Formula $\gg$ -\end_inset - -. - In the case of matrix Lie groups, the elements -\begin_inset Formula $\xhat$ -\end_inset - - of -\begin_inset Formula $\gg$ -\end_inset - - are -\begin_inset Formula $n\times n$ -\end_inset - - matrices, and the map is given by -\begin_inset Formula \begin{equation} -\xhat=\sum_{i=1}^{n}x_{i}G^{i}\label{eq:generators}\end{equation} - -\end_inset - -where the -\begin_inset Formula $G^{i}$ -\end_inset - - are -\begin_inset Formula $n\times n$ -\end_inset - - matrices known as Lie group generators. - The meaning of the map -\begin_inset Formula $x\rightarrow\xhat$ -\end_inset - - will depend on the group -\begin_inset Formula $G$ -\end_inset - - and will generally have an intuitive interpretation. -\end_layout - -\begin_layout Subsection -Tangent Spaces and the Tangent Bundle -\end_layout - -\begin_layout Standard -The tangent space -\begin_inset Formula $T_{g}G$ -\end_inset - - at a group element -\begin_inset Formula $g\in G$ -\end_inset - - is the vector space of tangent vectors at -\begin_inset Formula $g$ -\end_inset - -. - The tangent bundle -\begin_inset Formula $TG$ -\end_inset - - is the set of all tangent vectors -\begin_inset Formula \[ -TG\define\bigcup_{g\in G}T_{g}G\] - -\end_inset - -A vector field -\begin_inset Formula $X:G\rightarrow TG$ -\end_inset - - assigns to each element -\begin_inset Formula $g$ -\end_inset - - as single tangent vector -\begin_inset Formula $x\in T_{g}G$ -\end_inset - -. -\end_layout - -\begin_layout Subsection -The Adjoint Map and Adjoint Representation -\end_layout - -\begin_layout Standard -\begin_inset Note Note -status open - -\begin_layout Plain Layout -We do not fully understand this yet!!! -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The -\emph on -adjoint map -\emph default - -\begin_inset Formula $\AAdd g$ -\end_inset - - maps a group element -\begin_inset Formula $a\in G$ -\end_inset - - to its conjugate -\begin_inset Formula $gag^{-1}$ -\end_inset - - by -\begin_inset Formula $g$ -\end_inset - -. -\end_layout - -\begin_layout Standard -Below we frequently make use of the equality -\begin_inset Note Note -status collapsed - -\begin_layout Plain Layout -http://en.wikipedia.org/wiki/Exponential_map -\end_layout - -\end_inset - - -\begin_inset Formula \[ -\AAdd ge^{\xhat}=ge^{\xhat}g^{-1}=e^{\Ad g{\xhat}}\] - -\end_inset - -where -\begin_inset Formula $\Ad g:\gg\rightarrow\mathfrak{\gg}$ -\end_inset - - is a map parameterized by a group element -\begin_inset Formula $g$ -\end_inset - -, and is called the -\emph on -adjoint representation -\emph default -. - -\begin_inset Note Note -status open - -\begin_layout Plain Layout -The intuitive explanation is that a change -\begin_inset Formula $\exp\left(\xhat\right)$ -\end_inset - - defined around the orgin, but applied at the group element -\begin_inset Formula $g$ -\end_inset - -, can be written in one step by taking the adjoint -\begin_inset Formula $\Ad g{\xhat}$ -\end_inset - - of -\begin_inset Formula $\xhat$ -\end_inset - -. -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -In the case of a matrix group the adjoint can be written as -\begin_inset Note Note -status collapsed - -\begin_layout Plain Layout -http://en.wikipedia.org/wiki/Adjoint_representation_of_a_Lie_group -\end_layout - -\end_inset - - -\begin_inset Formula \[ -\Ad T{\xhat}\define T\xhat T^{-1}\] - -\end_inset - -and hence we have -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -Te^{\xhat}T^{-1}=e^{T\xhat T^{-1}}\] - -\end_inset - -where both -\begin_inset Formula $T\in G$ -\end_inset - - and -\begin_inset Formula $\xhat\in\gg$ -\end_inset - - are -\begin_inset Formula $n\times n$ -\end_inset - - matrices for an -\begin_inset Formula $n$ -\end_inset - --dimensional Lie group. -\end_layout - -\begin_layout Subsection -Actions -\end_layout - -\begin_layout Standard -The (usual) action of an -\begin_inset Formula $n$ -\end_inset - --dimensional matrix group -\begin_inset Formula $G$ -\end_inset - - is matrix-vector multiplication on -\begin_inset Formula $\mathbb{R}^{n}$ -\end_inset - -, -\begin_inset Formula \[ -q=Tp\] - -\end_inset - -with -\begin_inset Formula $p,q\in\mathbb{R}^{n}$ -\end_inset - - and -\begin_inset Formula $T\in GL(n)$ -\end_inset - -. -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -2D Rotations -\end_layout - -\begin_layout Standard -We first look at a very simple group, the 2D rotations. -\end_layout - -\begin_layout Subsection -Basics -\end_layout - -\begin_layout Standard -The Lie group -\begin_inset Formula $\SOtwo$ -\end_inset - - is a subgroup of the general linear group -\begin_inset Formula $GL(2)$ -\end_inset - - of -\begin_inset Formula $2\times2$ -\end_inset - - invertible matrices. - Its Lie algebra -\begin_inset Formula $\sotwo$ -\end_inset - - is the vector space of -\begin_inset Formula $2\times2$ -\end_inset - - skew-symmetric matrices. - Since -\begin_inset Formula $\SOtwo$ -\end_inset - - is a one-dimensional manifold, -\begin_inset Formula $\sotwo$ -\end_inset - - is isomorphic to -\begin_inset Formula $\mathbb{R}$ -\end_inset - - and we define -\begin_inset Formula \[ -\hat{}:\mathbb{R}\rightarrow\sotwo\] - -\end_inset - - -\begin_inset Formula \[ -\hat{}:\omega\rightarrow\what=\skew{\omega}\] - -\end_inset - -which maps the angle -\begin_inset Formula $\theta$ -\end_inset - - to the -\begin_inset Formula $2\times2$ -\end_inset - - skew-symmetric matrix -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none - -\begin_inset Formula $\skew{\theta}$ -\end_inset - -: -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit - -\begin_inset Formula \[ -\skew{\theta}=\left[\begin{array}{cc} -0 & -\theta\\ -\theta & 0\end{array}\right]\] - -\end_inset - -The exponential map can be computed in closed form as -\begin_inset Formula \[ -R=e^{\skew{\omega t}}=e^{\skew{\theta}}=\left[\begin{array}{cc} -\cos\theta & -\sin\theta\\ -\sin\theta & \cos\theta\end{array}\right]\] - -\end_inset - -This can be proven -\begin_inset CommandInset citation -LatexCommand cite -key "Hall00book" - -\end_inset - - by realizing -\begin_inset Formula $\skew 1$ -\end_inset - - is diagonizable with eigenvalues -\begin_inset Formula $-i$ -\end_inset - - and -\begin_inset Formula $i$ -\end_inset - - , and eigenvectors -\begin_inset Formula $\left[\begin{array}{c} -1\\ -i\end{array}\right]$ -\end_inset - - and -\begin_inset Formula $\left[\begin{array}{c} -i\\ -1\end{array}\right]$ -\end_inset - -. - Readers familiar with projective geometry will recognize these as the circular - points when promoted to homogeneous coordinates. -\end_layout - -\begin_layout Subsection -Adjoint -\end_layout - -\begin_layout Standard -The adjoint map for -\begin_inset Formula $\sotwo$ -\end_inset - - is trivially equal to the identity, as is the case for -\emph on -all -\emph default - commutative groups: -\begin_inset Formula \begin{eqnarray*} -\Ad R\what & = & \left[\begin{array}{cc} -\cos\theta & -\sin\theta\\ -\sin\theta & \cos\theta\end{array}\right]\left[\begin{array}{cc} -0 & -\omega\\ -\omega & 0\end{array}\right]\left[\begin{array}{cc} -\cos\theta & -\sin\theta\\ -\sin\theta & \cos\theta\end{array}\right]^{T}\\ - & = & \omega\left[\begin{array}{cc} --\sin\theta & -\cos\theta\\ -\cos\theta & -\sin\theta\end{array}\right]\left[\begin{array}{cc} -\cos\theta & \sin\theta\\ --\sin\theta & \cos\theta\end{array}\right]=\left[\begin{array}{cc} -0 & -\omega\\ -\omega & 0\end{array}\right]\end{eqnarray*} - -\end_inset - -i.e., -\begin_inset Formula \[ -\Ad R\what=\what\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Actions -\end_layout - -\begin_layout Standard -In the case of -\begin_inset Formula $\SOtwo$ -\end_inset - - the vector space is -\begin_inset Formula $\Rtwo$ -\end_inset - -, and the group action corresponds to rotating a point -\begin_inset Formula \[ -q=Rp\] - -\end_inset - -We would now like to know what an incremental rotation parameterized by - -\begin_inset Formula $\theta$ -\end_inset - - would do: -\begin_inset Formula \[ -q(\text{\omega t})=Re^{\skew{\omega t}}p\] - -\end_inset - -hence the derivative is: -\begin_inset Formula \[ -\deriv{q(\omega t)}t=R\deriv{}t\left(e^{\skew{\omega t}}p\right)=R\deriv{}t\left(\skew{\omega t}p\right)=RH_{p}\] - -\end_inset - -Note that -\begin_inset Formula \begin{equation} -\skew{\theta}\left[\begin{array}{c} -x\\ -y\end{array}\right]=\theta R_{\pi/2}\left[\begin{array}{c} -x\\ -y\end{array}\right]=\theta\left[\begin{array}{c} --y\\ -x\end{array}\right]\label{eq:RestrictedCross}\end{equation} - -\end_inset - -which acts like a restricted -\begin_inset Quotes eld -\end_inset - -cross product -\begin_inset Quotes erd -\end_inset - - in the plane. -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -2D Rigid Transformations -\end_layout - -\begin_layout Subsection -Basics -\end_layout - -\begin_layout Standard -The Lie group -\begin_inset Formula $\SEtwo$ -\end_inset - - is a subgroup of the general linear group -\begin_inset Formula $GL(3)$ -\end_inset - - of -\begin_inset Formula $3\times3$ -\end_inset - - invertible matrices of the form -\begin_inset Formula \[ -T\define\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\] - -\end_inset - -where -\begin_inset Formula $R\in\SOtwo$ -\end_inset - - is a rotation matrix and -\begin_inset Formula $t\in\Rtwo$ -\end_inset - - is a translation vector. - -\begin_inset Formula $\SEtwo$ -\end_inset - - is the -\emph on -semi-direct product -\emph default - of -\begin_inset Formula $\Rtwo$ -\end_inset - - by -\begin_inset Formula $SO(2)$ -\end_inset - -, written as -\begin_inset Formula $\SEtwo=\Rtwo\rtimes\SOtwo$ -\end_inset - -. - In particular, any element -\begin_inset Formula $T$ -\end_inset - - of -\begin_inset Formula $\SEtwo$ -\end_inset - - can be written as -\begin_inset Formula \[ -T=\left[\begin{array}{cc} -0 & t\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -R & 0\\ -0 & 1\end{array}\right]\] - -\end_inset - -and they compose as -\begin_inset Formula \[ -T_{1}T_{2}=\left[\begin{array}{cc} -R_{1} & t_{1}\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -R_{2} & t_{2}\\ -0 & 1\end{array}\right]=\left[\begin{array}{cc} -R_{1}R_{2} & R_{1}t_{2}+t_{1}\\ -0 & 1\end{array}\right]\] - -\end_inset - -Hence, an alternative way of writing down elements of -\begin_inset Formula $\SEtwo$ -\end_inset - - is as the ordered pair -\begin_inset Formula $(R,\, t)$ -\end_inset - -, with composition defined a -\begin_inset Formula \[ -(R_{1},\, t_{1})(R_{2},\, t_{2})=(R_{1}R_{2},\, R{}_{1}t_{2}+t_{1})\] - -\end_inset - - -\end_layout - -\begin_layout Standard -The corresponding Lie algebra -\begin_inset Formula $\setwo$ -\end_inset - - is the vector space of -\begin_inset Formula $3\times3$ -\end_inset - - twists -\begin_inset Formula $\xihat$ -\end_inset - - parameterized by the -\emph on -twist coordinates -\emph default - -\begin_inset Formula $\xi\in\Rthree$ -\end_inset - -, with the mapping -\begin_inset Formula \[ -\xi\define\left[\begin{array}{c} -v\\ -\omega\end{array}\right]\rightarrow\xihat\define\left[\begin{array}{cc} -\skew{\omega} & v\\ -0 & 0\end{array}\right]\] - -\end_inset - -Note we think of robots as having a pose -\begin_inset Formula $(x,y,\theta)$ -\end_inset - - and hence I reserved the first two components for translation and the last - for rotation. - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -The corresponding Lie group generators are -\begin_inset Formula \[ -G^{x}=\left[\begin{array}{ccc} -0 & 0 & 1\\ -0 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{y}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 1\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{\theta}=\left[\begin{array}{ccc} -0 & -1 & 0\\ -1 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\] - -\end_inset - - -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit -Applying the exponential map to a twist -\begin_inset Formula $\xi$ -\end_inset - - yields a screw motion yielding an element in -\begin_inset Formula $\SEtwo$ -\end_inset - -: -\begin_inset Formula \[ -T=e^{\xihat}=\left(e^{\skew{\omega}},(I-e^{\skew{\omega}})\frac{v^{\perp}}{\omega}\right)\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -The Adjoint Map -\end_layout - -\begin_layout Standard -The adjoint is -\begin_inset Formula \begin{eqnarray} -\Ad T{\xihat} & = & T\xihat T^{-1}\nonumber \\ - & = & \left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -\skew{\omega} & v\\ -0 & 0\end{array}\right]\left[\begin{array}{cc} -R^{T} & -R^{T}t\\ -0 & 1\end{array}\right]\nonumber \\ - & = & \left[\begin{array}{cc} -\skew{\omega} & -\skew{\omega}t+Rv\\ -0 & 0\end{array}\right]\nonumber \\ - & = & \left[\begin{array}{cc} -\skew{\omega} & Rv-\omega R_{\pi/2}t\\ -0 & 0\end{array}\right]\label{eq:adjointSE2}\end{eqnarray} - -\end_inset - -From this we can express the Adjoint map in terms of plane twist coordinates: -\begin_inset Formula \[ -\left[\begin{array}{c} -v'\\ -\omega'\end{array}\right]=\left[\begin{array}{cc} -R & -R_{\pi/2}t\\ -0 & 1\end{array}\right]\left[\begin{array}{c} -v\\ -\omega\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Actions -\end_layout - -\begin_layout Standard -The action of -\begin_inset Formula $\SEtwo$ -\end_inset - - on 2D points is done by embedding the points in -\begin_inset Formula $\mathbb{R}^{3}$ -\end_inset - - by using homogeneous coordinates -\begin_inset Formula \[ -\hat{q}=\left[\begin{array}{c} -q\\ -1\end{array}\right]=\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=T\hat{p}\] - -\end_inset - -Analoguous to -\begin_inset Formula $\SEthree$ -\end_inset - -, we can compute a velocity -\begin_inset Formula $\xihat\hat{p}$ -\end_inset - - in the local -\begin_inset Formula $T$ -\end_inset - - frame: -\begin_inset Formula \[ -\xihat\hat{p}=\left[\begin{array}{cc} -\skew{\omega} & v\\ -0 & 0\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=\left[\begin{array}{c} -\skew{\omega}p+v\\ -0\end{array}\right]\] - -\end_inset - -By only taking the top two rows, we can write this as a velocity in -\begin_inset Formula $\Rtwo$ -\end_inset - -, as the product of a -\begin_inset Formula $2\times3$ -\end_inset - - matrix -\begin_inset Formula $H_{p}$ -\end_inset - - that acts upon the exponential coordinates -\begin_inset Formula $\xi$ -\end_inset - - directly: -\begin_inset Formula \[ -\skew{\omega}p+v=v+R_{\pi/2}p\omega=\left[\begin{array}{cc} -I_{2} & R_{\pi/2}p\end{array}\right]\left[\begin{array}{c} -v\\ -\omega\end{array}\right]=H_{p}\xi\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -3D Rotations -\end_layout - -\begin_layout Subsection -Basics -\end_layout - -\begin_layout Standard -The Lie group -\begin_inset Formula $\SOthree$ -\end_inset - - is a subgroup of the general linear group -\begin_inset Formula $GL(3)$ -\end_inset - - of -\begin_inset Formula $3\times3$ -\end_inset - - invertible matrices. - Its Lie algebra -\begin_inset Formula $\sothree$ -\end_inset - - is the vector space of -\begin_inset Formula $3\times3$ -\end_inset - - skew-symmetric matrices -\begin_inset Formula $\what$ -\end_inset - -. - The exponential map can be computed in closed form using Rodrigues' formula - -\begin_inset CommandInset citation -LatexCommand cite -after "page 28" -key "Murray94book" - -\end_inset - -: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -e^{\what}=I+\what\sin\theta+\what^{2}(1\text{−}\cos\theta)\] - -\end_inset - -where -\begin_inset Formula $\what^{2}=\omega\omega^{T}-I$ -\end_inset - -, with -\begin_inset Formula $\omega\omega^{T}$ -\end_inset - - the outer product of -\begin_inset Formula $\omega$ -\end_inset - -. - Hence, a slightly more efficient variant is -\begin_inset Formula \[ -e^{\what}=\cos\theta I+\what sin\theta+\omega\omega^{T}(1\text{−}cos\theta)\] - -\end_inset - -Since -\begin_inset Formula $\SOthree$ -\end_inset - - is a three-dimensional manifold, -\begin_inset Formula $\sothree$ -\end_inset - - is isomorphic to -\begin_inset Formula $\Rthree$ -\end_inset - - and we define the map -\begin_inset Formula \[ -\hat{}:\Rthree\rightarrow\sothree\] - -\end_inset - - -\begin_inset Formula \[ -\hat{}:\omega\rightarrow\what=\Skew{\omega}\] - -\end_inset - -which maps 3-vectors -\begin_inset Formula $\omega$ -\end_inset - - to skew-symmetric matrices -\begin_inset Formula $\Skew{\omega}$ -\end_inset - - : -\begin_inset Formula \[ -\Skew{\omega}=\left[\begin{array}{ccc} -0 & -\omega_{z} & \omega_{y}\\ -\omega_{z} & 0 & -\omega_{x}\\ --\omega_{y} & \omega_{x} & 0\end{array}\right]=\omega_{x}G^{x}+\omega_{y}G^{y}+\omega_{z}G^{z}\] - -\end_inset - -where the -\begin_inset Formula $G^{i}$ -\end_inset - - are the generators for -\begin_inset Formula $\SOthree$ -\end_inset - -, -\begin_inset Formula \[ -G^{x}=\left(\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & -1\\ -0 & 1 & 0\end{array}\right)\mbox{}G^{y}=\left(\begin{array}{ccc} -0 & 0 & 1\\ -0 & 0 & 0\\ --1 & 0 & 0\end{array}\right)\mbox{ }G^{z}=\left(\begin{array}{ccc} -0 & -1 & 0\\ -1 & 0 & 0\\ -0 & 0 & 0\end{array}\right)\] - -\end_inset - -corresponding to a rotation around -\begin_inset Formula $X$ -\end_inset - -, -\begin_inset Formula $Y$ -\end_inset - -, and -\begin_inset Formula $Z$ -\end_inset - -, respectively. - The Lie bracket -\begin_inset Formula $[x,y]$ -\end_inset - - corresponds to the cross product -\begin_inset Formula $x\times y$ -\end_inset - - in -\begin_inset Formula $\Rthree$ -\end_inset - -. -\end_layout - -\begin_layout Standard -For every -\begin_inset Formula $3-$ -\end_inset - -vector -\begin_inset Formula $\omega$ -\end_inset - - there is a corresponding rotation matrix -\begin_inset Formula \[ -R=e^{\Skew{\omega}}\] - -\end_inset - -and this is defines the canonical parameterization of -\begin_inset Formula $\SOthree$ -\end_inset - -, with -\begin_inset Formula $\omega$ -\end_inset - - known as the canonical or exponential coordinates. - It is equivalent to the axis-angle representation for rotations, where - the unit vector -\begin_inset Formula $\omega/\left\Vert \omega\right\Vert $ -\end_inset - - defines the rotation axis, and its magnitude the amount of rotation -\begin_inset Formula $\theta$ -\end_inset - -. -\end_layout - -\begin_layout Subsection -The Adjoint Map -\end_layout - -\begin_layout Standard -For rotation matrices -\begin_inset Formula $R$ -\end_inset - - we can prove the following identity (see -\begin_inset CommandInset ref -LatexCommand vref -reference "proof1" - -\end_inset - -): -\begin_inset Formula \begin{equation} -R\Skew{\omega}R^{T}=\Skew{R\omega}\label{eq:property1}\end{equation} - -\end_inset - -Hence, given property -\begin_inset CommandInset ref -LatexCommand eqref -reference "eq:property1" - -\end_inset - -, the adjoint map for -\begin_inset Formula $\sothree$ -\end_inset - - simplifies to -\begin_inset Formula \[ -\Ad R{\Skew{\omega}}=R\Skew{\omega}R^{T}=\Skew{R\omega}\] - -\end_inset - -and this can be expressed in exponential coordinates simply by rotating - the axis -\begin_inset Formula $\omega$ -\end_inset - - to -\begin_inset Formula $R\omega$ -\end_inset - -. - -\end_layout - -\begin_layout Standard -As an example, to apply an axis-angle rotation -\begin_inset Formula $\omega$ -\end_inset - - to a point -\begin_inset Formula $p$ -\end_inset - - in the frame -\begin_inset Formula $R$ -\end_inset - -, we could: -\end_layout - -\begin_layout Enumerate -First transform -\begin_inset Formula $p$ -\end_inset - - back to the world frame, apply -\begin_inset Formula $\omega$ -\end_inset - -, and then rotate back: -\begin_inset Formula \[ -q=Re^{\Skew{\omega}}R^{T}\] - -\end_inset - - -\end_layout - -\begin_layout Enumerate -Immediately apply the transformed axis-angle transformation -\begin_inset Formula $\Ad R{\Skew{\omega}}=\Skew{R\omega}$ -\end_inset - -: -\begin_inset Formula \[ -q=e^{\Skew{R\omega}}p\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Actions -\end_layout - -\begin_layout Standard -In the case of -\begin_inset Formula $\SOthree$ -\end_inset - - the vector space is -\begin_inset Formula $\Rthree$ -\end_inset - -, and the group action corresponds to rotating a point -\begin_inset Formula \[ -q=Rp\] - -\end_inset - -We would now like to know what an incremental rotation parameterized by - -\begin_inset Formula $\omega$ -\end_inset - - would do: -\begin_inset Formula \[ -q(\omega)=Re^{\Skew{\omega}}p\] - -\end_inset - -hence the derivative is: -\begin_inset Formula \[ -\deriv{q(\omega)}{\omega}=R\deriv{}{\omega}\left(e^{\Skew{\omega}}p\right)=R\deriv{}{\omega}\left(\Skew{\omega}p\right)=R\Skew{-p}\] - -\end_inset - -To show the last equality note that -\begin_inset Formula \[ -\Skew{\omega}p=\omega\times p=-p\times\omega=\Skew{-p}\omega\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -3D Rigid Transformations -\end_layout - -\begin_layout Standard -The Lie group -\begin_inset Formula $\SEthree$ -\end_inset - - is a subgroup of the general linear group -\begin_inset Formula $GL(4)$ -\end_inset - - of -\begin_inset Formula $4\times4$ -\end_inset - - invertible matrices of the form -\begin_inset Formula \[ -T\define\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\] - -\end_inset - -where -\begin_inset Formula $R\in\SOthree$ -\end_inset - - is a rotation matrix and -\begin_inset Formula $t\in\Rthree$ -\end_inset - - is a translation vector. - An alternative way of writing down elements of -\begin_inset Formula $\SEthree$ -\end_inset - - is as the ordered pair -\begin_inset Formula $(R,\, t)$ -\end_inset - -, with composition defined as -\begin_inset Formula \[ -(R_{1},\, t_{1})(R_{2},\, t_{2})=(R_{1}R_{2},\, R{}_{1}t_{2}+t_{1})\] - -\end_inset - - Its Lie algebra -\begin_inset Formula $\sethree$ -\end_inset - - is the vector space of -\begin_inset Formula $4\times4$ -\end_inset - - twists -\begin_inset Formula $\xihat$ -\end_inset - - parameterized by the -\emph on -twist coordinates -\emph default - -\begin_inset Formula $\xi\in\Rsix$ -\end_inset - -, with the mapping -\begin_inset CommandInset citation -LatexCommand cite -key "Murray94book" - -\end_inset - - -\begin_inset Formula \[ -\xi\define\left[\begin{array}{c} -\omega\\ -v\end{array}\right]\rightarrow\xihat\define\left[\begin{array}{cc} -\Skew{\omega} & v\\ -0 & 0\end{array}\right]\] - -\end_inset - -Note we follow Frank Park's convention and reserve the first three components - for rotation, and the last three for translation. - Hence, with this parameterization, the generators for -\begin_inset Formula $\SEthree$ -\end_inset - - are -\begin_inset Formula \[ -G^{1}=\left(\begin{array}{cccc} -0 & 0 & 0 & 0\\ -0 & 0 & -1 & 0\\ -0 & 1 & 0 & 0\\ -0 & 0 & 0 & 0\end{array}\right)\mbox{}G^{2}=\left(\begin{array}{cccc} -0 & 0 & 1 & 0\\ -0 & 0 & 0 & 0\\ --1 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\end{array}\right)\mbox{ }G^{3}=\left(\begin{array}{cccc} -0 & -1 & 0 & 0\\ -1 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\end{array}\right)\] - -\end_inset - - -\begin_inset Formula \[ -G^{4}=\left(\begin{array}{cccc} -0 & 0 & 0 & 1\\ -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\end{array}\right)\mbox{}G^{5}=\left(\begin{array}{cccc} -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 1\\ -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\end{array}\right)\mbox{ }G^{6}=\left(\begin{array}{cccc} -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 0\\ -0 & 0 & 0 & 1\\ -0 & 0 & 0 & 0\end{array}\right)\] - -\end_inset - -Applying the exponential map to a twist -\begin_inset Formula $\xi$ -\end_inset - - yields a screw motion yielding an element in -\begin_inset Formula $\SEthree$ -\end_inset - -: -\begin_inset Formula \[ -T=\exp\xihat\] - -\end_inset - -A closed form solution for the exponential map is given in -\begin_inset CommandInset citation -LatexCommand cite -after "page 42" -key "Murray94book" - -\end_inset - -. -\end_layout - -\begin_layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -\begin_inset Formula \[ -\exp\left(\left[\begin{array}{c} -\omega\\ -v\end{array}\right]t\right)=\left[\begin{array}{cc} -e^{\Skew{\omega}t} & (I-e^{\Skew{\omega}t})\left(\omega\times v\right)+\omega\omega^{T}vt\\ -0 & 1\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -The Adjoint Map -\end_layout - -\begin_layout Standard -The adjoint is -\begin_inset Formula \begin{eqnarray*} -\Ad T{\xihat} & = & T\xihat T^{-1}\\ - & = & \left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -\Skew{\omega} & v\\ -0 & 0\end{array}\right]\left[\begin{array}{cc} -R^{T} & -R^{T}t\\ -0 & 1\end{array}\right]\\ - & = & \left[\begin{array}{cc} -\Skew{R\omega} & -\Skew{R\omega}t+Rv\\ -0 & 0\end{array}\right]\\ - & = & \left[\begin{array}{cc} -\Skew{R\omega} & t\times R\omega+Rv\\ -0 & 0\end{array}\right]\end{eqnarray*} - -\end_inset - -From this we can express the Adjoint map in terms of twist coordinates (see - also -\begin_inset CommandInset citation -LatexCommand cite -key "Murray94book" - -\end_inset - - and FP): -\begin_inset Formula \[ -\left[\begin{array}{c} -\omega'\\ -v'\end{array}\right]=\left[\begin{array}{cc} -R & 0\\ -\Skew tR & R\end{array}\right]\left[\begin{array}{c} -\omega\\ -v\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Actions -\end_layout - -\begin_layout Standard -The action of -\begin_inset Formula $\SEthree$ -\end_inset - - on 3D points is done by embedding the points in -\begin_inset Formula $\mathbb{R}^{4}$ -\end_inset - - by using homogeneous coordinates -\begin_inset Formula \[ -\hat{q}=\left[\begin{array}{c} -q\\ -1\end{array}\right]=\left[\begin{array}{c} -Rp+t\\ -1\end{array}\right]=\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=T\hat{p}\] - -\end_inset - -We would now like to know what an incremental rotation parameterized by - -\begin_inset Formula $\xi$ -\end_inset - - would do: -\begin_inset Formula \[ -\hat{q}(\xi)=Te^{\xihat}\hat{p}\] - -\end_inset - -hence the derivative is -\begin_inset Formula \[ -\deriv{\hat{q}(\xi)}{\xi}=T\deriv{}{\xi}\left(\xihat\hat{p}\right)\] - -\end_inset - -where -\begin_inset Formula $\xihat\hat{p}$ -\end_inset - - corresponds to a velocity in -\begin_inset Formula $\mathbb{R}^{4}$ -\end_inset - - (in the local -\begin_inset Formula $T$ -\end_inset - - frame): -\begin_inset Formula \[ -\xihat\hat{p}=\left[\begin{array}{cc} -\Skew{\omega} & v\\ -0 & 0\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=\left[\begin{array}{c} -\omega\times p+v\\ -0\end{array}\right]\] - -\end_inset - -Notice how velocities are anologous to points at infinity in projective - geometry: they correspond to free vectors indicating a direction and magnitude - of change. -\end_layout - -\begin_layout Standard -By only taking the top three rows, we can write this as a velocity in -\begin_inset Formula $\Rthree$ -\end_inset - -, as the product of a -\begin_inset Formula $3\times6$ -\end_inset - - matrix -\begin_inset Formula $H_{p}$ -\end_inset - - that acts upon the exponential coordinates -\begin_inset Formula $\xi$ -\end_inset - - directly: -\begin_inset Formula \[ -\omega\times p+v=-p\times\omega+v=\left[\begin{array}{cc} --\Skew p & I_{3}\end{array}\right]\left[\begin{array}{c} -\omega\\ -v\end{array}\right]\] - -\end_inset - -The inverse action -\begin_inset Formula $T^{-1}p$ -\end_inset - - is -\begin_inset Formula \[ -\hat{q}=\left[\begin{array}{c} -q\\ -1\end{array}\right]=\left[\begin{array}{c} -R^{T}(p-t)\\ -1\end{array}\right]=\left[\begin{array}{cc} -R^{T} & -R^{T}t\\ -0 & 1\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=T^{-1}\hat{p}\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -2D Affine Transformations -\end_layout - -\begin_layout Standard -The Lie group -\begin_inset Formula $Aff(2)$ -\end_inset - - is a subgroup of the general linear group -\begin_inset Formula $GL(3)$ -\end_inset - - of -\begin_inset Formula $3\times3$ -\end_inset - - invertible matrices that maps the line infinity to itself, and hence preserves - paralellism. - The affine transformation matrices -\begin_inset Formula $A$ -\end_inset - - can be written as -\begin_inset CommandInset citation -LatexCommand cite -key "Mei08tro" - -\end_inset - - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none - -\begin_inset Formula \[ -\left[\begin{array}{ccc} -m_{11} & m_{12} & t_{1}\\ -m_{21} & m_{22} & t_{2}\\ -0 & 0 & k\end{array}\right]\] - -\end_inset - -with -\begin_inset Formula $M\in GL(2)$ -\end_inset - -, -\begin_inset Formula $t\in\Rtwo$ -\end_inset - -, and -\begin_inset Formula $k$ -\end_inset - - a scalar chosen such that -\begin_inset Formula $det(A)=1$ -\end_inset - -. - -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit -Note that just as -\begin_inset Formula $\SEtwo$ -\end_inset - - is a semi-direct product, so too is -\begin_inset Formula $Aff(2)=\Rtwo\rtimes GL(2)$ -\end_inset - -. - In particular, any affine transformation -\begin_inset Formula $A$ -\end_inset - - can be written as -\begin_inset Formula \[ -A=\left[\begin{array}{cc} -0 & t\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -M & 0\\ -0 & k\end{array}\right]\] - -\end_inset - -and they compose as -\begin_inset Formula \[ -A_{1}A_{2}=\left[\begin{array}{cc} -M_{1} & t_{1}\\ -0 & k_{1}\end{array}\right]\left[\begin{array}{cc} -M_{2} & t_{2}\\ -0 & k_{2}\end{array}\right]=\left[\begin{array}{cc} -M_{1}M_{2} & M_{2}t_{2}+k_{2}t_{1}\\ -0 & k_{1}k_{2}\end{array}\right]\] - -\end_inset - -From this it can be gleaned that the groups -\begin_inset Formula $\SOtwo$ -\end_inset - - and -\begin_inset Formula $\SEtwo$ -\end_inset - - are both subgroups, with -\begin_inset Formula $\SOtwo\subset\SEtwo\subset\Afftwo$ -\end_inset - -. - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -By choosing the generators carefully we maintain this hierarchy among the - associated Lie algebras. - In particular, -\begin_inset Formula $\setwo$ -\end_inset - - -\begin_inset Formula \[ -G^{1}=\left[\begin{array}{ccc} -0 & 0 & 1\\ -0 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{2}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 1\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{3}=\left[\begin{array}{ccc} -0 & -1 & 0\\ -1 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\] - -\end_inset - -can be extended to the -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit -Lie algebra -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none - -\begin_inset Formula $\afftwo$ -\end_inset - - using the three additional generators -\begin_inset Formula \[ -G^{4}=\left[\begin{array}{ccc} -0 & 1 & 0\\ -1 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{5}=\left[\begin{array}{ccc} -1 & 0 & 0\\ -0 & -1 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{6}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & -1 & 0\\ -0 & 0 & 1\end{array}\right]\] - -\end_inset - - -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit -Hence, the Lie algebra -\begin_inset Formula $\afftwo$ -\end_inset - - is the vector space of -\begin_inset Formula $3\times3$ -\end_inset - - incremental affine transformations -\begin_inset Formula $\ahat$ -\end_inset - - parameterized by 6 parameters -\begin_inset Formula $\aa\in\mathbb{R}^{6}$ -\end_inset - -, with the mapping -\begin_inset Formula \[ -\aa\rightarrow\ahat\define\left[\begin{array}{ccc} -a_{5} & a_{4}-a_{3} & a_{1}\\ -a_{4}+a_{3} & -a_{5}-a_{6} & a_{2}\\ -0 & 0 & a_{6}\end{array}\right]\] - -\end_inset - -Note that -\begin_inset Formula $G_{5}$ -\end_inset - - and -\begin_inset Formula $G_{6}$ -\end_inset - - change the relative scale of -\begin_inset Formula $x$ -\end_inset - - and -\begin_inset Formula $y$ -\end_inset - - but without changing the determinant: -\begin_inset Formula \[ -e^{xG_{5}}=\exp\left[\begin{array}{ccc} -x & 0 & 0\\ -0 & -x & 0\\ -0 & 0 & 0\end{array}\right]=\left[\begin{array}{ccc} -e^{x} & 0 & 0\\ -0 & 1/e^{x} & 0\\ -0 & 0 & 1\end{array}\right]\] - -\end_inset - - -\begin_inset Formula \[ -e^{xG_{6}}=\exp\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & -x & 0\\ -0 & 0 & x\end{array}\right]=\left[\begin{array}{ccc} -1 & 0 & 0\\ -0 & 1/e^{x} & 0\\ -0 & 0 & e^{x}\end{array}\right]\] - -\end_inset - -It might be nicer to have the correspondence with scaling -\begin_inset Formula $x$ -\end_inset - - and -\begin_inset Formula $y$ -\end_inset - - more direct, by choosing -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none - -\begin_inset Formula \[ -\mbox{ }G^{5}=\left[\begin{array}{ccc} -1 & 0 & 0\\ -0 & 0 & 0\\ -0 & 0 & -1\end{array}\right]\mbox{ }G^{6}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 1 & 0\\ -0 & 0 & -1\end{array}\right]\] - -\end_inset - -and hence -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit - -\begin_inset Formula \[ -e^{xG_{5}}=\exp\left[\begin{array}{ccc} -x & 0 & 0\\ -0 & 0 & 0\\ -0 & 0 & -x\end{array}\right]=\left[\begin{array}{ccc} -e^{x} & 0 & 0\\ -0 & 1 & 0\\ -0 & 0 & 1/e^{x}\end{array}\right]\] - -\end_inset - - -\begin_inset Formula \[ -e^{xG_{6}}=\exp\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & x & 0\\ -0 & 0 & -x\end{array}\right]=\left[\begin{array}{ccc} -1 & 0 & 0\\ -0 & e^{x} & 0\\ -0 & 0 & 1/e^{x}\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Section -2D Homographies -\end_layout - -\begin_layout Standard -When viewed as operations on images, represented by 2D projective space - -\begin_inset Formula $\mathcal{P}^{3}$ -\end_inset - -, 3D rotations are a special case of 2D homographies. - These are now treated, loosely based on the exposition in -\begin_inset CommandInset citation -LatexCommand cite -key "Mei06iros,Mei08tro" - -\end_inset - -. -\end_layout - -\begin_layout Subsection -Basics -\end_layout - -\begin_layout Standard -The Lie group -\begin_inset Formula $\SLthree$ -\end_inset - - is a subgroup of the general linear group -\begin_inset Formula $GL(3)$ -\end_inset - - of -\begin_inset Formula $3\times3$ -\end_inset - - invertible matrices with determinant -\begin_inset Formula $1$ -\end_inset - -. - The homographies generalize transformations of the 2D projective space, - and -\begin_inset Formula $\Afftwo\subset\SLthree$ -\end_inset - -. - -\end_layout - -\begin_layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -We can extend -\begin_inset Formula $\afftwo$ -\end_inset - - to the Lie algebra -\begin_inset Formula $\slthree$ -\end_inset - - by adding two generators -\begin_inset Formula \[ -G^{7}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 0\\ -1 & 0 & 0\end{array}\right]\mbox{ }G^{8}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 0\\ -0 & 1 & 0\end{array}\right]\] - -\end_inset - - -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit -obtaining the vector space of -\begin_inset Formula $3\times3$ -\end_inset - - incremental homographies -\begin_inset Formula $\hhat$ -\end_inset - - parameterized by 8 parameters -\begin_inset Formula $\hh\in\mathbb{R}^{8}$ -\end_inset - -, with the mapping -\begin_inset Formula \[ -h\rightarrow\hhat\define\left[\begin{array}{ccc} -h_{5} & h_{4}-h_{3} & h_{1}\\ -h_{4}+h_{3} & -h_{5}-h_{6} & h_{2}\\ -h_{7} & h_{8} & h_{6}\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Tensor Notation -\end_layout - -\begin_layout Itemize -A homography between 2D projective spaces -\begin_inset Formula $A$ -\end_inset - - and -\begin_inset Formula $B$ -\end_inset - - can be written in tensor notation -\begin_inset Formula $H_{A}^{B}$ -\end_inset - - -\end_layout - -\begin_layout Itemize -Applying a homography is then a tensor contraction -\begin_inset Formula $x^{B}=H_{A}^{B}x^{A}$ -\end_inset - -, mapping points in -\begin_inset Formula $A$ -\end_inset - - to points in -\begin_inset Formula $B$ -\end_inset - -. -\end_layout - -\begin_layout Standard -\begin_inset Note Note -status collapsed - -\begin_layout Plain Layout -The inverse of a homography can be found by contracting with two permutation - tensors: -\begin_inset Formula \[ -H_{B}^{A}=H_{A_{1}}^{B_{1}}H_{A_{2}}^{B_{2}}\epsilon_{B_{1}B_{2}B}\epsilon^{A_{1}A_{2}A}\] - -\end_inset - - -\end_layout - -\end_inset - - -\begin_inset Note Note -status collapsed - -\begin_layout Subsection -The Adjoint Map -\end_layout - -\begin_layout Plain Layout -The adjoint can be done using tensor notation. - Denoting an incremental homography in space -\begin_inset Formula $A$ -\end_inset - - as -\begin_inset Formula $\hhat_{A_{1}}^{A_{2}}$ -\end_inset - -, we have, for example for -\begin_inset Formula $G_{1}$ -\end_inset - - -\begin_inset Formula \begin{eqnarray*} -\hhat_{B_{1}}^{B_{2}}=\Ad{H_{A}^{B}}{\hhat_{A_{1}}^{A_{2}}} & = & H_{A_{2}}^{B_{2}}\hhat_{A_{1}}^{A_{2}}H_{B_{1}}^{A_{1}}\\ - & = & H_{A_{2}}^{B_{2}}\left[\begin{array}{ccc} -0 & 0 & 1\\ -0 & 0 & 0\\ -0 & 0 & 0\end{array}\right]H_{A_{2}}^{B_{2}}H_{A_{3}}^{B_{3}}\epsilon_{B_{1}B_{2}B_{3}}\epsilon^{A_{1}A_{2}A_{3}}\\ - & = & H_{1}^{B_{2}}H_{A_{2}}^{B_{2}}H_{A_{3}}^{B_{3}}\epsilon_{B_{1}B_{2}B_{3}}\epsilon^{3A_{2}A_{3}}\end{eqnarray*} - -\end_inset - -This does not seem to help. -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section* -Appendix: Proof of Property -\begin_inset CommandInset ref -LatexCommand ref -reference "proof1" - -\end_inset - - -\end_layout - -\begin_layout Standard -We can prove the following identity for rotation matrices -\begin_inset Formula $R$ -\end_inset - -, -\begin_inset Formula \begin{eqnarray} -R\Skew{\omega}R^{T} & = & R\Skew{\omega}\left[\begin{array}{ccc} -a_{1} & a_{2} & a_{3}\end{array}\right]\nonumber \\ - & = & R\left[\begin{array}{ccc} -\omega\times a_{1} & \omega\times a_{2} & \omega\times a_{3}\end{array}\right]\nonumber \\ - & = & \left[\begin{array}{ccc} -a_{1}(\omega\times a_{1}) & a_{1}(\omega\times a_{2}) & a_{1}(\omega\times a_{3})\\ -a_{2}(\omega\times a_{1}) & a_{2}(\omega\times a_{2}) & a_{2}(\omega\times a_{3})\\ -a_{3}(\omega\times a_{1}) & a_{3}(\omega\times a_{2}) & a_{3}(\omega\times a_{3})\end{array}\right]\nonumber \\ - & = & \left[\begin{array}{ccc} -\omega(a_{1}\times a_{1}) & \omega(a_{2}\times a_{1}) & \omega(a_{3}\times a_{1})\\ -\omega(a_{1}\times a_{2}) & \omega(a_{2}\times a_{2}) & \omega(a_{3}\times a_{2})\\ -\omega(a_{1}\times a_{3}) & \omega(a_{2}\times a_{3}) & \omega(a_{3}\times a_{3})\end{array}\right]\nonumber \\ - & = & \left[\begin{array}{ccc} -0 & -\omega a_{3} & \omega a_{2}\\ -\omega a_{3} & 0 & -\omega a_{1}\\ --\omega a_{2} & \omega a_{1} & 0\end{array}\right]\nonumber \\ - & = & \Skew{R\omega}\label{proof1}\end{eqnarray} - -\end_inset - -where -\begin_inset Formula $a_{1}$ -\end_inset - -, -\begin_inset Formula $a_{2}$ -\end_inset - -, and -\begin_inset Formula $a_{3}$ -\end_inset - - are the -\emph on -rows -\emph default - of -\begin_inset Formula $R$ -\end_inset - -. - Above we made use of the orthogonality of rotation matrices and the triple - product rule: -\begin_inset Formula \[ -a(b\times c)=b(c\times a)=c(a\times b)\] - -\end_inset - -Similarly, without proof -\begin_inset CommandInset citation -LatexCommand cite -after "Lemma 2.3" -key "Murray94book" - -\end_inset - -: -\begin_inset Formula \[ -R(a\times b)=Ra\times Rb\] - -\end_inset - - -\end_layout - -\begin_layout Section* -Appendix: Alternative Generators for -\begin_inset Formula $\slthree$ -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset CommandInset citation -LatexCommand cite -key "Mei06iros" - -\end_inset - - uses the following generators for -\begin_inset Formula $\slthree$ -\end_inset - -: -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none - -\begin_inset Formula \[ -G^{1}=\left[\begin{array}{ccc} -0 & 0 & 1\\ -0 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{2}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 1\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{3}=\left[\begin{array}{ccc} -0 & 1 & 0\\ -0 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\] - -\end_inset - - -\begin_inset Formula \[ -G^{4}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -1 & 0 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{5}=\left[\begin{array}{ccc} -1 & 0 & 0\\ -0 & -1 & 0\\ -0 & 0 & 0\end{array}\right]\mbox{ }G^{6}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & -1 & 0\\ -0 & 0 & 1\end{array}\right]\] - -\end_inset - - -\begin_inset Formula \[ -G^{7}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 0\\ -1 & 0 & 0\end{array}\right]\mbox{ }G^{8}=\left[\begin{array}{ccc} -0 & 0 & 0\\ -0 & 0 & 0\\ -0 & 1 & 0\end{array}\right]\] - -\end_inset - - -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit -We choose to use a different linear combination as the basis. -\end_layout - -\begin_layout Standard -\begin_inset CommandInset bibtex -LatexCommand bibtex -bibfiles "../../../papers/refs" -options "plain" - -\end_inset - - -\end_layout - -\end_body -\end_document diff --git a/doc/LieGroups.pdf b/doc/LieGroups.pdf deleted file mode 100644 index 1aa0c934ea62f3fa14ddbcde7f17c1a2aa6d42ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128770 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⁢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 IQjx~`Uyb_&vH$=8 diff --git a/doc/images/circular.png b/doc/images/circular.png deleted file mode 100644 index 71c346a8ec6458757638e023c5ce29431482a1b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1493 zcmV;`1uFW9P)#6s{yOo z!plL9LGiyx<|X`3;S_}YP0Jy8$R9Hd(jzS50X;+EZ&)%P(-RavLg8Zo>JrX@WY$nk z<8Vc^PwG4li*Ju#r5s4+GhSAZ$Kf+pzKS?pI*ki55Ly_H6$bO$V8r}w^wjP)bio-4 z(@nudVTMM`15h_1F(_hjNEB)mW)QUNUXDR`w{=aV5`osAO&=N*S`>OZkOQVD%ur}i z=&qy-svvBfb%jQB_6rwuR?-Pm6dDw|<_kAWP`E&0jzY&Y;DHGWbp-xZ7jhK#E9rw0 zg((VGDD3q~AM91q3pEN?LD(4kjnS=xurYAbK5U*(U6hhA+?H>J;kJ^~Fx<}iA4FhX zNh>3;9$_X1>&|OL1lFB*<$&$EB&i~gW3Z~EVL`|*J{ey2xlqJvuFBR;-iCj)p{(Jp z2-NlKBmxZzHofQqqd(ix{-~ik?cc??>V3gidxT z|2zh1XG-!WU5IoA?_mU9Kc{2js|-6$Fef@UnGfZ+LT z&JdX8;(7nnj^8prR~OGHtp79|R8B~jfO2ps28Y}U)xU=qw@HIRGdRppsNFC@VLzfm zVS+-5LNPexVDoHmo!d}$p&1-zgF}r%H8_+g6oW$!!p2XzfuKQQhQb93Qxqx`N)!qd zG8A$UHkaDEP&Gdq0wZQ9T%b^+P@ynE;S7Z$3afVEV8qrMXb2hDsR49}I*s8zq z!}h_!Q@59r0})p!T%a&Tp+unwz*aNz0Bjze)lWZMp-`hxg=a8JN4Jbj(65&|Dw*&zhp z9lb&j9KHH!`S#jqb6h!`e0!rTRL}}~FxnpPZlj)kvR9R|5}LD7m4R5!uv3d8*7~pa zhF#ntFd}z9o$WVI2@e4HO?koE2jEcwPu)8KT2S6Dp?hCL3!d#3m%xX}P8TsPq1=>% zSx+c=>fT$>fnzF04FZdVbmYyRynJfSag<>|ofHnx>hy|R1Pzo>^$pivV z$MX7mriwvHa)LmmDB0sP2&yp`aVQHo2ZjR8cS-+>><%l^SiC?shsbiO2Vw5nJmdIL zfoxz|Lp?a8OTxbaL;x5VyfsC&0000ybVXQnLvL+uWo~o;AW3auXJsH~Wo~71VRU6= zAYyqSM^H>4M`&+zbaP{JX>fEPC}d@JX=7zQaBgjKVRtDC2Pe+(0000qbVXQnaAamW zNNG}Kb3$)*Ze(e0XF_jy05dT*E;%5@PE;ltao2<4} v0000KbVXQnaAamWR%LQ?X>V=-P((&8F)lL-h`nWL00000NkvXXu0mjfnPGIR diff --git a/doc/images/gtsam-structure.graffle b/doc/images/gtsam-structure.graffle deleted file mode 100644 index 22eb72dc3..000000000 --- a/doc/images/gtsam-structure.graffle +++ /dev/null @@ -1,1302 +0,0 @@ - - - - - ActiveLayerIndex - 0 - ApplicationVersion - - com.omnigroup.OmniGraffle - 138.14.0.129428 - - AutoAdjust - - BackgroundGraphic - - Bounds - {{0, 0}, {559.29, 782.89}} - Class - SolidGraphic - ID - 2 - Style - - fill - - GradientColor - - w - 0.666667 - - - shadow - - Draws - NO - - stroke - - Draws - NO - - - - CanvasOrigin - {0, 0} - CanvasSize - {559.29, 782.89} - ColumnAlign - 1 - ColumnSpacing - 36 - CreationDate - 2010-07-13 00:07:47 -0400 - Creator - Frank Dellaert - DisplayScale - 1 0/72 in = 1 0/72 in - FileType - flat - GraphDocumentVersion - 6 - GraphicsList - - - Class - LineGraphic - Head - - ID - 19 - - ID - 35 - Points - - {191.649, 522.933} - {191.649, 558.208} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 34 - - - - Bounds - {{156.649, 558.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 19 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 tests} - - - - Class - Group - Graphics - - - Class - LineGraphic - Head - - ID - 30 - - ID - 22 - Points - - {220.827, 437.595} - {201.125, 473.266} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 25 - - - - Class - LineGraphic - Head - - ID - 28 - - ID - 23 - Points - - {198.977, 245.588} - {219.976, 281.282} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 33 - - - - Class - LineGraphic - Head - - ID - 25 - - ID - 24 - Points - - {234.015, 373.654} - {229.931, 409.211} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 27 - - - - Bounds - {{193.649, 409.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 25 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 nonlinear} - - - - Class - LineGraphic - Head - - ID - 27 - - ID - 26 - Points - - {230.126, 309.655} - {233.82, 345.213} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 28 - - - - Bounds - {{200.649, 345.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 27 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 linear} - - - - Bounds - {{193.649, 281.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 28 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 inference} - - - - Class - LineGraphic - Head - - ID - 30 - - ID - 29 - Points - - {152.743, 373.628} - {188.492, 473.239} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 32 - - - - Bounds - {{158.649, 473.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 30 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 slam} - - - - Class - LineGraphic - Head - - ID - 32 - - ID - 31 - Points - - {185.872, 245.631} - {152.363, 345.234} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 33 - - - - Bounds - {{112.649, 345.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 32 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 geometry} - - - - Bounds - {{155.649, 217.708}, {70, 27.449}} - Class - ShapedGraphic - ID - 33 - Shape - Rectangle - Text - - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural - -\f0\fs24 \cf0 base} - - - - ID - 21 - - - Bounds - {{86.649, 196.433}, {210, 326}} - Class - ShapedGraphic - ID - 34 - Shape - Rectangle - Style - - Text - - Align - 0 - Text - {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0\fs24 \cf0 gtsam} - - TextPlacement - 0 - - - GridInfo - - GuidesLocked - NO - GuidesVisible - YES - HPages - 1 - ImageCounter - 3 - KeepToScale - - Layers - - - Lock - NO - Name - Layer 1 - Print - YES - View - YES - - - LayoutInfo - - Animate - NO - AutoLayout - 2 - LineLength - 0.4643835723400116 - circoMinDist - 18 - circoSeparation - 0.0 - layoutEngine - dot - neatoSeparation - 0.0 - twopiSeparation - 0.0 - - LinksVisible - NO - MagnetsVisible - NO - MasterSheets - - ModificationDate - 2010-07-13 00:17:24 -0400 - Modifier - Frank Dellaert - NotesVisible - NO - Orientation - 2 - OriginVisible - NO - OutlineStyle - Basic - PageBreaks - NO - PrintInfo - - NSBottomMargin - - float - 41 - - NSLeftMargin - - float - 18 - - NSPaperSize - - size - {595.29, 841.89} - - NSRightMargin - - float - 18 - - NSTopMargin - - float - 18 - - - PrintOnePage - - QuickLookPreview - - JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls - dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlV8tuWzcQ3d+v4NJemCZn+NzWbYF6 - 1dQCuii6cAW5kSHZjeQW6N/3DHl5TclXUoNYSOQwnPeZM8Mv6pP6ogw+3mcVE6ndSv2q - XtTt3d6q5V7Z8tkv1Y3RXhnN2RjrglzXVCR0yhAantTtz6vdcvXX29+PG7VbQy0xFdXs - kopeB5dyVuS8dj6q5Vbd/rS16vvX4kKuV71R1jlczcoTaZusH+pNmrlpbLnJ2ZWbo865 - my6WmxTCJZ2Jyk3n0yWdKR9YP+PnqJPZXNKJ5EjsiHvGz9tfVpvHt/U/q7vXzetuvV29 - 7dZLSXUKkCrJDaYkl6xRTEGK+YQC3is7PNeS3j2Ukhj1cIcK2fKPG/lC7aWSSPakzeag - HbOq2rzO+JFSP6BiwAcJPowCNjpFNteaOOJW5u8Wytbq3uD7xhqDv1xUi+1w+6PVqLha - PKnf1NWf14IyUldv10AavveP7WR7rX5Xi3v1w6LaPsSm9TVtnqOOTF5Foyhqh5zEoeSg - 87APtQmShaBJB4KSvINIh+NITamV9/ZUpKyNNdEph1hVH+tw9UeLbApxvzofox2BafJX - xjgKMrD11TGOfXO6muRPxzjVE5HVwr62X7bTUav17t8+/Jl6SX/Z5HWKRIVFAluncIbi - ewtkMuM/vUlq0+pWUCLkVlBqPekcgHHHGRULaRDhpDkA484FbRJaZoMzZDoGj7MIzHtR - +LmcHkjD9BMU3+PP8zDjr7TSZJId2oHBh51J5qCTwKMzyezQhY6GA5OdtCDSlg/QKN4L - XRDo4hj3U+8PVj33HXqI/6rARb6MDXR6H6fNXI3nidCPOx15DDHHj/hHa2+uh4qJqQEO - evxMQqNjpxgeB8QtCQUowCdpcIF1JuNPAiBFAQgptmhZzqkIo8bRepxlnRNGGqoBKmRC - ERi0kH2gCoAZ6QkAJxM8Cg0uCkvAtvg7mnQBgDTRdiaVC05n5hFzzWQn/TD0ABhrUOon - xBcQBH7SRH8TDICZWRiUtmqlFBwJDc6qOSDDI9onGoEEjzHdRekRGAhTHf1Fc2BYN1p4 - ab88jRNg1VCymwhjurM8T5hkKj+7Rpgfgjo7Gpr4RJsfxPsBMcyMQgIfSXcekqfRxgAG - C3RvPxSRnYg1SSZFPxWvNuuX1ePuWi2e6+w70Rckq4VklxFt8NC0lfVLxxziIMTIwZ/s - C2LpJZCTEKMPkYswpgXYqZBgYicsRZR1soRGAzGSdaLwM8x8lL7YF01oEGpjotibFH+N - 98LFzWQh9xBLDJ3JTnq2L0rxvr0vCoS+qS8Y6/J7X8xjoHSIR4jH68LVy+vLBxyA1mWu - He1uhPlhrOfKj94J3xBjyQqgRc5Zc/RCZ2Mv1wE5jAOygMhFXMS2DhwIuRaFiF9xYm0j - VRwkzEpjy1nysfJjkx466f+BA+BWTDoTBQf5wCT8jTYGDEPhl2oSZ4ap8mMz2UvXAYmN - 9xzdJXB+AEliJfIpyRYBOIPq8S6hiK5xmcckEcaCsdg4vGGN+77cjdo76waPORKClZlB - 2LI44hZ40OaxM2Zkz2ZEaHMySFHeF2gyOasG4ZzVSIVMjNEgRacplpmHvmgGmyw2nAv5 - kC2FyOiEFnRYn30GPnBksO5bizPMo2AMowaiiQxpA5ooI5RSKPVCzNi8I86w0OAxJt5J - thJaWMZqdCC8QhWjNAYr4qjSZxNSvGsmZQgGwwWVzaTDg854EwUizaSsAdZhBvYmVSdd - UyJbVNmh5PGEJxceO8c7VB0Q5f00j6a641UFHsvYuf16bkS01xJeWEIPou5obMryHtF+ - PScM9bnUNudpMu7byf7CKl3cLg+1FAZ5Z2PjQNGrNxj/mB+ahe+OiKIwjuSsynogJ6CB - sD2JsDzbkx+EMcqZLFKyFUBPd4ZNekb6LArqiiLvSvHNh+rbu8ne38lkF8O7yaGTFhR8 - +g8FPYzxCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iagoxNDU4CmVuZG9iagozIDAgb2Jq - Cjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNlcyA3IDAgUiAvQ29u - dGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNTU5LjI5IDc4Mi44OV0KPj4KZW5kb2Jq - CjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAv - SW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMSA4IDAgUgovQ3MyIDEzIDAgUiA+PiAv - Rm9udCA8PCAvRjEuMCAxNCAwIFIgPj4gL1hPYmplY3QgPDwgL0ltMSA5IDAgUiAvSW0y - IDExIDAgUgo+PiA+PgplbmRvYmoKOSAwIG9iago8PCAvTGVuZ3RoIDEwIDAgUiAvVHlw - ZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDQ2NCAvSGVpZ2h0IDY5NiAv - SW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAxNSAwIFIgL0ludGVudCAvUGVyY2Vw - dHVhbCAvU01hc2sgMTYgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxh - dGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCBAAAAAMOg+VNf4QCFUGHAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAwDswyVIAAQplbmRzdHJlYW0KZW5kb2Jq - CjEwIDAgb2JqCjQyNDgKZW5kb2JqCjExIDAgb2JqCjw8IC9MZW5ndGggMTIgMCBSIC9U - eXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTg0IC9IZWlnaHQgMTAw - IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNlIDE1IDAgUiAvSW50ZW50IC9QZXJj - ZXB0dWFsIC9TTWFzayAxOCAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9G - bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIAB - AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg - wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM - GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB - AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg - wIABAwYMGDBgwIABAwYMGDBgwIABA48DA9egAAEKZW5kc3RyZWFtCmVuZG9iagoxMiAw - IG9iagoyNjMKZW5kb2JqCjE2IDAgb2JqCjw8IC9MZW5ndGggMTcgMCBSIC9UeXBlIC9Y - T2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggNDY0IC9IZWlnaHQgNjk2IC9Db2xv - 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 - 5vWrF8uLT+Ye3J4YuzR4KmJ+YPmUp/nrskSnx5ezcj9X8fyXzj++wFvs+Zf/x8namDjz - 61vz66HyL+qav+48NmDu5693Zh49XVp++erN23/8z6ICZoG3b169XF56+mjmzq/mfg4c - 6/y6ue6LcvMLIvML3LgYebL9SyJPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5 - sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypP - NjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJ - Job7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZ - xHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSeb - GO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQT - w33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxi - uK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M - 95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonh - vvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHc - V554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7 - yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBf - eeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4r - T7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33l - ifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK88 - 8T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un - 3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE - +7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554 - H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPv - w5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ9 - 2FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wP - WypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdh - S+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5s - qTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3oct - lSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl - 8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZU - nmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bK - k00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5 - sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypP - NjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJ - Job7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZ - xHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSeb - GO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQT - w33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxi - uK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M - 95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonh - vvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHc - V554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7 - yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBf - eeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4r - T7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33l - ifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK88 - 8T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un - 3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE - +7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554 - H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPv - w5bKk00M95Un3octlSebGO4rT7wPWypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ9 - 2FJ5sonhvvLE+7Cl8mQTw33lifdhS+XJJob7yhPvw5bKk00M95Un3octlSebGO4rT7wP - WypPNjHcV554H7ZUnmxiuK888T5sqTzZxHBfeeJ92FJ5sonhvvLE+7Cl8mQTw33lifdh - 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 - rTtamhvr67ZUhyqChfmG03p7xn/saT1wzQV1GtDM7LyCkvJNoepwTd22+obGpqamZh0b - LGAgGhvqt9XVhKtDm8pLCvKyMw2n01zPjx63a1YeuPHmiZtq3dC8QFFpeUVlqGrzl+Ga - WnPqdP7xBSyHmvCXm6tClRXlpUUB62HrSTVP29Wup/E0FzQh0bEC6s/NDxQWB8s2VlRW - hkKhL3RssYChqKys2FgWLC4M5Of6VzgdiQnmen74+jR/GWq+iAxokiPF5Vnvy/Tn5uUH - CoqKS0qDwbKych0bLFBWFgyWlhQXFQTy83L9mb71HleKw/ysEvvR15D1d9vmgsbExZsb - 6nS507y+DH92jjHN3xAo0LHNAoEN+cYyJ9uf4fOmuV1Oczutp+0q1/M9qHnkJpsr6k5b - b0gzs/xGNSdXxyYL5BhJf1amwVxvNFMcyeZh+ynONWtXbmhcfOKKaKrHY0y96ek+X4aO - TRbw+dLTvcbS40ld0TSfQiucH/zw+f7/SrQCGhtnrqgRdThTXK5Ut9ujY6sF3O5UlyvF - 6TB307qc5t25bu3qnOaJa26o9VVkvUYTk5INqsPpdKbo2GYBw2FQkpOTDKa5m5bmpzmt - j6J3oobUmBrUlZOkY5MF3oMkWJZxsX+rufKZa4mui4mJibVQdWy5gKGMsa4mvJvv36LW - JV0xtf55c8z/Usc2C7wzWflPw/S/ZP/JfzH/vI5NF/hP/PTPaAEtoAW0gBbQAlpAC2gB - /gX+B05tLvoKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9iago2NTUwCmVuZG9iagoxOCAw - IG9iago8PCAvTGVuZ3RoIDE5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h - Z2UgL1dpZHRoIDE4NCAvSGVpZ2h0IDEwMCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAv - SW50ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRl - RGVjb2RlID4+CnN0cmVhbQp4Ae2b+VeS6RvGrdxARBAERRQFXAAVUQrFUgwzUcxdcVwG - Qx1pMKqRkaPlkilFrpnjMu7jMuo4Wk46TXXmX/vezwuVC1Jzjt/HfuD6Jc/hxPvx6n5f - 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 - TS+So592fgU1op5G9NOgWuds1p2CDSMOM04064g+IAn1AYlGILTzcIu4NJn0VX1AdHMS - 5KgU6OP7uYDprEPi/gPql0T/kqiOnmq28wPUWdJFfddzL7wCwse665FU1fHP+s/oyPbD - wtkxPnxd+BmM/Brow78L+ivnqcMsnp89Dngc8DjgceCoA/8DzflMvgplbmRzdHJlYW0K - ZW5kb2JqCjE5IDAgb2JqCjI4MjgKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEg - MCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl - ID4+CnN0cmVhbQp4AYVUz2sTQRT+Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQ - ZDNJ1m426+4mtaWI5OLRKt5F7aEH/4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z - 3jfvfW923wANctI09YAE5A3HUqIRaWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+B - W1bDe/t3snetmtK2mgeE/UDgR5rZKrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUP - Kz3EWSJ8QDUtzn9NuFPNJdNAg0g4lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO - 9g6QvZ30fk6z3j7CIcILGa0/RriNnvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBN - J6JUcdkuDfGYrv1W8kqCcJA4ymRhgHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3v - RdoCrzAOHQwaDJoNSFAQRQRhmLBQQIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23 - UaTdPP4oInGUQ7UIkvxB/iqvyU/lefnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58 - ldR2k1dHlqx5erya7Bo/7FeXMeaCNY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/ - Oz3iLs8utdZzrYmLN1abl2f9akj77qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS - 2EurC+JgbccInZWGKdJtkfok1WBgmrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v - +o/bx/wX5PeK558oAi9s4MiZum1Tce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1 - nyC8ARx2h3oe6CmY05aWzTlShyyfk7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4c - oTlC98SnSmWT+q/xEbD9sFL5+axS2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2Jq - CjIxIDAgb2JqCjczNwplbmRvYmoKOCAwIG9iagpbIC9JQ0NCYXNlZCAyMCAwIFIgXQpl - bmRvYmoKMjIgMCBvYmoKPDwgL0xlbmd0aCAyMyAwIFIgL04gMSAvQWx0ZXJuYXRlIC9E - ZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVST0gUURz+ - zTYShIhBhXiIdwoJlSmsrKDadnVZlW1bldKiGGffuqOzM9Ob2TXFkwRdojx1D6JjdOzQ - oZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7fe0RtnabvOylBVHNDlSulp25OTYuD - HylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYAH5mf - KGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6LtYmD - /lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQSgZS - NWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7Yf9b - UcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x - 1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU0DwJ - WBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx2 - 13t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+azEyw - DCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhTa7o5 - eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ - /klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+j - SfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2JqCjIz - IDAgb2JqCjcwNAplbmRvYmoKMTMgMCBvYmoKWyAvSUNDQmFzZWQgMjIgMCBSIF0KZW5k - b2JqCjI0IDAgb2JqCjw8IC9MZW5ndGggMjUgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2 - aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AdWWd1gTSR/HZ3fT - Cy0QWoDQe+8gvQYQkCqISkgooYQQioDYkMMTPAsqImABPRBR8CyAnAURxcIhYK8X5BBQ - z8OCqKi5Dbx4/vHef+8/7+yzM5/9zm9/Mzsz+zxfACg9bIEgHZYBIIOfIwzz82Qujoll - 4h8AHGAAMpAFMmxOtsAjNDQI/Gt5fwdAks6bppJc/xr23ztkuYnZHACgULQ7gZvNyUD5 - JMpfOQJhDgCwhAdW5AhQRkpQlheiE0S5SsLJc3xEwglz3DUbExHmhcbcAoBAYbOFyQCQ - RajOzOMko3koKAILPpfHR9kCZVdOCpuLsgBlk4yMTAnXomyQ8F2e5O+YzU74lpPNTv7G - c9+CvokO7M3LFqSzC2Yf/pdVRnouul6zRQ6tKfz04CC0paP3OJftHTjPgvTZPZvVE/mR - 4fM6PyE4ZJ6ThL5h8yzI8fyOQyPm9cIUr+B5Tsz2+ZYnlR0g2bPZ/MLcsMh5zs4L95nn - wpSI6HnmJnp/05N4vqx5nZfD+jZWWmbgtzkAb+ADgtCLCayAxezlC9ARcxLz0T0EwCtT - UCDkJafkMD3QU5dowmTxOWYmTCsLS8mW/v8Uyf82N9u3N2b/I0hJcpT/o+UvAcBdGT3L - 0/9oUej53zsEgOKtfzQDTQA0FQBoT+DkCvPm8mEkDRaQgDSQB8pAHWgDA2CKrqYdcAbu - 6OoGgBAQAWLAMsABKSADCMEKUATWgVJQDraCnaAa7AMHwCFwFBwH7eAMuAAug+tgANwG - D4EIjIIXYBK8BzMQBOEhKkSDlCENSBcyhqwgB8gV8oGCoDAoBoqHkiE+lAsVQeuhcqgC - qobqoCboF+g0dAG6Cg1C96FhaAJ6A32CEZgCy8NqsB5sDjvAHnAgHAEvhZPhLLgQLoE3 - w1VwPXwEboMvwNfh27AIfgFPIQAhI3REEzFFHBAvJASJRZIQIbIaKUMqkXqkBelEepGb - iAh5iXzE4DA0DBNjinHG+GMiMRxMFmY1ZhOmGnMI04bpwdzEDGMmMV+xVCwDa4x1wrKw - i7HJ2BXYUmwltgF7CnsJexs7in2Pw+HoOH2cPc4fF4NLxa3EbcLtwbXiunCDuBHcFB6P - V8Yb413wIXg2Pgdfit+NP4I/jx/Cj+I/EMgEDYIVwZcQS+ATigmVhMOEc4QhwhhhhihD - 1CU6EUOIXGIBcQvxILGTeIM4SpwhyZL0SS6kCFIqaR2pitRCukR6RHpLJpO1yI7kRWQe - eS25inyMfIU8TP5IkaMYUbwocZRcymZKI6WLcp/ylkql6lHdqbHUHOpmahP1IvUJ9YMU - TcpMiiXFlVojVSPVJjUk9UqaKK0r7SG9TLpQulL6hPQN6ZcyRBk9GS8ZtsxqmRqZ0zJ3 - ZaZkabKWsiGyGbKbZA/LXpUdl8PL6cn5yHHlSuQOyF2UG6EhNG2aF41DW087SLtEG5XH - yevLs+RT5cvlj8r3y08qyCnYKEQp5CvUKJxVENERuh6dRU+nb6Efp9+hf1JUU/RQTFTc - qNiiOKQ4raSq5K6UqFSm1Kp0W+mTMlPZRzlNeZtyu/JjFYyKkcoilRUqe1UuqbxUlVd1 - VuWolqkeV33AgBlGjDDGSsYBRh9jSk1dzU9NoLZb7aLaS3W6urt6qvoO9XPqExo0DVcN - nsYOjfMaz5kKTA9mOrOK2cOc1GRo+mvmatZp9mvOaOlrRWoVa7VqPdYmaTtoJ2nv0O7W - ntTR0FmoU6TTrPNAl6jroJuiu0u3V3daT18vWm+DXrveuL6SPku/UL9Z/5EB1cDNIMug - 3uCWIc7QwTDNcI/hgBFsZGuUYlRjdMMYNrYz5hnvMR40wZo4mvBN6k3umlJMPUzzTJtN - h83oZkFmxWbtZq/MdcxjzbeZ95p/tbC1SLc4aPHQUs4ywLLYstPyjZWRFceqxuqWNdXa - 13qNdYf1axtjm0SbvTb3bGm2C2032HbbfrGztxPatdhN2OvYx9vX2t91kHcIddjkcMUR - 6+jpuMbxjONHJzunHKfjTn85mzqnOR92Hl+gvyBxwcEFIy5aLmyXOheRK9M13nW/q8hN - 043tVu/21F3bneve4D7mYeiR6nHE45WnhafQ85TntJeT1yqvLm/E28+7zLvfR84n0qfa - 54mvlm+yb7PvpJ+t30q/Ln+sf6D/Nv+7LDUWh9XEmgywD1gV0BNICQwPrA58GmQUJAzq - XAgvDFi4feGjYN1gfnB7CAhhhWwPeRyqH5oV+usi3KLQRTWLnoVZhhWF9YbTwpeHHw5/ - H+EZsSXiYaRBZG5kd5R0VFxUU9R0tHd0RbRosfniVYuvx6jE8GI6YvGxUbENsVNLfJbs - XDIaZxtXGndnqf7S/KVXl6ksS192drn0cvbyE/HY+Oj4w/Gf2SHsevZUAiuhNmGS48XZ - xXnBdefu4E4kuiRWJI4luSRVJI0nuyRvT55IcUupTHnJ8+JV816n+qfuS51OC0lrTBOn - R6e3ZhAy4jNO8+X4afyeTPXM/MxBgbGgVCDKcsramTUpDBQ2ZEPZS7M7cuRRY9OXa5D7 - Q+5wnmteTd6HFVErTuTL5vPz+wqMCjYWjBX6Fv68ErOSs7K7SLNoXdHwKo9Vdauh1Qmr - u9dorylZM7rWb+2hdaR1aet+K7Yorih+tz56fWeJWsnakpEf/H5oLpUqFZbe3eC8Yd+P - mB95P/ZvtN64e+PXMm7ZtXKL8sryz5s4m679ZPlT1U/izUmb+7fYbdm7FbeVv/XONrdt - hypkKworRrYv3N62g7mjbMe7nct3Xq20qdy3i7Qrd5eoKqiqY7fO7q27P1enVN+u8axp - rWXUbqyd3sPdM7TXfW/LPrV95fs+7eftv1fnV9dWr1dfeQB3IO/As4NRB3t/dvi5qUGl - obzhSyO/UXQo7FBPk31T02HG4S3NcHNu88SRuCMDR72PdrSYttS10lvLj4Fjucee/xL/ - y53jgce7TzicaDmpe7L2FO1UWRvUVtA22Z7SLuqI6Rg8HXC6u9O589SvZr82ntE8U3NW - 4eyWc6RzJefE5wvPT3UJul5eSL4w0r28++HFxRdv9Szq6b8UeOnKZd/LF3s9es9fcbly - 5qrT1dPXHK61X7e73tZn23fqN9vfTvXb9bfdsL/RMeA40Dm4YPDckNvQhZveNy/fYt26 - fjv49uCdyDv37sbdFd3j3hu/n37/9YO8BzMP1z7CPip7LPO48gnjSf3vhr+3iuxEZ4e9 - h/uehj99OMIZefFH9h+fR0ueUZ9VjmmMNY1bjZ+Z8J0YeL7k+egLwYuZl6V/yv5Z+8rg - 1cm/3P/qm1w8Ofpa+Fr8ZtNb5beN72zedU+FTj15n/F+Zrrsg/KHQx8dPvZ+iv40NrPi - M/5z1RfDL51fA78+EmeIxQK2kD3rBRC0hpOSAHjTCAA1BgDaAACkrjk/PBuBOvhh/3n6 - N57zzLNRdgDUuQMgsXdBXQDsQls99JmBthJbiFo6eO0/N6pISnaStdUsQBQV1Jp0icVv - xADg4wH40i8Wz1SJxV8qUa/zDoDzwXM+XBItg/r7/YiFjW9QZ6bb7OvfV38DJafpNwpl - bmRzdHJlYW0KZW5kb2JqCjI1IDAgb2JqCjI2NjMKZW5kb2JqCjE1IDAgb2JqClsgL0lD - Q0Jhc2VkIDI0IDAgUiBdCmVuZG9iago0IDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVk - aWFCb3ggWzAgMCA2MTIgNzkyXSAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gPj4KZW5k - b2JqCjI2IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9PdXRsaW5lcyAyIDAgUiAvUGFn - ZXMgNCAwIFIgL1ZlcnNpb24gLzEuNCA+PgplbmRvYmoKMiAwIG9iago8PCAvTGFzdCAy - NyAwIFIgL0ZpcnN0IDI4IDAgUiA+PgplbmRvYmoKMjggMCBvYmoKPDwgL1BhcmVudCAy - OSAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzgyLjg5IDAgXSAvVGl0 - bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKMjkgMCBvYmoKPDwgPj4KZW5kb2JqCjI3IDAg - b2JqCjw8IC9QYXJlbnQgMjkgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAw - IDc4Mi44OSAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjMwIDAgb2JqCjw8 - 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 - dCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9G - b250TmFtZSAvR0lTVklCK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAv - TWF4V2lkdGggMTUwMCAvWEhlaWdodCA2MzcgL0ZvbnRGaWxlMiAzMCAwIFIgPj4KZW5k - b2JqCjMzIDAgb2JqClsgNTU2IDU1NiA1MDAgMCA1NTYgMjc4IDU1NiAwIDIyMiAwIDAg - MjIyIDgzMyA1NTYgNTU2IDAgMCAzMzMgNTAwIDI3OCAwIDAKMCAwIDUwMCBdCmVuZG9i - agoxNCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VG - b250IC9HSVNWSUIrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgozMiAwIFIgL1dpZHRo - cyAzMyAwIFIgL0ZpcnN0Q2hhciA5NyAvTGFzdENoYXIgMTIxIC9FbmNvZGluZyAvTWFj - Um9tYW5FbmNvZGluZwo+PgplbmRvYmoKMzQgMCBvYmoKKE1hYyBPUyBYIDEwLjYuNCBR - dWFydHogUERGQ29udGV4dCkKZW5kb2JqCjM1IDAgb2JqCihEOjIwMTAwNzEzMDQxODIy - WjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDM0IDAgUiAvQ3JlYXRp - b25EYXRlIDM1IDAgUiAvTW9kRGF0ZSAzNSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzNgow - MDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMjgyNzAgMDAwMDAgbiAKMDAwMDAyMTQwMiAw - MDAwMCBuIAowMDAwMDAxNTc0IDAwMDAwIG4gCjAwMDAwMjEyMzkgMDAwMDAgbiAKMDAw - MDAwMDAyMiAwMDAwMCBuIAowMDAwMDAxNTU0IDAwMDAwIG4gCjAwMDAwMDE2ODQgMDAw - MDAgbiAKMDAwMDAxNzUxNCAwMDAwMCBuIAowMDAwMDAxODU3IDAwMDAwIG4gCjAwMDAw - MDYzMjUgMDAwMDAgbiAKMDAwMDAwNjM0NiAwMDAwMCBuIAowMDAwMDA2ODMwIDAwMDAw - IG4gCjAwMDAwMTgzNzggMDAwMDAgbiAKMDAwMDAyODAwMSAwMDAwMCBuIAowMDAwMDIx - MjAyIDAwMDAwIG4gCjAwMDAwMDY4NTAgMDAwMDAgbiAKMDAwMDAxMzU5MiAwMDAwMCBu - IAowMDAwMDEzNjEzIDAwMDAwIG4gCjAwMDAwMTY2MzMgMDAwMDAgbiAKMDAwMDAxNjY1 - NCAwMDAwMCBuIAowMDAwMDE3NDk0IDAwMDAwIG4gCjAwMDAwMTc1NTAgMDAwMDAgbiAK - MDAwMDAxODM1OCAwMDAwMCBuIAowMDAwMDE4NDE1IDAwMDAwIG4gCjAwMDAwMjExODEg - MDAwMDAgbiAKMDAwMDAyMTMyMiAwMDAwMCBuIAowMDAwMDIxNTY4IDAwMDAwIG4gCjAw - MDAwMjE0NTAgMDAwMDAgbiAKMDAwMDAyMTU0NiAwMDAwMCBuIAowMDAwMDIxNjY0IDAw - MDAwIG4gCjAwMDAwMjc2NTUgMDAwMDAgbiAKMDAwMDAyNzY3NiAwMDAwMCBuIAowMDAw - MDI3OTAxIDAwMDAwIG4gCjAwMDAwMjgxNzYgMDAwMDAgbiAKMDAwMDAyODIyOCAwMDAw - MCBuIAp0cmFpbGVyCjw8IC9TaXplIDM2IC9Sb290IDI2IDAgUiAvSW5mbyAxIDAgUiAv - SUQgWyA8NjJjM2U5NGRkYzI0MzQ5YjFiNDQ0MjFmMDRiOTg4MzE+Cjw2MmMzZTk0ZGRj - MjQzNDliMWI0NDQyMWYwNGI5ODgzMT4gXSA+PgpzdGFydHhyZWYKMjgzNDUKJSVFT0YK - MSAwIG9iago8PC9BdXRob3IgKEZyYW5rIERlbGxhZXJ0KS9DcmVhdGlvbkRhdGUgKEQ6 - MjAxMDA3MTMwNDA3MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSA1LjIuMikvTW9kRGF0 - ZSAoRDoyMDEwMDcxMzA0MTcwMFopL1Byb2R1Y2VyIDM0IDAgUiA+PgplbmRvYmoKeHJl - ZgoxIDEKMDAwMDAyOTIyMyAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8NjJjM2U5NGRk - YzI0MzQ5YjFiNDQ0MjFmMDRiOTg4MzE+IDw2MmMzZTk0ZGRjMjQzNDliMWI0NDQyMWYw - NGI5ODgzMT5dIC9JbmZvIDEgMCBSIC9QcmV2IDI4MzQ1IC9Sb290IDI2IDAgUiAvU2l6 - ZSAzNj4+CnN0YXJ0eHJlZgoyOTM3MwolJUVPRgo= - - QuickLookThumbnail - - TU0AKgAABZyAP+BP8AQWDQeEQmFQuGQ2HQ+IRGJROFwOCQZsRkAQOKR2PR+QSGJxaDtC - TAB+SkABmWAABS8APiZAAETWVy2RTmdTuIySDLigAB20MABSjRuBAB90sABKnAAd1GeV - OqVSfQVn1kACOuAAHV+q2GxWODVcANe0AAU2uyRiNRy2wgA3MACi7XGEWa0Ne1Wy43u+ - imEYCXgIAAXEAB/YsAPrHAAVZGIYC14K8WW4QXKX625vLQZwaEAOPSS6YUt9gB+6sAEP - XZO05XL5ikwbPXjb7Oz7HOZe9bzP2SMtikReHPnkAAD8uYzPCgADdGGXMA3W77rf3zZb - qJtrvAATeGUSpveUACH0YfE9yHdnA+yHPb5AB0/Xz+mD0N2gD5PYAA7AD4Ia9ztwEhR0 - QQ9QCgACcGoYbsIAADEJgABcLQMg8CN7DCDO8bT7hDBSGHrEgAGrE4ABfFTlOZAUNODA - 0SHqAB1RrECKDdHIACVHgACRH8DRfDiCnPIsWAOpqnoO4bioQ5B8gAeUpAACsqpA6jrB - QikhSHDwABFMAAAJMaEGnMzwPEeE1AAC02ybLDMoLLEsIO3KJS4+EZAAdc+AAEE/oYY9 - BAAd1CgBNR4AActFgADVHREmR8K8sEEHQAA00wwbgS3OM7PZIpzyPJIJIZT03rojk6No - AFVM1TaR07V74S9MARTFMiF1MsVdPbWLtQ2uM9T4dc/UAh8mTiiFhypKyHywu0tVg2tX - V/GC41BUSnVIuLQnBYoQLxPDLmzcitq7MYCLwbl1gAEl3XDXz3riel6KEogP3w7kmWhe - Fpt3aq8EFgQAB/guCYMuL+gAM+GAASWHgACOJLHcSxlTi4ACfjSaJs3Ra4+AAgZFCsLr - Fislrffy8We663OJZKxZZaNe39XlqQlChw51SYHAAeef59oCjApQlDAZo+I4nAAO01gE - 603CBu6CecRaOBgAHjrKiqPRwNVLWUB3jAqEsBdAAGbtFvsUxgIbaAFsQsBecAwADym8 - AAhbzpt5NtTZzb+AFKtU1iONIcYACJxIAAfxmv6dmjjX/vmybA3HK5sqnMQzsVgZdJqP - ykeWeIhmSEWRlSFz1uKKdKh+TrCcXYgBtoIdG3Wo3MEd+8jzSeayeMoynpd9I1fi49eq - qOS8EvmNMwy4y88ITd3p/HsvRZygABXt6SCKx2wZXw4zjfj85ay23oegAHZ9m1LFuwAE - z+QAET+vqb76zuS89EQsRBZC3TuRIYYsfyTQBwHdIXR4yd3zIGcE2ZobjgAAngoqxVBS - XBITbonBlRz3quTIg8gvCkVFKMK47ohaghjwleyoUdxCEqgVT2n1qyh01gXhwAAKcO29 - tjhDA1IbuANxDY4AiHrnWwwCVbEd88SXeOVQE+wdjgx+gAhwBd0zKYBMxgUy0nsQEOGo - AAN+MiaHpkThI9h3KQYwJDIKt1ZkMnVkPjgxJ7zjAHxsZrFBDg74/AAHvIFRqjyFs/ao - stWsboRICNXFVdY3IJwVIW7iDTJG5JDkWhwQsmwAA2k8AAIsoQACqlIACPw72FsNjcbS - J7+S4wBIYtg+o6QAAwlsAAYEuQAAsl41tohB3WmzkyVV3pO5ilWja5Z/MKjGmPdCAABM - 0QAA4moACGquY+FkmG5lyr8EnyAkESwDLi3GvbAVBKHz5Y9yuM7Nmbk7JtTJlfFplcXW - Zm+nlKufRO5tz7n9Axf0sJ/0DJEWaghD41RDA3QcirMKGELoTESh5eaHUTIRRGhdFpWU - aIbRijhBaDUfIMjkNwAAo0nAAEGlVFqQoYoEQ6R5N5xxzIdMGfDqEMTHJzTonlLUDG3m - eMSoUFjqnRAMqIHlSTYTwYpRVARt4CAAXINl51FCCQLIbTyflTj4VaJBV4nNPkBUvLJT - Z+9Iq0EOICAADwEAAAMAAAABACUAAAEBAAMAAAABAEMAAAECAAMAAAAEAAAGVgEDAAMA - AAABAAUAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAAB - AAQAAAEWAAMAAAABAEMAAAEXAAQAAAABAAAFlAEcAAMAAAABAAEAAAE9AAMAAAABAAIA - AAFSAAMAAAABAAEAAAFTAAMAAAAEAAAGXodzAAcAAAzEAAAGZgAAAAAACAAIAAgACAAB - AAEAAQABAAAMxGFwcGwCEAAAbW50clJHQiBYWVogB9oABgAcAAsAEQAQYWNzcEFQUEwA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAABiZHNj - bQAAAbQAAAD+Y3BydAAAArQAAADQd3RwdAAAA4QAAAAUclhZWgAAA5gAAAAUZ1hZWgAA - A6wAAAAUYlhZWgAAA8AAAAAUclRSQwAAA9QAAAgMYWFyZwAAC+AAAAAgdmNndAAADAAA - AAAwbmRpbgAADDAAAAA+Y2hhZAAADHAAAAAsbW1vZAAADJwAAAAoYlRSQwAAA9QAAAgM - Z1RSQwAAA9QAAAgMYWFiZwAAC+AAAAAgYWFnZwAAC+AAAAAgZGVzYwAAAAAAAAAIRGlz - cGxheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAEgAAAAxu - bE5MAAAAFgAAAOhkYURLAAAAFgAAAOhwbFBMAAAAFgAAAOhlblVTAAAAFgAAAOhuYk5P - AAAAFgAAAOhmckZSAAAAFgAAAOhwdEJSAAAAFgAAAOhwdFBUAAAAFgAAAOh6aENOAAAA - FgAAAOhlc0VTAAAAFgAAAOhqYUpQAAAAFgAAAOhydVJVAAAAFgAAAOhzdlNFAAAAFgAA - AOh6aFRXAAAAFgAAAOhkZURFAAAAFgAAAOhmaUZJAAAAFgAAAOhpdElUAAAAFgAAAOhr - b0tSAAAAFgAAAOgARABFAEwATAAgADIAMAAwADAARgBQAAB0ZXh0AAAAAENvcHlyaWdo - dCBBcHBsZSwgSW5jLiwgMjAxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPPP - AAEAAAABGGJYWVogAAAAAAAAeFsAAEAZAAAD91hZWiAAAAAAAABWWgAAntIAABfUWFla - IAAAAAAAACghAAAhFQAAt2JjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy - ADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0A - sgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+ - AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoC - AwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1 - AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAE - LQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWW - BaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0H - TwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6 - CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kL - gAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34 - DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ - 1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPl - FAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EX - ZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsU - GzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMf - Ph9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOU - I8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8o - cSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12 - Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz - DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjI - OQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/ - IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWa - Rd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJM - uk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2 - VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb - 5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2Pr - ZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFds - r20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWF - deF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/ - I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjO - iTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOT - TZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3S - nkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSp - N6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSc - tRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA - 7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01 - zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHa - dtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep - 6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD1 - 3vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAAC - ZmYAAPKnAAANWQAAE9AAAArAdmNndAAAAAAAAAABAADhSAAAAAAAAQAAAADhSAAAAAAA - AQAAAADhSAAAAAAAAQAAbmRpbgAAAAAAAAA2AAChQAAAVwAAAEzAAACXAAAAJkAAABwA - AABQAAAAVAAAAoAAAAKAAAACgAAAAAAAAAAAAHNmMzIAAAAAAAEMGgAABcD///L/AAAH - YAAA/c7///uY///9lgAAA/QAAL9ObW1vZAAAAAAAABCsAACgAzA0Rky6bz8AAAAAAAAA - AAAAAAAAAAAAAA== - - ReadOnly - NO - RowAlign - 1 - RowSpacing - 36 - SheetTitle - Canvas 1 - SmartAlignmentGuidesActive - YES - SmartDistanceGuidesActive - YES - UniqueID - 1 - UseEntirePage - - VPages - 1 - WindowInfo - - CurrentSheet - 0 - ExpandedCanvases - - FitInWindow - - Frame - {{470, 267}, {700, 891}} - ListView - - OutlineWidth - 142 - RightSidebar - - Sidebar - - SidebarWidth - 138 - VisibleRegion - {{1, 1}, {558, 782}} - Zoom - 1 - ZoomValues - - - Canvas 1 - 0.0 - 1 - - - - saveQuickLookFiles - YES - - diff --git a/doc/images/gtsam-structure.pdf b/doc/images/gtsam-structure.pdf deleted file mode 100644 index 37c2ed3c126960bfdc9dfdb60a37dee28a2e289c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29463 zcmeHw1yq&K);B4g5=zLSJI;2YUcj;2kdG?ukW}ZFs{PxV=d-f)m6BeZhGB6{OcdqWQZsZ-jdf(ZN$O2#j z*cwX{GOEENpCOYh(=I<3n_Gaxm7nMs$Nr zOOSNb6hRL-IZ+)L)p6t5>A`_kHWDd!!9rSz2~miVCKJNGNiSRDbD-Cj^v%blU0GjW z-yT~#d@4^gfotrffbZ<-TK;wKmDL5oqX}sVu0s5jl4IpAwVEOt+&oF;iy9AwTK=+= z$PIqo8;@z13luocow%hHA^Ax&e2K1h%h*c$ul9L1J|EPNt|SjME}BR3wSr3cl+ubK zv|A_AY>v#QzouGi1}R>xt1x`feRY18x#W~rlT@NykGW>r9gxOw$PKsCAu`rJv?PUp za5?a_p(;Ft#yT6JBQs~gD(ls?iV>*kvin@2kbglo-9CAZ+UCa$58{k$;gD3Rf%; z1PQ9jE)IJT+hOJ`rT*f=CdW#51>bvK&G3}csOE!nEx(3!UC&qXtHRRjIu&+NZs#Kp z6r3}6w+E^&Q(xI@&R=<}`6j`px_o^70^!hq#V?Eof3*@d6K|H%&}Ae$(VAdey1A0t z){0xsJ96Q`J_x54u5+go<+`L-Aizcht|{d51UN*!*l{k{8FK+}i=TJkYmKNIr>pf& zPWa4WuyKwL_nt5EfoAU{-Lg%=XcsD#d+WHKK75kF39&0>7sdOQuZ$}RbJZ+R`ZvSo zY%O+iQ3KT8^jDgdj(r#!`)v7XG3TO^g-vS-BUm+rq*!lA1<#_!p!5_9p79x&)m1&C!sP1@DF{rmf1~>7~jv9t8rAu-J`Lj zu4Uq@ICz)LEqg_L&^b+n)6TISIb-FV&Kz_NPj*zt-(p_;;9MyA%+iNWDAQSjtYHOm zQQ7UPN{_4PSYF+tgf`GY~>oFkGh-jI|ZXhyPf@fl6D1;qk z*bck|sV@SS2GrphR(%<8iy7N8YtjH}P4_xjghyuM5unSq`X08~*y+jPlwk($Eeggp zE)i|mn9Ozfo}CFsgq0=<2y{oNg@)q~wRZwP4;e=jc8BmO8^r-v6NV-UvsbUeN zs2|ze&#)0Az=u5JFo$~h!Km$6K}T3Lm0W6XJyBW_UjBnWkUdoPatV_4we$n{=4#7D z9BHK9z6$!2G~-o*3=SwGBSdtwVm;VAim!d7NLx@u-BRMjeGi^)6*D5UiX)nuo3A*2 zmW)EsIo5d57w{6N%i4i1pvsR`mtuqRbG;;K0&|RuPIXpkuN!0m^E0KUd-F{cf~2!D zOaoy|HN=qO4;Cx+cq@Y7#RxNut8>bOGIU69M0B!wx;~8zX4|=owlX;!mEnP)JzqU) zj%&g|e@JB>1?x_jw<9iyw$i7sPmm`mj57aX#d@CvyNNP3bU+}SQen=Un#M`g6Je8= z!hS205ua6b7o+<<=NKKDiq3H*#e2P69vx`Bp2@m&uFuFWtvZpHwHv+h0b{#djg_mt z^ps^4mfKGtD?8KeueaYpf0I8-?smoi zMmc@cyZ;@GZJYqi-(-=3v7@cCgQ2k_fbAPW$kxUQ{JSIIR(^qnm9(*uxxS#S8$go@ zOaQS00W8cwZA7rV`rgiMy&rN;&cW7D(bx%~32sbS6u_ut?B)bu6t@O9EcpFX==-NQ zKpVg)WNT&XplGLWXbiX&lR}Ol0O+n=MDTYYfc>rue0*S03GUTh5m6w+Z7=@%K~2`c z!r1WJZ{pS<0Pwb#;BJdsvjTv3kAw*R&ISN-{Gc-ffVZr>y-oZD(t9 zJE9!_bY*ed>AzMMTknC85D*aUua0D`k%@vI>%V;l34IUw0h8W;`OB~`BF? z8-C%|-*N88oA@2v{N^lheWwU`4d@dG&l^Z{}#Ug_oTv~TK{c<`iFIYSohyp zhy9PI%_TB&rSv~r$o-JDKqhw1A1k@Lb@8wAk9Q56PlEQ#*d#(S+ zDfN?*b}M1WcGQia#~dlA`Y|=F9Fo+7R?-)w9Nq)rOlkfMqE3|2bs@r}+&gk{V}r9x zbDzb;c9Huky9hC!2<94m3<*o=ciGdeGW3h+pNrk`^Q@lo%k|pzI!bZm z)@!X$!~FdIp(3E5%!oyxv9rfxC%XQ8a|s!}rlwe=>LLnrQBx*$D^xuzoLGV3_n%6e z?jsEpVbfS=46g4ZpI$-&E?XcY`^`7T3bC4+n(g5Q>=kmDxp{pTXYBm(VV{Tj58s1+ zl&79YVqe{CFBaTuR#Lw}w47CODhw4B;zrkpa&a-Jp%I91BIGN=(RIjqMLOaJiXSq9 z?0v1+>*mzCvuQ}xM2HwJ;pxOSZ0E!ipVT)vwC0py@Wntf2?5oVdQEel+f|@BVoacNnbmjG+Ks<`BK&? zU$fHY5_)XMbvL)SeF`zqwUgUn;ie{%@e?&igY*ElsVNoOocaN`PSdGJE*k{i4E8tT z_2;Ga_07QQ%4>$B7M`K=mM10P#J4t;%(Qn?@WCVtGUNST?*3yatA z!VdN*sXTQ$UQ00~t_>lcHN_jq=<2>6Tch+&O{eA4eR@WT&WM|VyO!&d%;D3p;AV%@ zVeqiT)ooZ?CYOkB2shLRLZ0pu5x*2AW5xm3VRiACP%u2Xr3;FE#YU_v5l`|Nc5u=Y zv~3xkNP8g$<{~mKuXr)RLeH&qy-x-__A8U0&>l<8H$(^PhQsh4>#$OrHxdg=$%VHq zq58LH<1$2ep>JPGMPJ zDr;W|oUA&nf)RZBSfZ)HN!n36kcSvyVx>5bE_9Fe8pPaGNrc(-D&n^ zq6$xgIDYr*kkn|5p?~;m53_iU5=g-kl@VSnYSMCsnr8{5B+(B#5CmzUMJ3QVC~%x3 zpEc5>^J5>3Z7@&)O1dsTc~C_*&lfreXzV&Nqk9&it-r9jA@{ZI{xbIbcSXq^w%y_# zSit_JD!J3{`~rfY?~18EAovFa|A62h5d2R9!8>gG6$I~8MZbU`^LHiq9}xTlf`35p z4+#Dzf#4ms{R)DhANrTSIS?^_w^sfE!9O7Q2L%6s;C~bd-eTLYAb4j6`*kJwU)c`- zW`p}*)(TDzOOl`v+_OvD>)}Y^$}!;*$T4|NRvhdR?M>W(EBkzrB)!QB;BJPtkvZr8 zHcSuT4{(qE3J8V^d48hnX-YdgmvG{F^MYqVC}C}%hdCn}`5r;~vlki9MyTMQQ-$W{ za99Vk^_X4mAOR7xdaWuXVg@M~+h(j{jA|04vv#KxtaD~adR>CXa;PjN?LwCwxHc<| zfHyTtDbyt#ShZ7YCq2U2N+0+v+t7Mu1$yM;3hC8=#@bsK%Q#(x+X+8hEVvMZJT7)^HXz+M&Ze??Qm1u6E ze{6GaJ9n+6&@`j4YrrxbQb zwNIT#2N!W{%n6^~uM5y@;aWEV6RS~M5I(lk>!vv|gNYh&3otfIFUw>a9)gJ_ezs7x zcKxc9bI4%gWE;D$X5DI0tj)bzJIRg3l(+OB_b0^J{WR-xoOh+ccmC7dA7=g!r%LRN zEA0m?)?@~yVV~nbw6U{;u&IFX2I7ZXT+g#FdYy7FQe?KDT*+({r%G<0`Rv4Lr7U&Y7kH0s z&%fwKi)?5O+WYcm_F9FJkg`36VSTOyz{&P}&#Ge5OxyLsZz*ltmg9?SnP!9r5FgEk zgKTN*0;?Ex$AwOjYAR)6HqB;7^kizo<-D20U>B9NMF9k&XSr zl8eR$D{Ypq@yq%oS*5e|VQD7ndt05Od0h@A*ERO@<5y|yEt8h3%jR5fRuqj6E@ZOB zHJsrD;nq6@E0ju=5*BGz6)NoF_~2nb7RB_Q9(&=5gl!(?XR49J^7gJGWjOl;Jl!Ts z5$_Z%?4j1|JW0FPMpshDbL)g*SA`8Z7mCWQJ{=n>1eI(DSE^s8*e%8b zHOOYR?HaH|)W@#ONws8xv|rMF80eZhJ2!ky&zeN9B3?OTRkRUYLoV_!`V?my9T|8SxKvUC2WF_ zKvUlxw*9)dxpUF@WpBgs$KT-(2>t=VKOp#@2!cO6_5beg!2H8&?(bUe??;dRXu1Dr zx&LUn|7f}YqqN+&*!J5>@SlJn%Xbiz0RRDv0=EGJY`}*D0Y7=N{;NO&0SdBWSn>qd zgKU`o!2$tp!LEo1@zlk|uRgdqtH)bw#*bz_FkNWKu3{cbnPKgUh0)I9aYoBBblQBM znUaw8wpelsPym4EasF~KxcQaJ-`1Ub;o|Dbd%;uKIxTmHn_580Q7E1^C(lMkI?RuV zT7+<1MlBcnblt!{yket1rnPZu(sXpXa=xd=<>HvPCf-<&_$&RJTJ&?`XcGvcqzo$K zXH{BIu9R1ZcpExN=#1y-Z_ z3=5ew=SAlSjoJ;dE2qckIefi(`5`syl}UsFUJx!c{hR2!uwV8n4bawnJ@s!i36eF!Dep@$SYQ6e=9ca-iNo8okQ9lQe^f0%e8 z%9)Duj|y<>cQ|c?_!rJ&!;!* zE7;CcZ}@o5B0N5FmNuv1E9%3$;N0wb`l?Mca$f}7T+y5Ctk*U z73#-4E~8`^0liGUw_mMk6n%yE_~Dhw@4BSBcjETtVQ2bFm2`Jr_?8Afb1W_-B&hFb zYy>`{eCIZ<{o~jI%MWk!zpXM@zB?4jfR94|{(>ny0UucYSMOKaOIIbu8JwWuX7=Xy zm?Qx5Lp%=zz$mvEHjI3T_%k`EKz|AsVOUWt3~Ci4rMHkzf=CQSu#o(o8%!bWqsw)- z$qS3D&V^ed?3Az`%qL&H#_=sv6|mB@+{vCt#oJ@yll3q@;YY?yBQ$hG#~NvvjR;6poWOKG7uXLS*+K5Je`~ zc)TfaSE1q*tGXV7ZeaQjO&8kSkl8A z<>r&gm$JiQGPM%P7frLD!WlO!i6=v>o=}aAou*1bFkvO>4y;jRT7`f_upVxQ>_b7o z$8~ZxIiQA}ahjz=xaFFD3WW&~H^{}9N;F^n^3LRZuS)UE07x6xA-xprCN+Fmjr@WM z_gR_kOA$zNb?YRv=&cfhtu6J*&t_+>GYgNr6|Z>Td0Z&(QEU#U3xubuFIa6BGdANu z9Fu9J5LUIsD??OU-+R2eR4ls#fY^tHsGd(fcob-*6VthjOoxoPDHnPJI5`-S}? zZ z6q?M2-vi2PLlYf{_^zeNtR%Y3F%sl)y>?E7q!ntjBqczi`1u$)(#U~4i|%3eg1=Q8 z6lN5h(&VW-03zMWl?sKenyt!>9$!rz6U3(#$kg@61G9(qJn4IY0_STIVB z3=)IbGMeNyRDnox6zXgI`UtUT`%lpKf-?0JAK-L9TnSPSUoue9pEQtQnn*NERFT5{ z%w~el?0fb+$6%r&SB4>Sw5jmMXB!$ zW<{oijt9R6f8~$S&LZ!dFY81Si0yfQq?R%Whq(?lJAMq@+sG@c~hBpxz8vQSFdb^>c6tO`pEE?*Sk5!UR&<@-ss-TlLfR zvzH7>3!{rhXtFi3xw|97gPy>IfX78H^ah zb=~YT$CYQ}S2Q-x2c)MW)?7NRJLjf(XRhilXwf9mqMwBI#O1}V;SD3{1SgcKMyr<9 z#+(@JSnTBSaq)%lMeyBkacL>?Vm#Hqg1T}!pF5b^T|1w;kcHuZDMt8$_!>qOMg@)! z350+N>kQM;2HDp5oQQE$mrQFM2TJf#$R&UWffZRB``qyX1072-#io0mvYWS?D-6AX zh_Fy+qgdp-(RWY6B5)*eTt$1Ibcswnkrwe3Nf41tP@_|?`Xm~z5e~@Z#UaAS_9Sz0 zC^#9NlMGtfTt-~kW?(4<+R$&yp+w19W2>QLJfW96Whx7vmTE`OHnzhn=~fAxRyE+ z3nxn<_ftozvZ$OlePW!^CqIDk`S4TnC!2o4-hRV5a)2_!lrM+W`Nq06%5A7eHa)V);C<_3=ax0-W~b1qyLUEp0m&aF2b zs3jSw>&(0_UDPgF9oWy>uWeM_Y*EqIwAVv3k2H#`2IW^aOO#nWnaKP4`l~NqWb)_c zub#DAX&-uKr&<@Rea0Xopu6Ds9$^tQ`Mf)kvn&y??$ZCbRNOJVk@dBq)znAVM|ewY zFM9Y%z>}Pw_DJUm?(r%1eD*lD_K2A7iWU1F+pEPRAvGK5^`|f##GHG}J*PxF z>Bu}Y?x9|V>y%d+$8X+iglc3?ew++>^P0`vQ_6E;{n=O=;SeD`f6C3%!|>yzHcB?9>#_3|H@c!R~;)un^oJE>$PKhU!nFX{F_*^ZmXFWjcHH4h6H#7njNjMW&^k z+T31gUd>y9R}qts8q;6uZhD)q*X&p~uiI5!y<91I(E{tWcCLNFIDg#Wwff>F4Iet} z-uX5|i|38bN8WX>`KuAQ0yG`|0S}HVvn#{Rl`Kj`S(@}h{*tSS(bS9k9a%!?dE+qFQ-sTXHwtT$&kHC12N(ZjO?$fxy(#r6FTX8nznvWY$D;N}=#alJ zYQOtN{SOwk0ZPM`_XV)7*=!2llfY|OqE@;^k%+4onTd?EU11nlBF_@N5s5Nl7N4|X z+t{Y4$qD|nJVG-svXu#U^X!qwt`Va|fQAUwd=ZsFCNBNnppDd5!ErFf_WA)se7E@7gnbCHzPS^+}+x0&}ex()k&T{ zW~CqUk*-r5Bp-Y1C&m$XWUs)NIu#Z-MF?kZW77Q&y;(LYw{c**$RIOS<`^}qIqlF} zrfQzAowyz8VF|xzT}1j(_yqs5{?hBuoq@ar4_FUR^{{L43Qk$uv2@X;DYKO9XBbfS z5=*aC_9dR%MRD{Q=|6MS5R;vfvN>%Cg7u=9x?i^Jsv^JS9(mt%etd36jwYjDBLd+~YtVJRnP@13zieJ^WZtkTaP@qmzMfg@7m9N8Vcb*K<7AR3!Fs zLN)L)mjc%`WxcYi?q~g4<pYDgcZpSf^0L_7 zqbYe4kAG7&0r>ejYhj9fcK?~)p<743J>GmUd>97~~aTSvTh-`H4YdvjdEsPPoxlqj%f0Gc2PT!K6veW6Yq zd--yZQz3{hBer3^&p=^7ZdOP^VTydpSQ4iyN!eiCWjbk$(1swBQ}CoSPr^9%ylfAn z{Hk2x?5tQ}##;t&(l_DU_HEOZ$Uk`le|RXcGqeAA0e`$&KW!?%h2;3_{rkJp=9{Ye zHo%tS|1D(JZAd3)aF`~rI!Dsn$PpYP>zl1l`}SDz_gGpifA@>{c26OFCw(hh({Itc z9DjuEQZaULG`F<@FajA^{#G9xO6nV!{0$Po5xee=P=AY!0|ama!Q1G6xwUQ9aCcJ@ zdBg8~qBFX_ec1B4aZHozLJ-PYaMWK0UQ!ScjDRTxg@Aw=@nB^U{yw&7NGJ)E{3U@r zGUPpTLH~RA9(4p|?QpJuLi;(wNV!_vKReFzq>e;8wL01c!JmopU+<>06cjoZepN|3 zPg7hQZ)WGU+&1$g`vQ&k^<}kFt>2;K1|(o9t!vq) z#BTcvgu_MOgk{f;tUBZ?ysu`KZ3^ew?M-#iw3u{B&vWv!i`JeX=x{$bHajZm@0nE; ze3$23b7}U}`xM=Mjh>UBZVo>qv!*AVL8vT>=G;(7bvAkz=G6T0TmEcc!yz zoS=Q5)!oI2>A?^`4U~f5t?B-HQ>5#jiVme2Y|Sgo zxaV5vFnki;d|KO!GErA@FUmLh>Fl8J$r<&?9iJ0K(V!7vKk&tT{9a_mM|g$&Randw zsYSHlGCZZcRvZCGYCadb0~1M?7>b3&YhVWf6^R@Z9Lc98DmZ+U=G9yW>m&*_?Ca8E zb&L8`Q}2^u;mznR#|?avi_M5=sOaEXd`4GxZHktv&3fpR4>Ta=H3luux>`?VPvexv z${FpMzyi*FJ=-Aa(W$Rak2EIe**Hk6%j%uogVf$si!{txFTJC2op#SxZLn2vY@GhM zflBoJxK9Kn=!1~;($c(~ZB8TkN4L5f1L-kkN9*K7OX;rG#3Dfgs|XI&BBzDd^~s%| zRqRVC?*2~76|p4Lo%Ri#ht7Jw=SquDb4-gqJb$+dD~U%k^s?J74%xu?6je{wFPRr% z-HJ#pQOgdZbD`(ZSFO7=(x)#S+PRqay44AR<|r{SU(KC5H84n@k^lxZFiIxKmdgGI;8b@RC`>{KvYRxSMjT!`h1=tbD6NV4DCO}^r7{9h{zQRvKy>l}z7PQv6H=MQ zVILX*s%Mez5~YPgSB^qM`s6)hSJ?6m9AaWv5ti!cy=J$$$SD)8F@*ML9#HIfwDTwX z%81LrzE`Drc=_A~MDiJH{E(WqikuB}q-q8!vt&r&(|{ z{_yLR6J>LR_w#G$D{{qdg-wRz`$PRVY?FAiSQpMsWY_YSv`!UJb#lzua!Bj~NTqM^ zbKlC^VZ-fm1#564F}4+r9sw)bsGbH;L5yG`Q3F`rCSuNBr#Z#s_1ZVdh*w^w35v*p zB!nJP<15S7C}=AY9idJ<(OgINKyCKt3!b7qbU(*G#}71Cc)-gXmV|-^)E>JinlA=yJa-xfIGzQynq!33+q56-oRk zt_8xzca=;^L!aBi5ZBz-ySfzn6J%!*{^*MIp@#=fe9)vFqIdY@Ia#rv^r6Buwol|d z+)h?baX0aW9-1Pgiwm5^n$9~RTD(?4-|)u`3u{MpV_Gs!XKY1XRv^5?2CNd%wAV`S zjG=}rkfkx+6*{T1a+9`vhF@`1RW%K3YJ{cLD9tzPF4+uM(w?JS#@exL%PsN?@yGwdmw3)|h_gXk_XvDktM6SKr>e+-3%^ks?xPY%b()V;(LyxU7~u z5IjQo;=#^&=OMjkQsL7tq22JSB^KrzWugAbM8b9=Z`40&JQB3AX}%wn!^XxY{I1)c zSooo8=IgAwkiA>IXp1|ZV5Kt)J`5;{maD_4dG^_}p_JGG zkG{47!*f+uEEKbBgC(M0>ltXxRL@i20E?&ba0xx)>S{Uh2*pPAlao(tjqXQV1U?Bp z2NAO-5<~-BjD4#0q7KgryT;-eR4p6a&e#2-0`*OlQJ1(NVZ z{B2Voa~MUujrXpzjhPJ~`UqrfhH~JcuF%NWvk3}F^w`U6fa$lOfoG%3i*+oA9HX!y zvU;o|MLy0q?SDm69*H5zi)w#17m1l6CJ}85S#|hWhI9}jtmZTs{{AAT&OL{xBp5yt zPp7hCsDP4>@^T-CJ4Ln1k+QrOayz~bUDu!2E1DVnNdJ-A8{;@@mlL9Vn~V>4S1#R+ zo$QkVL=V|wBZ(Vy>^o9vp9iq_Voy;+ZqQ#yI?xUAyvQyu=U`@Rm0KA-1u8S8WG7sA zreCfNP$?duw3xmf!R_Xclez3YrBg+0MUw7+N9s`1URZsGR5X!RscgYVWfl+mpz+qz z$fagfCq{e~M&iXwIda&CIwi@buqph5W??bcQL|>QyWXBJo>$^hOPq}=q`W{gLUyM! zo_uC4Q|XiJ?lHso4)y7KPSH2eEwcH|YRn$?)hbsf$w-E#HEmi{j6~RF^44M#mDWhR9`Fx%P2{WJyyM3d9{{f&?;`+wvBcOMaw|SvC*rR zeN69iug|xwDI<5j_;`s=Znn{T;O9wHu9lJ&1<)xTkDj|fJYw7_E`9W1R$nrEJwl?i zov={nXc>CeB`*poYuj_B)wF5z;rqulPC*X$&UoLrT0132rAkylh;sK^ekyPY5M0Bh zlaYME6$JCx(1l~iHO(sKF@4FyMmqsvXDoE-%P|;MghMF}Xi9cFE~1e>;MjpEk$7~@ zIXWH5GK@5J03HTniRcq?_%CzmFk-1XrYu;;kLYIRF8ii@ZWc>LVA})=z4~7U`8*w9 z-$3>>+4Ql%=@d1@HLMT|X*3yY7?#<(x{79ZrQ;@>Vdh&MwPmW&gQVR=SltH3LXJh1 z4+{@tuy8xGl&oyx@b#7|s<{_ULRb%K3B3 zkrr!13(_5iR@?lIByA#_hJ&;Ov8BAzU~j@9w23{m2S|L{v%Ava2~kHOx3Im={RE zs}K&Xbw|{Xyq%cr%p0FKaEsFqHXRvRv4?49ViZjk@3XhGW{QanxIUR^4!Q_A^@ZTA zLt#&i_Ci`X9rp*hb5quik*VXdklAb0&zM!`$FM+Vznr2dBA}6Q7B^)}Vysswl~r3- zQ`{|vQL;AHJXQ2ZW!Eu3`!Z`5`k|mJ0QO$CPBoE?ZoaGKE)5Nx$A~sx*4_halP}xR(iZ){h?50WmB!leGlB0tfewyLCUexlJJUM+CN}msA z2kPBV8Yh*c+~!}IK^o$=2=nS5H?L;Le7Ns1?2xCafQ=Way5*R6{xr&_O)6Wi9-y8h zwf|x4X{Rm9qPK#Dc8tr&5`~sc`x=x*O}C7&IGNya%8@GRBBmu<9qD; zU$>0|MEr8*Dpb*)mU1P3%J5#;ASTl0Dc=s5X7}fpX>as#DC}!I+GakeGOz_<8*e9_ z=+d~AocN^;t6oSFXrv#@T*|C*Vp5oq`v4Ek%_6ZsH{~f z&r}%R>)jTqS@)qytwJHw$#WG4Y>Cf%kUeG0{vnp*5l7LWWZt_mdl_j6ewrwK$;X#3 zF=L>6_p%%Yt`Diixh}UxyBYEsU+56v<94gjeAuGeb~cnlu3mnL+wtsCcJ>3zhy>DX zP10@&nMf+BXf`qh{6HZ^Jll<;!TmVC*<&5+?vNBq6<+&s%r7ZkB^{ZSmI4IPA*~Xv4%uUMtaG%MCTuLJ zr^SpWjX&6X#!USQXWjtP__0YvG=btb<@TJeKrul7kdjcAYvyYpOGT)|}&rD)e!maAQ*)?V7;ePYXqqN3JBqlTK%bTH! zDS5TSRr0-)hq&F$nt-fYVGBu$C>nc)rrzK zERuHP@lJBD&ga;xC>lQ$dM^T5vJJbqsn4;b3AMmcAwEcnTxy@gGvi(vF!Unuf~48r z+D!3f;=e~TvRi*t);g`cn!K8{s=Ha=wy>?fu34m&QmrzvvAuWb=K0jGKuDdMC6Jme zrB@s>Y~G?e>2RhY_0UKpZ}9-fliF4zCbd@z*lbmmw;Rs8)+;5#z^GV2{m4PP9w(?* zZy&#Z)T@bqE~d=kbi#OX7`V2ICfljfCR&T>(U;2>EnxBTh|0&6CTi~frp6vyX{Iz>3pZD|Yib zylyn&{fS<~ZyDJb*AsP^irAFm^<^s7OqBVq-{J4@3wcGnF$(t)=$$67bHr&$j3ebQ zA(2;jv=0h=75!PsAp%zWp|>@{Go2jSTtXHRT~Oj6PI%)AT*c69PLo%-zImZ6BPow=Q6*JpN`5q|Lap+} zuqtPoc6;*%d2Y1K=WTV5@Ih*HN^Z#{o0;mq>!|BK+WI{`IPO;q`qTOZ&x!pS@IHSv zeW*LZtbc6$vLS=eU!XFG5LB7&H2Inxk7@o(e5g_5D@;P)w$P%^H0SsE?1V~u29JGq zU6%FqyYsS;ax3)EZw6vw*~ker2Gz>nrdrZ4($iy~pm`gim>+pCJ!q&F%?=@dEs3Pp zz)z{zyj`pWuNFg5T{$aupAQ1tfu&0^#vrWIPi1c$1d7MPOm;~-n48krQ(91Ld2C@5 z*Z@!+d|6DHx(kpp9<>uieKuYh7;{_F#f{RtOtA8akNUIoUdZz04d9Zxc1J zvx74}2&;P&Io)g?GJqrgAoR9+S z&jtj7K;R4-w@t|CTZ0`#73C!aoeVb1F>`5eS&j!+=UGO_Q?VE_Wx1#wj}fIHMq`gY4A1TU2X97 zUnZ8jL?5?|{+XxXhy9UMLkXNL;~TSYJ^${~g!~gu{5%kdcS8kE0CM-(j)1!-0bh!m zJ2*NCndv(KIKd+#rT_f`2#yTTC}IOn(`9Z0w!=v48!FgZ>)ZUG{4Fa8>ksE%DsUly ztRg@SoR5To4Q!&3ch+}s@&JI7qTJnYufy9O{5a$0xmsmVb*V!Vn%6OqrYGOW9-}< zj7`AYW@STU`s)vXjg=J~c+CXxjRs<8zn$i{e*iY$X-q&i4zRiUCmM)}lLI^xexiXd zZb$uR8W60g`i;iU2_EyG%7O340yeb$L}OxRz4hSyna08ao}j3=XBsQ;_jXxXZe!N{Tn@y18>r+L8ryBMg(AwwS#P}pex|W-{9cX~_**$3J9spIsS9EUGw@d$6VvT${&O2_?6-kRf2Of>a{ksA zPG+WG%K@2Ke;;#Jmfy#hjr}%j%uj6qS%GZ7jt7|XJMTG|!1(!dT_#Qt7$$$Ff&0So zYdIi@mHk&fgK3<&#OI>#0?LpL^@5j#k`+Q+%`|UZv zGmYtQeRgut2a6AfI{;TS_W)xP8-P*4*47DdXX^$dm$;3IE!ZgjEhCdK*euS&X#i%0 zp#hKud@Cjv0}zl2oIL|%!pR9T0VAX_J0Ie|E&|Rj1%^9ECot^ZfgM=HfY=bp$wg#E z5pNs&2BeGv&Q4}v$xJ2cpl@Rd5H_~5(l>T+qW&39e?n#^aGx~37r3n{Yi(l=jw^0r z0v58Y3?K#&^$Z#Wd%u>F(Gimk=`I23 z2EX-Z>pe~pcX6^=+gIYR4po|g{M6PZwP;&<&4=fI? zyIRk+c<;!#D$C*t$TA0i)e3eF7SCdQedj6G1Kg3`dZNpW`Vb=S3#pd@cVMI>79!u)RhtV zCqdT9(G64Y%J_Fa7~#QCh^@JdlLwc3U3=Hg_j33X#M#LQ1lfssei0W(XPf2FejN);I~GU%yV*g-Ab82=hb z(SeUq_#YFLkoaqhe=+_``Zwc$*-+#kt$6;a!GE*h(R^p&_79!@V>m`0U0Vpo-U9rh z03*+9sI9e)8zaAv5FaCttP{-1Mbp{b5=tccPfjwnZmw!j7g;95NGS;&8VPIWJi-2iO!qqeF2BqPPIvA)r#(eoo+ z5&!J&3cB*_$l7#oNu81p*DgR%t?8?QJURNK7nK|k3$CNSt6RA#{5KPtDo-p&oEDF_ zDJrx+F#Q1iky!BL>-3q4ooKBR6Wlp$uU&h0SttV5-h_)OqQ5N_xgVs;1K~-nVeHhy zLmAsNO#^ZDk`cSyW9^rvrx>nL5-d~CG^eQKE~cqNVPD>CygOn;s9UTE9jR2*2!~%- zy1yh&%R;GC*g$e@c!PF|V7F#!x|~H;SlWQysHGzXu^hlM>1qfd-rAc|Y{f=}oy;ai z!DgqY}~g)9@ek zH_UKnb@~6HpCyE1$KT1%82`X)7m|Wdpgj<+FH}!F3RzAxluP8gv0tRiR7BDcAEQ=H z*rO6&>oX!^`Nx=2KES9)mS#C7ZY1r*C)lZR#~&z!Jy) zq}fNq+H*l@Ibg|v(Fp1OFMBMRV8?BcKQgT;%|pTV=3vo` z{1AKtwID>CFm*9x~_aOWlMv8_dbedt`NbZ`Io+a{c~i=%K@JM`f{ z2Qfq1v^E$w*kRm7SE>NE9HAf1gb4G^u?yG~Ub>88?{^(g9jZ{b9?k1vG5Y-9rMUdJ zIREdNuT~@2|EJ%Qz8Ou1l6uZ4X0CNfG8lt=v=49=itzovXO#b8$$z-9r?tiyxbk=V4Kw=6!0fI&o+$NPhU0u(l9PZNfye8n|lbOTTY6_JL zOP9+?hSFhtxF2PlH`!w~ptPkISbLscn>wkZ-cZ-x_*3YvHdaHO#nv*t99|daeRQP0 z)x~*_l_$O>y&Pbfs4wAL`-4b5h#bR%IfRf=3_*COJ(MUG8ETFls)958q=>Ob3c_5Y ze77PNe3!CQOb)PU{CK~SSURjAXc#*-YM4`6P63cMyU$LJzKeVy2Z2!F;%7hj&x&vK z@G0p{Z#JcGN~AueUtU-Nl~Q&(;)(7y0qL@6^{Ny+CXm2YJtqUYuIhWrPEXf>FSqh5 zfV;`J(a&i|!Q&AzMgvFUJhxJRLTfae_%TN0Wr zDHJb!Ih}@C4lo%g(N=`yKmnd$CJ>L+WYJT^2tPbYCN_#jz+U?S+9n05oZZtEky6dB zSglkc!*d*QsMynpkx;#(x1M#>w$ zAtua1M$Ol#l^YxNC55_|63uDhUZ}(jViVwsV?*e7?r0?JeRKKwMp=&$q2Ipk@=gJ8 zaW`PnZIH{YP+=q9`LF6Al^-Y8wj*JyJ5_Sud#nhH`zH!}*S$oy_>#i$e0QMpCxg#a zuPmNM{Df&zpJyl4{Yvj1bH=#K$BwUMiqkQn8*P};2=RYP#m+IZD15XC5Tum<`UnT( zH8}A$3Xs&bu87^Pc#H5jj1`}`dLpmqKR6V=3scYH!ZfMjv^744;LNh3TK_`DewbnP6D>G1q<8zG?s9e^+s6dd$4+$xHn@XyhsTXsr}vtoF6YhTuc(uPiSy z^M4tH>qd{p#m&iAf{Y2gmdcL>OYwdv`kyQMQYw1AkcKB)DHRoeuy^scGU(v9sytja z`bR}Wkx}*1*m3v&&m8_s)*iu6P_?vw(8oP2hy%L-XAX*UWF5jyoGp(N77$@YaSrn0 zNd+%DHAKUx_v%=RT5JFccfu!Z2*Q9sy-z&~u%!DI%<%iqL*IqMIx!WeBxuy1ipyXr zd4QPCv;>RLj!uGFyB3bXWHucGTbCEwL0zRf|aNONlUfGSfB z{hx=PC&+wPZ?-qR)wmPxLcu`rCwp|2Ft7J{s z39>RZ&t5GLuumSsg%Jn#P6^XYAS(L{BnW+8U902}8x>w{F>izAh(%9IUV;Zfr6Gej z+BEKSuyiOG@pm=UNX3BN$fxjiKl4Cbb(}&qc@@m`y6pB3}^7~5B}7;wr$DwDUYIig`!;3~b49xJ}F7#$-YF98Id(1-3g!$MkJk&AtU0z;qApG6Ufu>Vvr7fUQ_4o6C3rT)O#Zm=51)y+}xuuuhZpS})32Ie_#7&#_V_!zwy~t4X-2g)HedalR zsq37TSg`Fu`iuTwN-FP&GYspEJxG;0G}-L5FzYzsnZ|#AZH_qoeSemhSUIs4sj`kv zW>VgEjK(6x%J>5oewbJ*%Ncz7EzDF}TvsJ#BQZ6XmB&ylsieCQc;tYAT--AWm7X-; zp-3S^QTWt42DrBOq0>%&1k)PFFLyGU$Y zs;}p)A&gv7LF4S~!PHqJBy9$aq&k%av{5W~CovGB+-BK>f;-jKocT6Rj?sO}IHy|z z`BG|*$4MU8LvK#rM{gPo`qcMyHATI%4~4mLZ8RG}R_41JgyevRL|0R8#9JrJIeI3L zaeqAz4LTAf;-9$@g+UAC#GRXj#KU1#$yFtIOmOI~q_!7C0GbXR`+q1@MW2IRJG{SJ zYD`g;sQE%H38wG4cjB@I;}<6U(0FxGQrxeooBvjKsVC1q=Ki2dUv;RD!Ck=yvCxHr zS!Cs@K*K1$mT#rTN$$7_2R!SsN)qDQJI@qp9VSYRxMN%}uebXH58I-0`3!$|owPKT znGxU-8khXVMAOD%$lC6YsuM7StPIxV#pyP9I+Oca_PJ*t#v)}xk_rGsEbpj{J`+5c zgh$(hMyH3uS#c}PR> z-Sor}Z*7cZM`EM0u^6ahU=Qi1)Z8GJHd3E{GJ`&K2~jejY3YZ}4|=+?-;&C|`v2(y zMO{B8Gjx;qnq*$tq~9J`mQ*mFrDCV1(_(`d;VCvfto9v|SJGIhUOwW?hoa6Mi)?+y zwfyZoy%l|Yj|vQS9vo>dL@5AtqUCnFml9H@EIG~WMcWr-WYKJY!am6w{OnQ-Utz^ye!s@dKsObS4zX|8n#nc<2Nx$%W$4`PwbmPbAn1N`06IkTZ} z=0X{g!eM(v*M*;C-`4iEW8aEUa%c zsOjNpyisHqs?6|3)VDNbZA&Oj#xi~+4q4Xw#f~OZ!N>5qVD}2&$-l~YfHy^h2L_nNPnrgja!WoDfBE?Ni%`E#>U~FsefW#-ePfziQWi*y zoj};$-lLqGe9m%QxYzgLxtrZDR(uZ9z}eZ<$gL)|ULd%>!}E{g>~@-rCTCmTY+?PM zr;g~4U3s%1+_$~2AR5&Xs^6Nq_O;UPmK|k!r(S;dHa<~b*al#?m&Cslt{hABedduz zT3>3N!dq@9z1FO14vnW9J^jIbpo^)6M1pI<+g(HdQ)Z*gjw4mJGRrHjC4z%86t>pG zUG5t5cyG|gaJ;*TKRD4PDo)eL3%@@v)C(}L@Z`2@Vf)Ua-FPmyJ%jB47%n7~6-!9M z3`_&-$UMc{WO)CH|IYt5r{eq?R7E*(*P0jV}2obtu1ZTQZRici= zn18F4k1O6nQjJcBDA89F`UK(hDa)pNq$-u*CasoHr2?9!VnaZUuAEI83+`j&qk>wv z2j8y9Cj%|U{Zw)A1d#DI`?H!`ocpn?U~A#*)nFEN$z8{cMOR%MH;LH;DdN;Q4_ zJ(-M;{<<69o=mGnPu@BCpZ)tSx_bH+`-%j7(M&Z}sFk`usQApEy;4I=C$1J>@E5qUg)H}Q^aY$~7XheO019SKqI_-M|DZ+ERnBRY5$hl%;+_1ma&6T5QhcP_z ztr^xflIW8gvs>&T7sLFqo~ryU3X(Z19L~UjG$b}^8v1Gi0bd=AFB6}%`fAGveQCguGh)@dJ(KGgGz`-L(evd8MZD*k>eL zDaG!iv}V1^1wF*i1vb4TvTbqF9DL6z44UFKyl{lE;b;^Z>F}pFhu$M%ryJ#fn|6H~ z(ONu*9IfRO79}oc(ynt!ZB(NA-d^&X-y_Pa!OduVxLp>IKNQas*0McmN^yevI23;# zB+R~k+PhwPZ}hVG5xba)ok=E4;*uSzI%`r?sy(wCkL+H^`=q7aMm+dC9!X$27U6m6 zX}y$s*lPu++;_7kK~V4aTKQ>Hw!eA-O{h-&U8-%%{ZZXBoAsh(IgP+MHAp7dg0044 zYH&T&*^avB^<(=lAj1RMGEVIL2&G`}&XM)tfX zniIG0SjWaHmB@{%Qd6i{sDn@pZo58-SJvgQVm3BnV?Kkg3%ze|m%MAq!yoqnCS)ye zg!puxJCxdk4Xb&#_BCizxLTXqjABs7%^{fg9<^C~EH9WmO=mnuVa-E8fNsA)ZBd)6 zHSYxbx;3h@{DX3N*gctE>9gLv%Smk`pOEgnhfd*D80-g=0M(00%bwy6Gu_c%KMq@6Y zY9G`^{6kk!q5JcpT1=myFAh%h@^nv5YMWLy38;>T0X<-XvxgQG67&_g{u!z-&%-Ng zDJmQ_WGIz-z#{RD#nNF4HZ4|#YK1U{h!PLilTeQt!j^TvJ>A)k2N!$6Jzs-m4v2e} z!b{ysBcty%g+5=8;O~~~JnRI%@aOG=HnI%;L zu+fh41@f7%ywb_ZLPSN_SuU%12rF0D`U8SAefl{P33Szzu>236IlLz#N4;+OO80RRWwnEPEtX(s!e2Ag*DCBiPt0 z>cj|)INcTHU!I{mOE+yrlo4TNdudj(`SGQBr|ZM=3MJu^FU-d+BQ9af+m-g$Q*&cK zGb+vPJ|15Rn11ozbNUP(;r$xi)*68bD;`qRaO0nFTyAw*_SsUz;pt1QDm(HwqQPIrU+VV+4% zkj4hMv5&Z<`h$O*iJGqjqaXHubWF;q;sw1wlkhW=)GveKCj8tTJg|Rl_WfWWgsnac z(Zo1do?6MaHzvr0!4@D*1E;&y+;5Gt%rdB3w)q^tLw}cMo4jqM%awhlxx*TIofmq~ zEs}nk1Edap8%)6sde4zI0+cFb(7rCE@Bn|LQ93d=)JxfACoKC^4yly7Ifjj@QNMYYie9I;&gy!wiU*<4 zr^pPyds62NP@J0HDi(;$-{sK{HS(oqKu1>S->#+8%;!f12H+0y{Ju8N>JP5W#t9N6 zKdju$i)8r3RXk0XA0N7S)Y{*%$Wh8Zo_ffk8Z$9p5a9u)TODI3b8f zJR%y#g5tcc0z(Aa^7Kw^;XPL2NJPwg1wa$V&!4a@#x6Ykr=3~!bf+lZJ?j)sYGUb6lpb15RW;kwYb3#svWfPQ1>)_a8;ixh-E(-lcV zu8WZ3Yk-^iZrpV)-SF?hRNM@LO^OWmOw50dc>*jrgUa#_m*~G-KWyL|+Hvf|O)NK5 zwv6y2wvK!?cfx*Nj>~!OgM@;AG(Wy<^qiwMS~3Dage~MRKPa!qDy=6!jNpMIcYNuS z_4bFQ*ljN^V6n)8C$FQuGFoBhL9|348yF*3(I1`+xZF9ro9w}zTLJ4qHI~|^_z|vRr zs)lQTMIqM4S2V;07A%S5K{vBs?Y_bz-P;l`@i7*yY zIqp=M$qMQPks@HHE(N*YKS}3(l72%~p#zi^<0pIfA$mgvY5|0VpBpC|MO3_wW6IWu0;`1|(KT*@;fe2ZQs z>a;?@(#S-xe|l&^1ng4X+qJJcr`|%Cp zymiLX4qXG7T{bjEEkgWYt^6^aU zdTcn}qfN$J&L{d52?N$o;6(69y#h6`oQID=(d3=@S$3b)-Xxb3H*xYN7c%8sGU%CH zaru_yaO@cbElK*Bw0fbBFO105#=}r>E0p~9yBF)HEky{kgY@r(*al~S-HU$yuh%J< z58==L(wY9r34NNlilUI+4NHyxCP=gIckk1{*6)|;m&NK)QN8w`s;1?tlnBlJHsgYOUWtP=InT`m~0@@_cgRiw?)gJ*U}UVa35s=R~-2KxQx2vu1-ie8QMnGQAoIATg{85~RPcqRwP^he8`*1UM-Qel(e zDQl==?{(FV7OzI~`<3kXH0;SXZ~=HJQ$4O^+hxsfV!>~@O5sr(=ukI@W_}G*Dym?9 zcvF>QnA_k;d+F`ixy1Bg< zn@-QGS&N#vmc|v)&Z0dz_zr8kAyAR* z?s3zb5559^eq74=d&d1LXUw1zjwQjyZtpijz&3t(XMJny(}Gaus(+$?OxR6%XYZp2$V5I_n74=$06ZH!RMOF73ir{`A2|1>^HaOu{utq# zO+wdS zd{G3m?thHcYV#knif8Se74(vGej&ySlt~LuPY&%KfQ(yG^nI*0dhi|A;-l7$vXbjt ztUiIwTmwE;m#5r{wecx(MhXX1U!}W(d4+& zqm1srrQS_v>tY_$VQr3asPz7i8j zKW3+9JL#unI(wBnHT)9j%Ts<-UVPDZNX`(@s!ttyk2HUahG})d6Gu=>;}kZkk~;O; z3-%OftwgV4$@w?mol{F0wSfeyb5FGI(WpOi0sO@Q^}5M*^Bw%Pt2g==DE`1|`{px` z9nRzYhGzDuyK9@m2?1XuS#?CBDl(Zt(2hfF7N60mD^*PpzlV!iQPf`wLP z%h7dbxY|`biH+)UdGOY11-W_87l=?eZx>7$mQ8zh8HM83sIXk|wj39C5K#<+S;yT- zylWgdK4{!pz0eZN{Ha4G+d^l!BnabYKMF~RT}N3T*?nW#vSCjj6Uli3ziy$nAErIA zY42)X>-<1P)0u~gaBwcjxfdL;fU?&7mFp$-j<_hvOM1M&N;#55WawSS2Gdm8*DZQ` zPvysIeni)a$rC4!f7(w8SC4mpt$wA}t@KC^hzogOW$$C&F!x>vwr7M8&6UYDQqV|h zZ$$WUH19R0unZc^q&onr?_#go7qP0Xl+^owJxmh?joOx6Dhe!yqFV<8ByQ0XQAHdu zy>`o}JlBA)A8>qis#>_TCAs}oDtq7U^7Sj|miyKVRTMswd;#l1+o%R_TnhS7*e4lL zz%|=bQ=Ux`j0)E6btNyz0Z~xO=ruQ&R){(Q!b zQ(o-0=6TINf56Lu#NuI#AoXdMNp3whi$C$xG@>jc*zlLZJSAhxY87Z|`Co4Xup1hF zciCk|#K6`$1>=365~LL~6xGwERiRtoV{jN9MR+{dIoP+dC8X@0E=*-nRH*r%-GZS0{pb$sW0%ur)^)PS-d1d7s{A)lw{tQ#ZnWm=RR!F z^#g4jUw}uZ?M36jBdKkL6Yfhe4I%q57um7|R+06}&wlUbGLjj_kUPXr9HK=L+F0O0EWZl8Ds7Btv+?`sx> zq#8(#ud;~G^_oTrwuD$qnr;I*u{j*(-_kZy>W?5eXU;Vre-|&k7rdv7bQszZW4cmW_$ow4vvv?hHrOeo< zxO&`_C59m0MWX~ZvmwhBk#1GSN7Uj`tc19c3Zj;pq|rG-G0)OA^}=sFK)yH)Tr_{e8&$gyjahFeFz*HG8gTWjfTC> z&|2-Y>5ZX=>&D5iB8daYT#sD^0O->HHyRsfHu;r??r2&BRMnf5te7a z0e9g~el^#@8^IV{FO-dblb)wYEy4K=0w6Lw{X) zT-4Jt-t@+}qPIC~*?pkfjwX#}ZYaCQ>eyj>MiubZ4vHbV1OL$(>q87{uG`b)@O;Dw z*V1@*1Y^|(EVUm=%szap)YUBHUwhH-$azKWxaTd~6^`s|v~az)%3D5IbrbJ(2^RwD zqRrzg9)9T#_|s~QMAMXK9tllo%}~LEZe^K<#Z{M%6LK5&EBu)+i4bj2!dZuo&(hui z|LY2pct3+*@Luntuo#-3AuszXf>lT}m%L>RpZ%fzv)-dH)A{{+eGh?J%&GO-Pe?`H z#>65Csl`%i!m5caCMe7+iGa+pFqVR+OOES=_zbWU3hLFeN3E=1qy5y##|QgytC=|& z%7T!(;~K6pBF+9Qi{guqpoj0>SKgDI@Mye(9fEukG+^)~XGBlPA~JxoI}rfU1|E|h zbVZT#e=XD4R(KYm1&6iDE~*O&ZV>BGs0BEZg*@3Ulv)Z!@-=Y+9!C@m8-%ym_wLSm z1wv$bB9SW@i!S(0cw~%Ok1LW~Hm^tn-S3~`&%w5(9#_2f@|iwT2KZ(IGrue}qb(BX z__oF#R@65M0>6oN#`*W*hj>65*kDtVtn`o6a~pp0#cVUNSn-rEDtXgysy2kPCK4AP zY4XUHt}`?`zG|Eu9tMsAyVJYla^NwWX{(Q?o|bXS^^}_mQj>+Y$~SDzK{y8#n3Z@ z@YxuFtaWyjH*rlR^Y=JMZf2fX~frMd;C$EdmEM2+p2-u{y9Ug^OED3DgzrkN;#ZaqNIaKNjI38=Q zlxcQ&P7`-2ZNxCQU;%Qk7&v9$5wj=t?;-+31>7vJ>)YbM^pD^_<{Q*%l5_!6y8>Zt z+|$8*9ah}tA04_26#)b}UxGj_SVDac&!E9S5EnYKO@&N#Op4Ff7Y&;N5Nvmg3MdLx zo|N*}69Zm(e*)NWO@%2h!0h>@0xcug->GfDYl5|(`^7+2ESa)LFL2I@MFSL-(D3ErY0s8bb1^vsI#Q-e2_h#^`~GXex0j{}{zzc-FAf!VDRSDd8G4gmU`YfA{+b zQV-VKC30nPwujiN|0yE)@xfn}>`Q`XGVyZ>Qd7qZq}{Pyau8Y0!=HK> zK+r3Gcj%lsp z^$wzl|CO^%;G)p~=IQGzhyA9)DUFNTxOvrUm) zKGWu?LgEXHi0-9o2$^eYlO8o%XmaF#r_|>8s^1R4ld=eYBe&N-Z3@?>t_NCZwG>z= z&cOC%7Wf(Z3~{ATZA%~PYE?~nmKQcM-_H6YNc92?LQM`TG_H#aEDOgD+{Dlp+arfY zcXU%`o$M;SJE8f6i1bf(It{A4%%OG#^|tAh{@cK-;S0`07d@*EAXEQUC;Cn?GoP9^ z+NlAym`)H@;2xBl-+i!t&N*r;%^AACt4!#44zkR*^o`cmZ;1-TE)F+ zxu|4wUC=#{1Z0d8Ey#-WIIDxIoZO@iQ3S7OtDf;?F0g+Fo4>0y74_kYU_Dp}?hqHh zlJH%S)4B`4x>xQb!lSoH5h_5x@nRZs6y2m9Drpt;=*!ac31H2K{sIm& zsW<};&_`H_BKwtciZT$<&_jJQ=Hv*in87f+w5Xg)Q5dv*Teu7j5^)LallF6&emGV- z;%qsYpMLv*ihL*Cm5a2ctDt!I4N2?VGg-Q?^)tLlA|c^9 z44noHPIX)$z)c@OXYvIRX0$1hkigWmVl#07*iD$K`9tCr31pAcxx5AhViwQEAgB0> zmNMackag8Sh`(0yOId$%4^s$k^qW9ZATVq?W19o2rd6TQxI$_;y?@J4a%ppHLvJ5S z4%%z|3a9*4=VzHj3YX~Ep_>HEv^_Yi`Z!DeYy|tN?`V3`s(b|>e=TCaDKNgh4O+853h2#pKke8vw(99wodxZ zh#fTVxH-44+YIh#Eh54Oy{Ge7_=(82kxZ@yrb+{)z4R4-8?Ctof}Ln{yxVhc)7D5|)Ee_zzx`;Aa@N_hGaemi^Ur=rMzCH>mMay$H8n>iv^!b znveO^ydVuHZvP&ZgUnuGE{36|Qax7|HDIuu1^ln3lu3F}+5x-|_u%c34>E178~v_| z)HaS9ME|zV5e9BTDzMn^w+7MAY}N*B(m32)fA%MJAeOiT$IVFZdcAZCyJ~Dqk8@y~ zj44H!o4&PXJ#?8?JD}QC*PRQN+~?dH(q6WEDy7lF=b+#x2t|U^8M2%{Q9p1M zXFMzJB%U9UHS{sKANTC>(C`I{=sFkj!}V25_IhAgz+H*`fIDp;D~9k}NZTK$?Ny?e zIRixF-vdr2v{lWzlzuKvvmsqC1I$o&DYq&;<$$c4#oE`Zyp-g(%*hu@oi@p7jGzKY34C)M!UYsIlc#Efn}%&a zo}dlRiS;4`k_&Kd*@;Yl=!o_%}} zCT(Q7^6u1Tl7s?44tTb%7q+ZQN1vOv;u~U>wsE;j^yXQCHJ&?Uf-8anGt-bMbV49| zUbRIE2yav7qtrUs)|4PQC0Br0Zy?%EmQ}mHj zIL^-@v4L_d^-sdu1mIs9-|xXH+qlg#Kff6FQl_xTYas;fV?7efaQ6T87%)H8X8PkD za!-q{&&@?vOVo}DG@woS<>usI1KGNSwELOYRw@Itsh;G!FQNx~-c$4{g>2CWn`y6K zS8r-`csuzq`j{k;G;lJ@x-^}XEI0onZ%1p>J&gF9$=d2_$UGd62!U&w8&Rd7>u-DT zL2lfztSw%uxz+_H%YHTSQBoFIGLhcfPo!6l9TB$=@si7%tjxyGKoFed*hi*(>LP~} zuoz)j{?k8rzi3e}?Q*P=%L}hqjE;4m{JBr{!}=bs_S^k17_a1mg8nu>Tue8+w35o8Jj zR^1zzg#wV?#k<1$cI?=`9fdnfp9vsAtUdTrRXCS)Mz)*6C92PDUQBFZ@a`MK_+L$P zMmWIcWAXj(p^qOwhrf5w6rYP*{{8&X_!X7~AcAX7M59>YpR^yRSGrDBgT>wc#fSC} zpSfo7uvMk?Z5zudZ~Biy6HYP;J}Zwjww6shQj(-XN}v=M2S7d_)7fh1xyxu~spO8+B12|*W7lmB$Tw?L4bm|n z!H1>Nwe~AK*-WoF(bs78k?K=X20XE?o2b*s;ovzp5COiAK}Q~Rhtt8`e(_4>y?1-p zq+qgNB&l(i6UMm1=7uDqdh!B-FawG*%kZ-v4}Twc<8CJAl-^ffKbCzs&g1Zb%c?KB zIp=3Ev|tQz6?)iV7sbmu!wTiD`}!HV1Uesc5vY1LaOk|rZy6Lg9s~t$jE&v}i#;Q` ztg>34by>riZ7yI(#RrzTGJdrP@(+ReEB`8%uX?a}JqCa*v@K^~8AmSr1YBnmVg%93 zKnynElsuG%1H!Qk&!UeMt}CjC@+&f55H_o5;`KNe#3=!)IWSty1=r05?QLy#xX-jz zyj?L)aViB)8)xcUQJ!BWk-JXKJh{5?6efU?Ahe?Qv=1%FA>oiyLri~8iW0PBK(XP4 z8I^f=2xsY2Il;r(fwN8F(j`JyXW$c$O?CPmf{gax8pTw2Ki6AzZX&^h2A-FSW4YDv zD3I0A{U;W#-PcxsNR3~D((DXKtb8l~g!*%rI-Y)XTDXr3arHlM9Cb3OJ#4KawK($_ zF|YZ0PIY_mfb)tJ7_{Iu!vVk&PqLIhfy+ABwdJQ|0FimKKlspJ<>s(Qu~EOTG7`~d z#9a8yK>lhiuAA+y22d;2#-*YX=HpNZXo}(ziwvkIcsI zH9u1;s@GQ|TbEU&f>V^YSw0dW8Vqsx)5=eY{ddu>7{E8M5J;}L*o0Gl@f>?T?vl;& zAiA7B5kKcoc6|E=_GfS65l|v7YeqX=rKry->Ga!FB+fKlJ+Gf<+he(oI`-BH9hE12 zUYadM8fkvh(2nt&5Q|t*;&Z-=qaN=cr9#6@^t30_E3SEx?;m353{ay0ov(^WvHh0loOdh zH`dsZ1Q$o;fpjig5bW*?E4Hx=J?7ju$iBa6=F9GO2uFcjlC@z-B^)h^3K)&*GRM?0Eu~Sgr@k+_fP@_<%h8fG$!Ts*N0_pkQQ#Hxh_jy!?V*y}lC4g;xbGailY5#GHiCPnWU(Uj{J<)^# z@m$-aQ3*Bty&lgoI1TLO{5uo}@Oxb!4vUF@EP0r`?u5)Un)iTMPC1oS+QPnhe6;rj zhLhqsb$%Qj{VH8p?|J=Fo%;oMV$-dw|1ndC7ejEJ$Vd^bE{w zrG?PpQ=lGg7UQDVPX!sg#OQA`F*W_`y@NcXjFE@KAS7$*1u9m}B5AJI(*2g?ksduU5!XMZ=In^8YOq&~xZF<{Os+L?R) zNsi(ihzC+L9}{0&Dl*yC*Nb|1F5d_vJ1TGZXZB26_d4qb}U#Q(|W1!}wrWKzR1{N_M zS(p3Wqv!8dt#ehiC&XUb;h}&7Opxg(Aw9H5*|fy+Z54`PR(aXm4R)2H0eBaiwN{ud zO%RXy9NBbqXrpBsa;2`}1DjS^vO;00Ldpo!%C`K$i}21G6_nuzA{}%&_yIh;wizeuIduk=b4S-kMwA7dwbIZ!XIJ>A zucjD-o1;5UHHV{2>cm0UsZPFcW(beyk{L5dq2)b+?{fHO@aXR`vyB~|3hFB{b^W!d zBlI!o*Ua$l@3g`iN_U~hS&?}%fh}DT@OVMdrdl+M$emsCZg4pOcvp05)gHfU zQ4J~^Z66!lL+RNqexrr^YA*PumZ(1)`AFIx24lB>?`WwVtB|PxGudlIKgxg#xp+ASQY(0DVi^?+h82zv%qu}(o zI83flk@|*()m0oDb2h1Yy=7DMf@-Ts?9}se6LT$UVH?&$P;Duh5+8@ujxC>! zze;lO+;{cd*bqLg6^lZ*5~n@tpX2k~WrCmPiha1Y5`;=*?^tB^oe3x8AFVA?$zxiM zHidlj>Em37&6`+%B!s7VB}^Q|d^>SGQNfnX4iphqKTH}kx;Yfc7F7f{5W-n0UEcs} z?mt&QAPUJd#2ZsRaBv~tb_Y~q=-}JIgbG4vKbP_&6*uUd5+M9asiNfiyF4#UkNC?B z7yF`F@t6&F>)tVgnb`(xb)u1*rKRt+eAN2~)-h2*rGuw0MiLB%(BCFNBE`C5gZ=2V zCm^wfo!E!J6_%q=<%NW9Xs`RXI&0Y{S4@w`2v)YVzD@{w`7*ymk)2p4o%2q^ewe@S z2_TIwKq+-8X@yxl)E+3yOh@7!N7O3yscIMopD#s7zo9#@;*@5}sHk6ql_yL+fI<*z zDQ|QRQAcoVj!U;-+RFMB3D+%H`Atm_7N~g^8`zI&q9T%Xz_pVN{SwJqXvCkgqiAR6 zHTJOR(FDwycc$IXaEeTOLheP&%ZO;Q&FO}BzPhiqiA;$W4n(D}b4j~8ROT?p6An8c zfeeqb-0exLR_wubW>P$-96?VIo;Jen&amOj@0>I`Y^p*8XzOq??Cl&P|fe1VAN&=^YLM;k_(s0;< z`On8`x3QGjEzU%Z(hA##BVN@0RiE%qttQI*G7ybQ{p$X`{%SB~l+Y3<{?0=J^i9A? z1)q)2l-AW=VY)z&M3gbdGZ3I^&%$BVpkBF5lv`R+QT=RmWX>NcK!p7qmB|Ox?4@W@ z?mW}8v~*as6Q02a?euY{M+x;LqIf0oP0c$<=KJf-TF_MvcE3=qPLArI;*bZaj}6r$ z3}Ts>JEzwM9R>Qv3*x%{Nq)%q>nfW-lWJaGO<}(J&ZNt+9s$RZfO= z6Vl2R*l%TNUt824LRSZR=GAqnw>kV7iT|RmKb=@`#um{P-)r56|D6`%8U$NxRS;1J zX?%lVLNLq=r0}G4F)fwz^KSI&#|lO5zL<66C-B~~l1RXfyX_0<4{6HTXUrn=iyx6P zdQU(#@)p@!#^jeKNU!o0zn`dU3mnWX#_tZ`p*LvAR3uWjr)v}j4fZ{PgiGt0WP%mc z7_D8eg;b_Fo1SW9l&c8MJw zN7t|f1EGXl%0L}mzt<6PfoHqhWR;bEYmR@Vh27MDVZ({a@3Tu|>+*DUhnCrcp84|) zJc1_kD;A9?580vBhzo0xx!V=;(|Hm7ohXoqlv63gqj!(_1fdE>UG&UfuvZSxJ#)(0 zn>~tg@kd{uXqZe@ykE zp7YT>9@OvZ9QH{I$xIGbIY!AEe(;85a6tcNDvNw)K?>&E4cA(+tPc5f0*!&sg4^Qp zkMD1TrguU!8A(4&8=>rS`(H@WA#mpSGW}_{No2xN+wx#uEX|MaW>bDkYwH#AfdcMg zB9}uSI8p{y5@M2gXUCG&ZPYJDK*1|G?7PR$=N;1;Ehpf zW?9LQZ6}|1d$n>hX4Q=}l8}7q2#FuctHts5M6$ITT<*<=RKN&+s4ou(I>VZY`p>(# zx3ff{|4#j2J^ds41e?%uo(_cb7^` z+V31ojsXEreq8P=LUW2^Vv1A}d@^wx=ft6PAW$jCn>^jadxPE-0~6IkpvjceboL6Y z*oDM{jd~%_Koz7SyFMVKl@_=kH#hlQ_-=7Q0XBMQ%i9lmT-XYRF0@6NySc`&K{q!V(zYIr9VIZioR(b757`3FA=RN0|P z5AIQA`?pbWUW3izkoWE~`+It~bQcN-q(|Pv7yDhE@|ie@u^cp}ZM!1r*pY58*6X3a z#E%!$+doi+;~6_u#NW~f8)aH*r+)WAF(T^4Z=j^lWtV%Qy9 z8|QC3$o0&}9Y=wzEHE!)TA;5ns4m#Z{4eCi4Smp?Ha6g4*fdrLv?pxhwQ-L{eN$GP ztXa!Ou=ra{JwMPCv|U8ZdA3LK=H!zSsQtZj6!3Xk2zs2%lw*n!jCfei1EK^gi(o56 ztso~A@RIceB@k{YrVa2&9i$m^jpfyyn+k9P_nOi|Tc78{qt~@RYNh;~s5ANiGgW-9 z`qt*KyVEb&x{fSUD2fAm`RB$zH2RpLjd(z}1ntOzr9X9~Y<{NifWXppZ8UBK_1Ya? z7}5fTf`6yxY{2h4>UzE~_fr77c3NL{aZ&bF{o}(~x9>f*EWowac!2TfPqbrt$$Eqy z(oyi}C{5Ok2dMe!=LA~;gMAy5{orAR9VuHx&fke;@ODIo7ZJO#29klAFe5!|?nM`O zio`bUU^zXrVoX=@SJa`OaJ0@5#$EG9ha}JI*GO>ty#hmH{^}aVp7%@sX&pOOSqKiG z0BL7>MW{*(xd!Ly)o5`^a^TSOq%XoYZGl*{;E&JqRRkLPe3ajut^UeN|8D+#bQOv0 z>A8bx$xV4UVBaKBz{G21?P&-uk6{7I?5!^U%&B=Azi?YoPCMRCVzk4z247%%VsU<& z4mi`uFhUQr0j=^YP$h+7JS~cCG^c8mTt0sw#jijx6hs%TmCs%5V^dhsF>94ygCCDj zi0O0!*lK*T+$y68xC3N#D>~;C|>QE&|6b-^Zm}Nk!UE|ggdYzDPFjtY zHs0lLuEojI1Jg6$mrf^<9mnOvX)7mW(U}|NmYUd4%AF)L5z_8~Um?9J!!`c7IH^~Qu!M*iG}iwRJAXg(diq;OK~vX0iIK&lUX_HeWFCf9lOvWoC?;Nzq5Q-KxBw%9 zfS=%Cjf^O)R_yajt_Y$LYFST-g`1lzMZNV9Xt{##qmb7H5S22nrnIpo&MMbSJ)=2r zJl(O6)T$Gv=IRsaFQq7TZ#FvYJO+6!dR0L3G~SVMye;w<$QyA5?a}qHs$7&;^f#h0 zSd$ui@?78#O+6!sZi-JRo)X$S@fMV~`Q29G4M!ziUK=cJ?C)*p+%j0~W2uA$MVkK} zl-U4{uV8yWp_}A;l--7_qWN4HX598zCQKdqI^@yV-$$!qD58n3cy+X05>91R&pvTx zI%z~()F#o42U{ z?ShcDCRKOaH_ROEM9_DJ3ZRLTNxmOBt+3hrd<8^g8*T`iuuX!cc>!)s`tiI}zFUj34Z zZn(T#{rlzoUYzPu8)r_pvL%0U1fXihHox=uk6(N-t~7{MsSWol{vWQ)us9;7W2I{7 z1OT)|Jo!Lm-m)_6yB9X0LHTgYgObJN3d{%cs*sMYCcbA2%7ZQ^et;BUXr?MKaaD5C zPx(OW4n*z^-VCGItDi2zSsJ21cUPuBNJM41KVoeDp*SN%`B)hx+HJFB>FVuIWd4j< zdpzKXTlC@A30PlNKgVrQHwn%3`*)8FHk>W3i%`}u9s5H)qtaT9%DGT?<31=Y99}z3 zx2SEGcwJ}J7L;rBvGKv%i7#pfOJGpSl)Qptc{VN8(fY=FE)(Go?7?Z@VZMB@0gfVU z){}h=*U18fV;gpei5o?JnHz%5W%tgP(@UR1F^O}7f1Srwp%T!g?0V8rX6Uw@3k6f6 zy+~B2i(lTWT1`or$AOdY))hu1;GQ*)n*W;vqsDKP4%|g`^2bSP(o#~nN8=IS&()@` zyv0KG(BM-Tvt>xbBalGAVeI}Wb{Z*a&%bPiRpXZ~s*kHos-QG0NS2sAWR23|&x`-a z9I_O&UND?Db5-`bbwI*!qLstbg~S`5Kdu*bZIi%=na{43t2_fXfLvzPY0Ni!J;Sb$ zulah+wj{1P&kq!5+z#%#0mJ~C7E3|?e+M{J(+4*VTJ4MB*i^PX*`U8)fQwK*-3n64CU5A9*Kz36KLrERGCH%Qkrrn`s z&%-pE=OKJ`^{JrbKE4pz;IyclaIUoBb34X0Jo>NtTO_($gQidHW9XfueVM3nEXb#+ zSLdU@cQVhv(e9n!D4;jHG@si~^NStJfW>A_w8fI8|KI-3wxf1gV2lhu+eQ=Yy}ZBW zmL(bA{IIX)tJ?EQvz^@s(NY%%&M%~D7!?iU_Qf>+*7Zt$Byie-_j^PH-w%^nb)1Au z&oyeF0HKiAWiz%05zYQarKnDYIf0OL|7o`%HBG4t^^91sw?xNz%%fxcjnF*CD#vT! z0@%OBt`^aV7#f}5`DgEE{f>ZRxC#9ug!GT`F%@QfOL16CoU`unzx@}|h8D8w8;C8N z1CN+O1pa)#2PXSCiJvd=>zpf`E#oJGBfOuM)(TnQ?ulGN2S`@L_7b#hox8I z>w0w!Uke}AWr~mSVll7E8g#ikWJ*#c>ZXxonK7BRW;_w)y`yT(ramX`iZ6s@u(K=NVk?hDH#)$;wsT^tD&$kvx2i)18Q@Bu zrT6{Bytlb~rNs3sZDx9gr|xfsaKfbcE*hL?fZt%f#BhFT1}KrD86Py@?dY%0)&xc% zy=~KK$f4gb#KiQcX^Rs?=-n3hb`W)|O9Oc~KVM0uRzH7PfsYo2tq6;P=KC)160S7g z_jrloAMwAd(XJllkf?d?N^2$Su{x6cCiana2bw_XWqIH#AWs@*_=j3NGF};sI0sE&k@_PL|FGAh7hujFz%t0Ebj#BlV<{v};%FNol z{`)H6&GHqA?P?~q*_$35BUX#W_S~%-!ekozjG`CWBh!o{3?(m(0sG>Y567%kIu$3AHgdv!cq{BxC;!JCO+eBcMO%(rKIAfbzug?iJ?)5Wh7q3lDPtxPiY) zAp@n;!Lcyt@xcAB@f#gwJA-4O3j7nK7ZUqf<=pH^U%*c(=;o?#!^sa6>J4K5q?`a_ zl!m(XH#L1c&v#Z?3H+rr;h~rITQe?1fmYOK^gBgmydC=L-9EGZp``=loh4BoThb{p z)A6D_zb$r|+{;p`VR>-MmAu%aP^>;PASBU=D_dgr%nz36VrFG*gS8=d6lKngoQ&#( z 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 Fe*mor1#kcW diff --git a/doc/images/n-steps.png b/doc/images/n-steps.png deleted file mode 100644 index 988fe5dfce89e48f42763c1d4398d6816f5b8f4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1427 zcmV;E1#J3>P)600002VoOIv0063u zBQgL0010qNS#tmY07w7;07w8v$!k6U000Sga6xAP00B<`008j-Kn&ja000DfNklGb&ajO3TYOW;f4gIfD`WHK(-pC4E88vHVT^(0NY57{MqL^#b6sK!sC7iC2 z_1dVp?hgF_sKIIJrT$~$^xR9yN6+xAFY&B1oF3uS;FNK?M%K%#m9C<#`FWUT2>n^O z-&2Ir6Zcy}RKqka;SQumbQ?odaEw+!)bl-()zsI=t$)piu0YB&RiB{|M}AseQX)5K zPPRErT?JfmrF7I(m$V&vPV<_&d!a1U!w{{9>Vf@9(uq5arkS5AN6XQ^yBP72JwT=C z<$}r%wY@Fm?b1F^MLI~y(L70i|HRUfrNscXaTas7%SR@*R8x>nZ4G|2t+AzPO&DFmS{<;=`pxG)y6?RY7FnAco07br2YYG4zVK23(}H2Da7s9pI8AXH z_nsI*Y8P2FKpRn>Y^E7T3l>5R(8fHiS&VaxDxQorMu{gCP7O#Co|G6hF`M%Oqlqcc zu&mV`GyWr7EZv~TRu|YM_|(0j0eac6=RRzZ5UocFM9UEeVnLVH@h%1YH2i56A^mq3}xs)=Y>t9#E1!f2vj6bhrM*4>pr)uC!ptK72^@Y0fVtrbL{ z+LgenzFz$Ko~6HJ5Z$%(86ng>vg?bd5~8;`)89eV?XqSad^gZEa<4bO0bpZDD6+AZKN6WpZJ3Wn>^?c_2qnOdv;SZ*z2W zV{&P5bRZ~XWp-&}Wj%0iZE|6EDGCQC&hP*L05o((Safh?W;#e|Qe|^OZ*^{DX>Mmi zZ+HMRGc_(SH!*lJG%zkXIWa3VG&e3eHaIIXGBPeWIXJyna+Cl702FjZSafh?W;#}7 ha&u{KZU9h3MlCTeGYW{kWoZBa002ovPDHLkV1mwvi){b^ diff --git a/doc/macros.lyx b/doc/macros.lyx deleted file mode 100644 index 1e57e1675..000000000 --- a/doc/macros.lyx +++ /dev/null @@ -1,294 +0,0 @@ -#LyX 1.6.5 created this file. For more info see http://www.lyx.org/ -\lyxformat 345 -\begin_document -\begin_header -\textclass article -\use_default_options true -\language english -\inputencoding auto -\font_roman default -\font_sans default -\font_typewriter default -\font_default_family default -\font_sc false -\font_osf false -\font_sf_scale 100 -\font_tt_scale 100 - -\graphics default -\paperfontsize default -\use_hyperref false -\papersize default -\use_geometry false -\use_amsmath 1 -\use_esint 1 -\cite_engine basic -\use_bibtopic false -\paperorientation portrait -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\author "" -\author "" -\end_header - -\begin_body - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Derivatives -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\deriv}[2]{\frac{\partial#1}{\partial#2}} -{\frac{\partial#1}{\partial#2}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\at}[2]{#1\biggr\rvert_{#2}} -{#1\biggr\rvert_{#2}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Jac}[3]{ \at{\deriv{#1}{#2}} {#3} } -{\at{\deriv{#1}{#2}}{#3}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Lie Groups -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\xhat}{\hat{x}} -{\hat{x}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\yhat}{\hat{y}} -{\hat{y}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Ad}[1]{Ad_{#1}} -{Ad_{#1}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\define}{\stackrel{\Delta}{=}} -{\stackrel{\Delta}{=}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\gg}{\mathfrak{g}} -{\mathfrak{g}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Rn}{\mathbb{R}^{n}} -{\mathbb{R}^{n}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SO(2) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Rtwo}{\mathfrak{\mathbb{R}^{2}}} -{\mathfrak{\mathbb{R}^{2}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SOtwo}{SO(2)} -{SO(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sotwo}{\mathfrak{so(2)}} -{\mathfrak{so(2)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\that}{\hat{\theta}} -{\hat{\theta}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\skew}[1]{[#1]_{+}} -{[#1]_{+}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SE(2) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\SEtwo}{SE(2)} -{SE(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\setwo}{\mathfrak{se(2)}} -{\mathfrak{se(2)}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SO(3) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Rthree}{\mathfrak{\mathbb{R}^{3}}} -{\mathfrak{\mathbb{R}^{3}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SOthree}{SO(3)} -{SO(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sothree}{\mathfrak{so(3)}} -{\mathfrak{so(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\what}{\hat{\omega}} -{\hat{\omega}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Skew}[1]{[#1]_{\times}} -{[#1]_{\times}} -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SE(3) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FormulaMacro -\newcommand{\Rsix}{\mathfrak{\mathbb{R}^{6}}} -{\mathfrak{\mathbb{R}^{6}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SEthree}{SE(3)} -{SE(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sethree}{\mathfrak{se(3)}} -{\mathfrak{se(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\xihat}{\hat{\xi}} -{\hat{\xi}} -\end_inset - - -\end_layout - -\end_body -\end_document diff --git a/doc/math.lyx b/doc/math.lyx deleted file mode 100644 index fd620bcf2..000000000 --- a/doc/math.lyx +++ /dev/null @@ -1,2225 +0,0 @@ -#LyX 1.6.5 created this file. For more info see http://www.lyx.org/ -\lyxformat 345 -\begin_document -\begin_header -\textclass article -\use_default_options false -\language english -\inputencoding auto -\font_roman times -\font_sans default -\font_typewriter default -\font_default_family rmdefault -\font_sc false -\font_osf false -\font_sf_scale 100 -\font_tt_scale 100 - -\graphics default -\paperfontsize 12 -\spacing single -\use_hyperref false -\papersize default -\use_geometry true -\use_amsmath 1 -\use_esint 0 -\cite_engine basic -\use_bibtopic false -\paperorientation portrait -\leftmargin 1in -\topmargin 1in -\rightmargin 1in -\bottommargin 1in -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\author "" -\author "" -\end_header - -\begin_body - -\begin_layout Title -Geometry Derivatives and Other Hairy Math -\end_layout - -\begin_layout Author -Frank Dellaert -\end_layout - -\begin_layout Standard -\begin_inset Box Frameless -position "t" -hor_pos "c" -has_inner_box 1 -inner_pos "t" -use_parbox 0 -width "100col%" -special "none" -height "1in" -height_special "totalheight" -status collapsed - -\begin_layout Plain Layout -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Derivatives -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\deriv}[2]{\frac{\partial#1}{\partial#2}} -{\frac{\partial#1}{\partial#2}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\at}[2]{#1\biggr\rvert_{#2}} -{#1\biggr\rvert_{#2}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Jac}[3]{ \at{\deriv{#1}{#2}} {#3} } -{\at{\deriv{#1}{#2}}{#3}} -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -Lie Groups -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\xhat}{\hat{x}} -{\hat{x}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\yhat}{\hat{y}} -{\hat{y}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Ad}[1]{Ad_{#1}} -{Ad_{#1}} -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\define}{\stackrel{\Delta}{=}} -{\stackrel{\Delta}{=}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\gg}{\mathfrak{g}} -{\mathfrak{g}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Rn}{\mathbb{R}^{n}} -{\mathbb{R}^{n}} -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SO(2) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\Rtwo}{\mathfrak{\mathbb{R}^{2}}} -{\mathfrak{\mathbb{R}^{2}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SOtwo}{SO(2)} -{SO(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sotwo}{\mathfrak{so(2)}} -{\mathfrak{so(2)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\that}{\hat{\theta}} -{\hat{\theta}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\skew}[1]{[#1]_{+}} -{[#1]_{+}} -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SE(2) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\SEtwo}{SE(2)} -{SE(2)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\setwo}{\mathfrak{se(2)}} -{\mathfrak{se(2)}} -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SO(3) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\Rthree}{\mathfrak{\mathbb{R}^{3}}} -{\mathfrak{\mathbb{R}^{3}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SOthree}{SO(3)} -{SO(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sothree}{\mathfrak{so(3)}} -{\mathfrak{so(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\what}{\hat{\omega}} -{\hat{\omega}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\Skew}[1]{[#1]_{\times}} -{[#1]_{\times}} -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Note Comment -status open - -\begin_layout Plain Layout -SE(3) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset FormulaMacro -\newcommand{\Rsix}{\mathfrak{\mathbb{R}^{6}}} -{\mathfrak{\mathbb{R}^{6}}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\SEthree}{SE(3)} -{SE(3)} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\sethree}{\mathfrak{se(3)}} -{\mathfrak{se(3)}} -\end_inset - - -\begin_inset FormulaMacro -\newcommand{\xihat}{\hat{\xi}} -{\hat{\xi}} -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Derivatives of Lie Group Mappings -\end_layout - -\begin_layout Subsection -Homomorphisms -\end_layout - -\begin_layout Standard -The following is relevant -\begin_inset CommandInset citation -LatexCommand cite -after "page 45" -key "Hall00book" - -\end_inset - -: suppose that -\begin_inset Formula $\Phi:G\rightarrow H$ -\end_inset - - is a a mapping (Lie group homomorphism). - Then there exists a unique linear map -\begin_inset Formula $\phi:\gg\rightarrow\mathfrak{h}$ -\end_inset - - -\begin_inset Formula \[ -\phi(\xhat)\define\lim_{t\rightarrow0}\frac{d}{dt}\Phi\left(e^{t\xhat}\right)\] - -\end_inset - -such that -\end_layout - -\begin_layout Enumerate -\begin_inset Formula $\Phi\left(e^{\xhat}\right)=e^{\phi\left(\xhat\right)}$ -\end_inset - - -\end_layout - -\begin_layout Enumerate -\begin_inset Formula $\phi\left(T\xhat T^{-1}\right)=\Phi(T)\phi(\xhat)\Phi(T^{-1})$ -\end_inset - - -\end_layout - -\begin_layout Enumerate -\begin_inset Formula $\phi\left([\xhat,\yhat]\right)=\left[\phi(\xhat),\phi(\yhat)\right]$ -\end_inset - - -\end_layout - -\begin_layout Standard -In other words, the map -\begin_inset Formula $\phi$ -\end_inset - - is the derivative of -\begin_inset Formula $\Phi$ -\end_inset - - at the identity. - It suffices to compute -\begin_inset Formula $\phi$ -\end_inset - - for a basis of -\begin_inset Formula $\gg$ -\end_inset - -. - Since -\begin_inset Formula \[ -e^{-\xhat}=\left(e^{-\xhat}\right)^{-1}\] - -\end_inset - - clearly -\begin_inset Formula $\phi(\xhat)=-\xhat$ -\end_inset - - for the inverse mapping. -\end_layout - -\begin_layout Standard -\begin_inset Note Note -status open - -\begin_layout Plain Layout -Let us define two mappings -\begin_inset Formula \[ -\Phi_{1}(A)=AB\mbox{ and }\Phi_{2}(B)=AB\] - -\end_inset - -Then -\begin_inset Formula \[ -\phi_{1}(\xhat)=\lim_{t\rightarrow0}\frac{d}{dt}\Phi_{1}\left(e^{t\xhat}B\right)=\] - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Derivatives -\end_layout - -\begin_layout Standard -The derivatives for -\emph on -inverse, compose -\emph default -, and -\emph on -between -\emph default - can be derived from Lie group principles. - -\begin_inset Note Note -status collapsed - -\begin_layout Plain Layout -To find the derivatives of these functions, we look for the necessary -\begin_inset Quotes eld -\end_inset - -delta -\begin_inset Quotes erd -\end_inset - - in the tangent space of the function -\emph on -output -\emph default - -\begin_inset Formula $f(g)$ -\end_inset - - that corresponds to a -\begin_inset Quotes eld -\end_inset - -delta -\begin_inset Quotes erd -\end_inset - - in the tangent space of the function -\emph on -input -\emph default - -\begin_inset Formula $g$ -\end_inset - -. - -\end_layout - -\end_inset - -Specifically, to find the derivative of a function -\begin_inset Formula $f\left(g\right)$ -\end_inset - -, we want to find the Lie algebra element -\begin_inset Formula $\yhat\in\gg$ -\end_inset - -, that will result from changing -\begin_inset Formula $g$ -\end_inset - - using -\begin_inset Formula $\xhat$ -\end_inset - -, also in exponential coordinates: -\begin_inset Formula \[ -f\left(g\right)e^{\yhat}=f\left(ge^{\xhat}\right)\] - -\end_inset - -Calculating these derivatives requires that we know the form of the function - -\begin_inset Formula $f$ -\end_inset - -. -\end_layout - -\begin_layout Standard -Starting with -\series bold -inverse -\series default -, i.e., -\begin_inset Formula $f(g)=g^{-1}$ -\end_inset - -, we have -\begin_inset Formula \begin{align} -g^{-1}e^{\yhat} & =\left(ge^{\xhat}\right)^{-1}=e^{-\xhat}g^{-1}\nonumber \\ -e^{\yhat} & =ge^{-\xhat}g^{-1}=e^{\Ad g\left(-\xhat\right)}\nonumber \\ -\yhat & =\Ad g\left(-\xhat\right)\label{eq:Dinverse}\end{align} - -\end_inset - -In other words, and this is very intuitive in hindsight, the inverse is - just negation of -\begin_inset Formula $\xhat$ -\end_inset - -, along with an adjoint to make sure it is applied in the right frame! -\end_layout - -\begin_layout Standard - -\series bold -Compose -\series default - can be derived similarly. - Let us define two functions to find the derivatives in first and second - arguments: -\begin_inset Formula \[ -f_{1}(g)=gh\mbox{ and }f_{2}(h)=gh\] - -\end_inset - - The latter is easiest, as a change -\begin_inset Formula $\xhat$ -\end_inset - - in the second argument -\begin_inset Formula $h$ -\end_inset - - simply gets applied to the result -\begin_inset Formula $gh$ -\end_inset - -: -\begin_inset Formula \begin{align} -f_{2}(h)e^{\yhat} & =f_{2}\left(he^{\xhat}\right)\nonumber \\ -ghe^{\yhat} & =ghe^{\xhat}\nonumber \\ -\yhat & =\xhat\label{eq:Dcompose2}\end{align} - -\end_inset - -The derivative for the first argument is a bit trickier: -\begin_inset Formula \begin{align} -f_{1}(g)e^{\yhat} & =f_{1}\left(ge^{\xhat}\right)\nonumber \\ -ghe^{\yhat} & =ge^{\xhat}h\nonumber \\ -e^{\yhat} & =h^{-1}e^{\xhat}h=e^{\Ad{h^{-1}}\xhat}\nonumber \\ -\yhat & =\Ad{h^{-1}}\xhat\label{eq:Dcompose1}\end{align} - -\end_inset - -In other words, to apply a change -\begin_inset Formula $\xhat$ -\end_inset - - in -\begin_inset Formula $g$ -\end_inset - - we first need to undo -\begin_inset Formula $h$ -\end_inset - -, then apply -\begin_inset Formula $\xhat$ -\end_inset - -, and then apply -\begin_inset Formula $h$ -\end_inset - - again. - All can be done in one step by simply applying -\begin_inset Formula $\Ad{h^{-1}}\xhat$ -\end_inset - -. -\end_layout - -\begin_layout Standard -Finally, let us find the derivative of -\series bold -between -\series default -, defined as -\begin_inset Formula $between(g,h)=compose(inverse(g),h)$ -\end_inset - -. - The derivative in the second argument -\begin_inset Formula $h$ -\end_inset - - is similarly trivial: -\begin_inset Formula $\yhat=\xhat$ -\end_inset - -. - The first argument goes as follows: -\begin_inset Formula \begin{align} -f_{1}(g)e^{\yhat} & =f_{1}\left(ge^{\xhat}\right)\nonumber \\ -g^{-1}he^{\yhat} & =\left(ge^{\xhat}\right)^{-1}h=e^{\left(-\xhat\right)}g^{-1}h\nonumber \\ -e^{\yhat} & =\left(h^{-1}g\right)e^{\left(-\xhat\right)}\left(h^{-1}g\right)^{-1}=e^{\Ad{\left(h^{-1}g\right)}\left(-\xhat\right)}\nonumber \\ -\yhat & =\Ad{\left(h^{-1}g\right)}\left(-\xhat\right)=\Ad{between\left(h,g\right)}\left(-\xhat\right)\label{eq:Dbetween1}\end{align} - -\end_inset - -Hence, now we undo -\begin_inset Formula $h$ -\end_inset - - and then apply the inverse -\begin_inset Formula $\left(-\xhat\right)$ -\end_inset - - in the -\begin_inset Formula $g$ -\end_inset - - frame. -\end_layout - -\begin_layout Subsection* -Numerical Derivatives -\end_layout - -\begin_layout Standard -Let's examine -\begin_inset Formula \[ -f\left(g\right)e^{\yhat}=f\left(ge^{\xhat}\right)\] - -\end_inset - -and multiply with -\begin_inset Formula $f(g)^{-1}$ -\end_inset - - on both sides then take the log (which in our case returns -\begin_inset Formula $y$ -\end_inset - -, not -\begin_inset Formula $\yhat$ -\end_inset - -): -\begin_inset Formula \[ -y(x)=\log\left[f\left(g\right)^{-1}f\left(ge^{\xhat}\right)\right]\] - -\end_inset - -Let us look at -\begin_inset Formula $x=0$ -\end_inset - -, and perturb in direction -\begin_inset Formula $i$ -\end_inset - -, -\begin_inset Formula $e_{i}=[0,0,d,0,0]$ -\end_inset - -. - Then take derivative, -\begin_inset Formula \[ -\deriv{y(d)}d\define\lim_{d->0}\frac{y(d)-y(0)}{d}=\lim_{d->0}\frac{1}{d}\log\left[f\left(g\right)^{-1}f\left(ge^{\hat{e_{i}}}\right)\right]\] - -\end_inset - -which is the basis for a numerical derivative scheme. -\end_layout - -\begin_layout Standard -Let us also look at a chain rule. - If we know the behavior at the origin -\begin_inset Formula $I$ -\end_inset - -, we can extrapolate -\begin_inset Formula \[ -f(ge^{\xhat})=f(ge^{\xhat}g^{-1}g)=f(e^{\Ad g\xhat}g)\] - -\end_inset - - -\end_layout - -\begin_layout Section -Derivatives of Actions -\begin_inset CommandInset label -LatexCommand label -name "sec:Derivatives-of-Actions" - -\end_inset - - -\end_layout - -\begin_layout Subsection -Forward Action -\end_layout - -\begin_layout Standard -The (usual) action of an -\begin_inset Formula $n$ -\end_inset - --dimensional matrix group -\begin_inset Formula $G$ -\end_inset - - is matrix-vector multiplication on -\begin_inset Formula $\mathbb{R}^{n}$ -\end_inset - -, -\begin_inset Formula \[ -q=Tp\] - -\end_inset - -with -\begin_inset Formula $p,q\in\mathbb{R}^{n}$ -\end_inset - - and -\begin_inset Formula $T\in GL(n)$ -\end_inset - -. - Let us first do away with the derivative in -\begin_inset Formula $p$ -\end_inset - -, which is easy: -\begin_inset Formula \[ -\deriv{\left(Tp\right)}p=T\] - -\end_inset - -We would now like to know what an incremental action -\begin_inset Formula $\xhat$ -\end_inset - - would do, through the exponential map -\begin_inset Formula \[ -q(x)=Te^{\xhat}p\] - -\end_inset - -with derivative -\begin_inset Formula \[ -\deriv{q(x)}x=T\deriv{}x\left(e^{\xhat}p\right)\] - -\end_inset - -Since the matrix exponential is given by the series -\begin_inset Formula \[ -e^{A}=I+A+\frac{A^{2}}{2!}+\frac{A^{3}}{3!}+\ldots\] - -\end_inset - -we have, to first order -\begin_inset Formula \[ -e^{\xhat}p=p+\xhat p+\ldots\] - -\end_inset - -and the derivative of an incremental action x for matrix Lie groups becomes -\begin_inset Formula \[ -\deriv{q(x)}x=T\deriv{\left(\xhat p\right)}x\define TH_{p}\] - -\end_inset - -where -\begin_inset Formula $H_{p}$ -\end_inset - - is an -\begin_inset Formula $n\times n$ -\end_inset - - Jacobian matrix that depends on -\begin_inset Formula $p$ -\end_inset - -. - -\begin_inset Note Note -status collapsed - -\begin_layout Plain Layout -Recalling the definition -\begin_inset CommandInset ref -LatexCommand eqref -reference "eq:generators" - -\end_inset - - of the map -\begin_inset Formula $x\rightarrow\xhat$ -\end_inset - -, we can calculate -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none - -\begin_inset Formula $\xhat p$ -\end_inset - - -\family default -\series default -\shape default -\size default -\emph default -\bar default -\noun default -\color inherit - as (using tensor notation) -\begin_inset Formula \[ -\left(\xhat p\right)_{jk}=G_{jk}^{i}x_{i}p^{k}\] - -\end_inset - -and hence the derivative is -\begin_inset Formula \[ -\left(H_{p}\right)_{j}^{i}=G_{jk}^{i}p^{k}\] - -\end_inset - -and the final derivative becomes -\begin_inset Formula \[ -\deriv{q(x)}x=TH_{p}\] - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Inverse Action -\end_layout - -\begin_layout Standard -When we apply the inverse transformation -\begin_inset Formula \[ -q=T^{-1}p\] - -\end_inset - -we would now like to know what an incremental action -\begin_inset Formula $\xhat$ -\end_inset - - on -\begin_inset Formula $T$ -\end_inset - - would do: -\begin_inset Formula \begin{eqnarray*} -q(x) & = & \left(Te^{\xhat}\right)^{-1}p\\ - & = & e^{-\xhat}T^{-1}p\\ - & = & e^{-\xhat}q\\ - & \approx & q-\xhat q\end{eqnarray*} - -\end_inset - -Hence -\begin_inset Formula \begin{equation} -\deriv{q(x)}x=\deriv{\left(q-\xhat q\right)}x=-\deriv{\left(\xhat q\right)}x=-H_{q}\label{eq:inverseAction}\end{equation} - -\end_inset - -where -\begin_inset Formula $H_{q}$ -\end_inset - - will be as above. -\end_layout - -\begin_layout Section -Point3 -\end_layout - -\begin_layout Standard -A cross product -\begin_inset Formula $a\times b$ -\end_inset - - can be written as a matrix multiplication -\begin_inset Formula \[ -a\times b=\Skew ab\] - -\end_inset - -where -\begin_inset Formula $\Skew a$ -\end_inset - - is a skew-symmetric matrix defined as -\begin_inset Formula \[ -\Skew{x,y,z}=\left[\begin{array}{ccc} -0 & -z & y\\ -z & 0 & -x\\ --y & x & 0\end{array}\right]\] - -\end_inset - -We also have -\begin_inset Formula \[ -a^{T}\Skew b=-(\Skew ba)^{T}=-(a\times b)^{T}\] - -\end_inset - -The derivative of a cross product -\begin_inset Formula \begin{equation} -\frac{\partial(a\times b)}{\partial a}=\Skew{-b}\label{eq:Dcross1}\end{equation} - -\end_inset - - -\begin_inset Formula \begin{equation} -\frac{\partial(a\times b)}{\partial b}=\Skew a\label{eq:Dcross2}\end{equation} - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -2D Rotations -\end_layout - -\begin_layout Subsection -Rot2 (in gtsam) -\end_layout - -\begin_layout Standard -A rotation is stored as -\begin_inset Formula $(\cos\theta,\sin\theta)$ -\end_inset - -. - An incremental rotation is applied using the trigonometric sum rule: -\begin_inset Formula \[ -\cos\theta'=\cos\theta\cos\delta-\sin\theta\sin\delta\] - -\end_inset - - -\begin_inset Formula \[ -\sin\theta'=\sin\theta\cos\delta+\cos\theta\sin\delta\] - -\end_inset - -where -\begin_inset Formula $\delta$ -\end_inset - - is an incremental rotation angle. -\end_layout - -\begin_layout Subsection -Derivatives of Mappings -\end_layout - -\begin_layout Standard -We have the derivative of -\series bold -inverse -\series default -, -\begin_inset Formula \[ -\frac{\partial R^{T}}{\partial\theta}=-\Ad R=-1\mbox{ }\] - -\end_inset - - -\series bold -compose, -\series default - -\begin_inset Formula \[ -\frac{\partial\left(R_{1}R_{2}\right)}{\partial\theta_{1}}=\Ad{R_{2}^{T}}=1\mbox{ and }\frac{\partial\left(R_{1}R_{2}\right)}{\partial\theta_{2}}=1\] - -\end_inset - - -\series bold - -\begin_inset Formula $and$ -\end_inset - -between: -\series default - -\begin_inset Formula \[ -\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\theta_{1}}=-\Ad{R_{2}^{T}R_{1}}=-1\mbox{ and }\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\theta_{2}}=1\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Derivatives of Actions -\end_layout - -\begin_layout Standard -In the case of -\begin_inset Formula $\SOtwo$ -\end_inset - - the vector space is -\begin_inset Formula $\Rtwo$ -\end_inset - -, and the group action corresponds to rotating a point -\begin_inset Formula \[ -q=Rp\] - -\end_inset - -We would now like to know what an incremental rotation parameterized by - -\begin_inset Formula $\theta$ -\end_inset - - would do: -\begin_inset Formula \[ -q(\text{\omega t})=Re^{\skew{\omega t}}p\] - -\end_inset - -The derivative is (following the exposition in Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Derivatives-of-Actions" - -\end_inset - -): -\begin_inset Formula \[ -\deriv{q(\omega t)}t=R\deriv{}t\left(e^{\skew{\omega t}}p\right)=R\deriv{}t\left(\skew{\omega t}p\right)\] - -\end_inset - -Note that -\begin_inset Formula \begin{equation} -\skew{\theta}\left[\begin{array}{c} -x\\ -y\end{array}\right]=\theta R_{\pi/2}\left[\begin{array}{c} -x\\ -y\end{array}\right]=\theta\left[\begin{array}{c} --y\\ -x\end{array}\right]\label{eq:RestrictedCross}\end{equation} - -\end_inset - -which acts like a restricted -\begin_inset Quotes eld -\end_inset - -cross product -\begin_inset Quotes erd -\end_inset - - in the plane. - Hence -\begin_inset Formula \[ -\skew{\theta}p=\left[\begin{array}{c} --y\\ -x\end{array}\right]\theta=\omega R_{pi/2}pt\] - -\end_inset - -Hence, the final derivative of an action in its first argument is -\begin_inset Formula \[ -\deriv{q(\omega t)}{\omega t}=\omega RR_{pi/2}p=\omega R_{pi/2}Rp=\omega R_{pi/2}q\] - -\end_inset - - -\end_layout - -\begin_layout Standard -Really need to think of relationship -\begin_inset Formula $\omega$ -\end_inset - - and -\begin_inset Formula $t$ -\end_inset - -. - We don't have a time -\begin_inset Formula $t$ -\end_inset - - in our code. -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -2D Rigid Transformations -\end_layout - -\begin_layout Subsection -Derivatives of Mappings -\end_layout - -\begin_layout Standard -We can just define all derivatives in terms of the above adjoint map: -\begin_inset Formula \begin{eqnarray*} -\frac{\partial T^{^{-1}}}{\partial\xi} & = & -\Ad T\end{eqnarray*} - -\end_inset - - -\begin_inset Formula \begin{eqnarray*} -\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{1}} & = & \Ad{T_{2}^{^{-1}}}=1\mbox{ and }\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{2}}=I_{3}\end{eqnarray*} - -\end_inset - - -\begin_inset Formula \begin{eqnarray*} -\frac{\partial\left(T_{1}^{-1}T_{2}\right)}{\partial\xi_{1}} & = & -\Ad{T_{2}^{^{-1}}T_{1}}=-\Ad{between(T_{2},T_{1})}\mbox{ and }\frac{\partial\left(T_{1}^{-1}T_{2}\right)}{\partial\xi_{2}}=I_{3}\end{eqnarray*} - -\end_inset - - -\end_layout - -\begin_layout Subsection -The derivatives of Actions -\end_layout - -\begin_layout Standard -The action of -\begin_inset Formula $\SEtwo$ -\end_inset - - on 2D points is done by embedding the points in -\begin_inset Formula $\mathbb{R}^{3}$ -\end_inset - - by using homogeneous coordinates -\begin_inset Formula \[ -\hat{q}=\left[\begin{array}{c} -q\\ -1\end{array}\right]=\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=T\hat{p}\] - -\end_inset - -Analoguous to -\begin_inset Formula $\SEthree$ -\end_inset - -, we can compute a velocity -\begin_inset Formula $\xihat\hat{p}$ -\end_inset - - in the local -\begin_inset Formula $T$ -\end_inset - - frame: -\begin_inset Formula \[ -\xihat\hat{p}=\left[\begin{array}{cc} -\skew{\omega} & v\\ -0 & 0\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=\left[\begin{array}{c} -\skew{\omega}p+v\\ -0\end{array}\right]\] - -\end_inset - -By only taking the top two rows, we can write this as a velocity in -\begin_inset Formula $\Rtwo$ -\end_inset - -, as the product of a -\begin_inset Formula $2\times3$ -\end_inset - - matrix -\begin_inset Formula $H_{p}$ -\end_inset - - that acts upon the exponential coordinates -\begin_inset Formula $\xi$ -\end_inset - - directly: -\begin_inset Formula \[ -\skew{\omega}p+v=v+R_{\pi/2}p\omega=\left[\begin{array}{cc} -I_{2} & R_{\pi/2}p\end{array}\right]\left[\begin{array}{c} -v\\ -\omega\end{array}\right]=H_{p}\xi\] - -\end_inset - -Hence, the final derivative of the group action is -\begin_inset Formula \[ -\deriv{q(\xi)}{\xi}=R\left[\begin{array}{cc} -I_{2} & R_{\pi/2}p\end{array}\right]=\left[\begin{array}{cc} -R & R_{\pi/2}q\end{array}\right]\] - -\end_inset - -The derivative of the inverse action -\begin_inset Formula $\hat{q}=T^{-1}\hat{p}$ -\end_inset - - is given by -\begin_inset CommandInset ref -LatexCommand eqref -reference "eq:inverseAction" - -\end_inset - -, specialized to -\begin_inset Formula $\SEtwo$ -\end_inset - -: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -\deriv{\left(T^{-1}\hat{p}\right)}{\xi}=-T^{-1}\deriv{\left(\Ad T\hat{\xi}\right)\hat{p}}{\xi}\] - -\end_inset - -where the velocity now is -\begin_inset Formula \[ -\left(\Ad T\hat{\xi}\right)\hat{p}=\left[\begin{array}{cc} -\skew{\omega} & Rv-\omega R_{\pi/2}t\\ -0 & 0\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=\left[\begin{array}{c} -Rv+R_{\pi/2}(p-t)\omega\\ -0\end{array}\right]\] - -\end_inset - -and hence -\begin_inset Formula \[ -\deriv{q(\xi)}{\xi}=-R^{T}\left[\begin{array}{cc} -R & R_{\pi/2}(p-t)\end{array}\right]=\left[\begin{array}{cc} --I_{2} & -R_{\pi/2}q\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -3D Rotations -\end_layout - -\begin_layout Subsection -Derivatives of Mappings -\end_layout - -\begin_layout Standard -Hence, we are now in a position to simply posit the derivative of -\series bold -inverse -\series default -, -\begin_inset Formula \begin{eqnarray*} -\Skew{\omega'} & = & \Ad R\left(\Skew{-\omega}\right)=\Skew{R(-\omega)}\\ -\frac{\partial R^{T}}{\partial\omega} & = & -R\end{eqnarray*} - -\end_inset - - -\series bold -compose, -\series default - -\begin_inset Formula \[ -\Skew{\omega'}=\Ad{R_{2}^{T}}\left(\Skew{\omega}\right)=\Skew{R_{2}^{T}\omega}\] - -\end_inset - - -\begin_inset Formula \[ -\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{1}}=R_{2}^{T}\mbox{ and }\frac{\partial\left(R_{1}R_{2}\right)}{\partial\omega_{2}}=I_{3}\] - -\end_inset - - -\series bold -between -\series default - in its first argument, -\begin_inset Formula \begin{eqnarray*} -\Skew{\omega'} & = & \Ad{R_{2}^{T}R_{1}}\left(\Skew{-\omega}\right)=\Skew{R_{2}^{T}R_{1}(-\omega)}\\ -\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\omega_{1}} & = & -R_{2}^{T}R_{1}=-between(R_{2},R_{1})\end{eqnarray*} - -\end_inset - -and between in its second argument, -\begin_inset Formula \begin{eqnarray*} -\frac{\partial\left(R_{1}^{T}R_{2}\right)}{\partial\omega_{2}} & = & I_{3}\end{eqnarray*} - -\end_inset - - -\end_layout - -\begin_layout Subsection -Derivatives of Actions -\end_layout - -\begin_layout Standard -In the case of -\begin_inset Formula $\SOthree$ -\end_inset - - the vector space is -\begin_inset Formula $\Rthree$ -\end_inset - -, and the group action corresponds to rotating a point -\begin_inset Formula \[ -q=Rp\] - -\end_inset - -We would now like to know what an incremental rotation parameterized by - -\begin_inset Formula $\omega$ -\end_inset - - would do: -\begin_inset Formula \[ -q(\omega)=Re^{\Skew{\omega}}p\] - -\end_inset - -hence the derivative (following the exposition in Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Derivatives-of-Actions" - -\end_inset - -): -\begin_inset Formula \[ -\deriv{q(\omega)}{\omega}=R\deriv{}{\omega}\left(e^{\Skew{\omega}}p\right)=R\deriv{}{\omega}\left(\Skew{\omega}p\right)=RH_{p}\] - -\end_inset - -To calculate -\begin_inset Formula $H_{p}$ -\end_inset - - we make use of -\begin_inset Formula \[ -\Skew{\omega}p=\omega\times p=-p\times\omega=\Skew{-p}\omega\] - -\end_inset - -Hence, the final derivative of an action in its first argument is -\begin_inset Formula \[ -\deriv{q(\omega)}{\omega}=RH_{p}=R\Skew{-p}\] - -\end_inset - - -\end_layout - -\begin_layout Standard -The derivative of the inverse action is given by -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:inverseAction" - -\end_inset - -, specialized to -\begin_inset Formula $\SOthree$ -\end_inset - -: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -\deriv{q(\omega)}{\omega}=-R^{T}\deriv{\left(\Skew{R\omega\mbox{ }}p\right)}{\omega}=R^{T}\Skew pR=\Skew{R^{T}p}\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -3D Rigid Transformations -\end_layout - -\begin_layout Subsection -Derivatives of Mappings -\end_layout - -\begin_layout Standard -Hence, as with -\begin_inset Formula $\SOthree$ -\end_inset - -, we are now in a position to simply posit the derivative of -\series bold -inverse -\series default -, -\begin_inset Formula \[ -\frac{\partial T^{-1}}{\partial\xi}=\Ad T=-\left[\begin{array}{cc} -R & 0\\ -\Skew tR & R\end{array}\right]\] - -\end_inset - -(but unit test on the above fails !!!), -\series bold -compose -\series default - in its first argument, -\begin_inset Formula \[ -\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{1}}=\Ad{T_{2}^{-1}}=\left[\begin{array}{cc} -R_{2}^{T} & 0\\ -\Skew{-R_{2}^{T}t_{2}}R_{2}^{T} & R_{2}^{T}\end{array}\right]=\left[\begin{array}{cc} -R_{2}^{T} & 0\\ -R_{2}^{T}\Skew{-t_{2}} & R_{2}^{T}\end{array}\right]\] - -\end_inset - -compose in its second argument, -\begin_inset Formula \[ -\frac{\partial\left(T_{1}T_{2}\right)}{\partial\xi_{2}}=I_{6}\] - -\end_inset - - -\series bold -between -\series default - in its first argument, -\begin_inset Formula \[ -\frac{\partial\left(T_{1}^{^{-1}}T_{2}\right)}{\partial\xi_{1}}=\Ad{T_{21}}=-\left[\begin{array}{cc} -R & 0\\ -\Skew tR & R\end{array}\right]\] - -\end_inset - -with -\begin_inset Formula \[ -T_{12}=\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]=T_{1}^{^{-1}}T_{2}=between(T_{2},T_{1})\] - -\end_inset - -and between in its second argument, -\begin_inset Formula \begin{eqnarray*} -\frac{\partial\left(T_{1}^{^{-1}}T_{2}\right)}{\partial\xi_{1}} & = & I_{6}\end{eqnarray*} - -\end_inset - - -\end_layout - -\begin_layout Subsection -The derivatives of Actions -\end_layout - -\begin_layout Standard -The action of -\begin_inset Formula $\SEthree$ -\end_inset - - on 3D points is done by embedding the points in -\begin_inset Formula $\mathbb{R}^{4}$ -\end_inset - - by using homogeneous coordinates -\begin_inset Formula \[ -\hat{q}=\left[\begin{array}{c} -q\\ -1\end{array}\right]=\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=T\hat{p}\] - -\end_inset - -We would now like to know what an incremental rotation parameterized by - -\begin_inset Formula $\xi$ -\end_inset - - would do: -\begin_inset Formula \[ -\hat{q}(\xi)=Te^{\xihat}\hat{p}\] - -\end_inset - -hence the derivative (following the exposition in Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Derivatives-of-Actions" - -\end_inset - -): -\begin_inset Formula \[ -\deriv{\hat{q}(\xi)}{\xi}=T\deriv{}{\xi}\left(\xihat\hat{p}\right)=TH_{p}\] - -\end_inset - -where -\begin_inset Formula $\xihat\hat{p}$ -\end_inset - - corresponds to a velocity in -\begin_inset Formula $\mathbb{R}^{4}$ -\end_inset - - (in the local -\begin_inset Formula $T$ -\end_inset - - frame): -\begin_inset Formula \[ -\xihat\hat{p}=\left[\begin{array}{cc} -\Skew{\omega} & v\\ -0 & 0\end{array}\right]\left[\begin{array}{c} -p\\ -1\end{array}\right]=\left[\begin{array}{c} -\omega\times p+v\\ -0\end{array}\right]\] - -\end_inset - -Notice how velocities are anologous to points at infinity in projective - geometry: they correspond to free vectors indicating a direction and magnitude - of change. - -\end_layout - -\begin_layout Standard -By only taking the top three rows, we can write this as a velocity in -\begin_inset Formula $\Rthree$ -\end_inset - -, as the product of a -\begin_inset Formula $3\times6$ -\end_inset - - matrix -\begin_inset Formula $H_{p}$ -\end_inset - - that acts upon the exponential coordinates -\begin_inset Formula $\xi$ -\end_inset - - directly: -\begin_inset Formula \[ -\omega\times p+v=-p\times\omega+v=\left[\begin{array}{cc} --\Skew p & I_{3}\end{array}\right]\left[\begin{array}{c} -\omega\\ -v\end{array}\right]=H_{p}\xi\] - -\end_inset - -Hence, the final derivative of the group action is -\begin_inset Formula \[ -\deriv{\hat{q}(\xi)}{\xi}=T\hat{H}_{p}=\left[\begin{array}{cc} -R & t\\ -0 & 1\end{array}\right]\left[\begin{array}{cc} -\Skew{-p} & I_{3}\\ -0 & 0\end{array}\right]\] - -\end_inset - -in homogenous coordinates. - In -\begin_inset Formula $\Rthree$ -\end_inset - - this becomes: -\begin_inset Formula \[ -\deriv{q(\xi)}{\xi}=R\left[\begin{array}{cc} --\Skew p & I_{3}\end{array}\right]\] - -\end_inset - -The derivative of the inverse action -\begin_inset Formula $T^{-1}p$ -\end_inset - - is given by formula -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:inverseAction" - -\end_inset - -: -\end_layout - -\begin_layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -\begin_inset Formula \[ -\deriv{\hat{q}(\xi)}{\xi}=-H_{q}=\left[\begin{array}{cc} -\Skew q & -I_{3}\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Subsection -Pose3 (gtsam, old-style exmap) -\end_layout - -\begin_layout Standard -In the old-style, we have -\end_layout - -\begin_layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\noun off -\color none -\begin_inset Formula $R'=R(I+\Omega)$ -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Formula $t'=t+dt$ -\end_inset - - -\end_layout - -\begin_layout Standard -In this case, the derivative of -\series bold -\emph on -transform_from -\series default -\emph default -, -\begin_inset Formula $Rx+t$ -\end_inset - -: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -\frac{\partial(R(I+\Omega)x+t)}{\partial\omega}=\frac{\partial(R\Omega x)}{\partial\omega}=\frac{\partial(R\left(\omega\times x\right))}{\partial\omega}=R\Skew{-x}\] - -\end_inset - -and with respect to -\begin_inset Formula $dt$ -\end_inset - - is easy: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -\frac{\partial(Rx+t+dt)}{\partial dt}=I\] - -\end_inset - -The derivative of -\series bold -\emph on -transform_to -\series default -\emph default -, -\begin_inset Formula $inv(R)(x-t)$ -\end_inset - - we can obtain using the chain rule: -\begin_inset Formula \[ -\frac{\partial(inv(R)(x-t))}{\partial\omega}=\frac{\partial unrot(R,(x-t))}{\partial\omega}=skew(R^{T}\left(x-t\right))\] - -\end_inset - - -\end_layout - -\begin_layout Standard -and with respect to -\begin_inset Formula $dt$ -\end_inset - - is easy: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -\frac{\partial(R^{T}(x-t-dt))}{\partial dt}=-R^{T}\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage pagebreak -\end_inset - - -\end_layout - -\begin_layout Section -2D Line Segments (Ocaml) -\end_layout - -\begin_layout Standard -The error between an infinite line -\begin_inset Formula $(a,b,c)$ -\end_inset - - and a 2D line segment -\begin_inset Formula $((x1,y1),(x2,y2))$ -\end_inset - - is defined in Line3.ml. -\end_layout - -\begin_layout Section -Line3vd (Ocaml) -\end_layout - -\begin_layout Standard -One representation of a line is through 2 vectors -\begin_inset Formula $(v,d)$ -\end_inset - -, where -\begin_inset Formula $v$ -\end_inset - - is the direction and the vector -\begin_inset Formula $d$ -\end_inset - - points from the orgin to the closest point on the line. -\end_layout - -\begin_layout Standard -In this representation, transforming a 3D line from a world coordinate frame - to a camera at -\begin_inset Formula $(R_{w}^{c},t^{w})$ -\end_inset - - is done by -\begin_inset Formula \[ -v^{c}=R_{w}^{c}v^{w}\] - -\end_inset - - -\begin_inset Formula \[ -d^{c}=R_{w}^{c}\left(d^{w}+(t^{w}v^{w})v^{w}-t^{w}\right)\] - -\end_inset - - -\end_layout - -\begin_layout Section -Line3 (Ocaml) -\end_layout - -\begin_layout Standard -For 3D lines, we use a parameterization due to C.J. - Taylor, using a rotation matrix -\begin_inset Formula $R$ -\end_inset - - and 2 scalars -\begin_inset Formula $a$ -\end_inset - - and -\begin_inset Formula $b$ -\end_inset - -. - The line direction -\begin_inset Formula $v$ -\end_inset - - is simply the Z-axis of the rotated frame, i.e., -\begin_inset Formula $v=R_{3}$ -\end_inset - -, while the vector -\begin_inset Formula $d$ -\end_inset - - is given by -\begin_inset Formula $d=aR_{1}+bR_{2}$ -\end_inset - -. -\end_layout - -\begin_layout Standard -Now, we will -\emph on -not -\emph default - use the incremental rotation scheme we used for rotations: because the - matrix R translates from the line coordinate frame to the world frame, - we need to apply the incremental rotation on the right-side: -\begin_inset Formula \[ -R'=R(I+\Omega)\] - -\end_inset - -Projecting a line to 2D can be done easily, as both -\begin_inset Formula $v$ -\end_inset - - and -\begin_inset Formula $d$ -\end_inset - - are also the 2D homogenous coordinates of two points on the projected line, - and hence we have -\begin_inset Formula \begin{eqnarray*} -l & = & v\times d\\ - & = & R_{3}\times\left(aR_{1}+bR_{2}\right)\\ - & = & a\left(R_{3}\times R_{1}\right)+b\left(R_{3}\times R_{2}\right)\\ - & = & aR_{2}-bR_{1}\end{eqnarray*} - -\end_inset - -This can be written as a rotation of a point, -\begin_inset Formula \[ -l=R\left(\begin{array}{c} --b\\ -a\\ -0\end{array}\right)\] - -\end_inset - -but because the incremental rotation is now done on the right, we need to - figure out the derivatives again: -\begin_inset Formula \begin{equation} -\frac{\partial(R(I+\Omega)x)}{\partial\omega}=\frac{\partial(R\Omega x)}{\partial\omega}=R\frac{\partial(\Omega x)}{\partial\omega}=R\Skew{-x}\label{eq:rotateRight}\end{equation} - -\end_inset - -and hence the derivative of the projection -\begin_inset Formula $l$ -\end_inset - - with respect to the rotation matrix -\begin_inset Formula $R$ -\end_inset - -of the 3D line is -\begin_inset Formula \begin{equation} -\frac{\partial(l)}{\partial\omega}=R\Skew{\left(\begin{array}{c} -b\\ --a\\ -0\end{array}\right)}=\left[\begin{array}{ccc} -aR_{3} & bR_{3} & -(aR_{1}+bR_{2})\end{array}\right]\end{equation} - -\end_inset - -or the -\begin_inset Formula $a,b$ -\end_inset - - scalars: -\begin_inset Formula \[ -\frac{\partial(l)}{\partial a}=R_{2}\] - -\end_inset - - -\begin_inset Formula \[ -\frac{\partial(l)}{\partial b}=-R_{1}\] - -\end_inset - - -\end_layout - -\begin_layout Standard -Transforming a 3D line -\begin_inset Formula $(R,(a,b))$ -\end_inset - - from a world coordinate frame to a camera frame -\begin_inset Formula $(R_{w}^{c},t^{w})$ -\end_inset - - is done by -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -R'=R_{w}^{c}R\] - -\end_inset - - -\begin_inset Formula \[ -a'=a-R_{1}^{T}t^{w}\] - -\end_inset - - -\begin_inset Formula \[ -b'=b-R_{2}^{T}t^{w}\] - -\end_inset - -Again, we need to redo the derivatives, as R is incremented from the right. - The first argument is incremented from the left, but the result is incremented - on the right: -\begin_inset Formula \begin{eqnarray*} -R'(I+\Omega')=(AB)(I+\Omega') & = & (I+\Skew{S\omega})AB\\ -I+\Omega' & = & (AB)^{T}(I+\Skew{S\omega})(AB)\\ -\Omega' & = & R'^{T}\Skew{S\omega}R'\\ -\Omega' & = & \Skew{R'^{T}S\omega}\\ -\omega' & = & R'^{T}S\omega\end{eqnarray*} - -\end_inset - -For the second argument -\begin_inset Formula $R$ -\end_inset - - we now simply have: -\begin_inset Formula \begin{eqnarray*} -AB(I+\Omega') & = & AB(I+\Omega)\\ -\Omega' & = & \Omega\\ -\omega' & = & \omega\end{eqnarray*} - -\end_inset - -The scalar derivatives can be found by realizing that -\begin_inset Formula \[ -\left(\begin{array}{c} -a'\\ -b'\\ -...\end{array}\right)=\left(\begin{array}{c} -a\\ -b\\ -0\end{array}\right)-R^{T}t^{w}\] - -\end_inset - -where we don't care about the third row. - Hence -\begin_inset Formula \[ -\frac{\partial(\left(R(I+\Omega_{2})\right)^{T}t^{w})}{\partial\omega}=-\frac{\partial(\Omega_{2}R^{T}t^{w})}{\partial\omega}=-\Skew{R^{T}t^{w}}=\left[\begin{array}{ccc} -0 & R_{3}^{T}t^{w} & -R_{2}^{T}t^{w}\\ --R_{3}^{T}t^{w} & 0 & R_{1}^{T}t^{w}\\ -... & ... & 0\end{array}\right]\] - -\end_inset - - -\end_layout - -\begin_layout Section - -\series bold -Aligning 3D Scans -\end_layout - -\begin_layout Standard -Below is the explanaition underlying Pose3.align, i.e. - aligning two point clouds using SVD. - Inspired but modified from CVOnline... -\end_layout - -\begin_layout Standard - -\emph on -Our -\emph default - model is -\begin_inset Formula \[ -p^{c}=R\left(p^{w}-t\right)\] - -\end_inset - -i.e., -\begin_inset Formula $R$ -\end_inset - - is from camera to world, and -\begin_inset Formula $t$ -\end_inset - - is the camera location in world coordinates. - The objective function is -\begin_inset Formula \begin{equation} -\frac{1}{2}\sum\left(p^{c}-R(p^{w}-t)\right)^{2}=\frac{1}{2}\sum\left(p^{c}-Rp^{w}+Rt\right)^{2}=\frac{1}{2}\sum\left(p^{c}-Rp^{w}-t'\right)^{2}\label{eq:J}\end{equation} - -\end_inset - -where -\begin_inset Formula $t'=-Rt$ -\end_inset - - is the location of the origin in the camera frame. - Taking the derivative with respect to -\begin_inset Formula $t'$ -\end_inset - - and setting to zero we have -\begin_inset Formula \[ -\sum\left(p^{c}-Rp^{w}-t'\right)=0\] - -\end_inset - -or -\begin_inset Formula \begin{equation} -t'=\frac{1}{n}\sum\left(p^{c}-Rp^{w}\right)=\bar{p}^{c}-R\bar{p}^{w}\label{eq:t}\end{equation} - -\end_inset - -here -\begin_inset Formula $\bar{p}^{c}$ -\end_inset - - and -\begin_inset Formula $\bar{p}^{w}$ -\end_inset - - are the point cloud centroids. - Substituting back into -\begin_inset CommandInset ref -LatexCommand eqref -reference "eq:J" - -\end_inset - -, we get -\begin_inset Formula \[ -\frac{1}{2}\sum\left(p^{c}-R(p^{w}-t)\right)^{2}=\frac{1}{2}\sum\left(\left(p^{c}-\bar{p}^{c}\right)-R\left(p^{w}-\bar{p}^{w}\right)\right)^{2}=\frac{1}{2}\sum\left(\hat{p}^{c}-R\hat{p}^{w}\right)^{2}\] - -\end_inset - -Now, to minimize the above it suffices to maximize (see CVOnline) -\begin_inset Formula \[ -\mathop{trace}\left(R^{T}C\right)\] - -\end_inset - -where -\begin_inset Formula $C=\sum\hat{p}^{c}\left(\hat{p}^{w}\right)^{T}$ -\end_inset - - is the correlation matrix. - Intuitively, the cloud of points is rotated to align with the principal - axes. - This can be achieved by SVD decomposition on -\begin_inset Formula $C$ -\end_inset - - -\begin_inset Formula \[ -C=USV^{T}\] - -\end_inset - -and setting -\begin_inset Formula \[ -R=UV^{T}\] - -\end_inset - -Clearly, from -\begin_inset CommandInset ref -LatexCommand eqref -reference "eq:t" - -\end_inset - - we then also recover the optimal -\begin_inset Formula $t$ -\end_inset - - as -\begin_inset Formula \[ -t=\bar{p}^{w}-R^{T}\bar{p}^{c}\] - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset CommandInset bibtex -LatexCommand bibtex -bibfiles "/Users/dellaert/papers/refs" -options "plain" - -\end_inset - - -\end_layout - -\end_body -\end_document diff --git a/doc/math.pdf b/doc/math.pdf deleted file mode 100644 index 98e3fd75807bc2c32f8f6ef3a5d91938a0ad596d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119284 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

;EwFKoluYNO{)fr&%#&uJ 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

)#lM{EQ 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 C$mNFs diff --git a/gtsam-broken.h b/gtsam-broken.h deleted file mode 100644 index dd4ec379c..000000000 --- a/gtsam-broken.h +++ /dev/null @@ -1,144 +0,0 @@ -// These are currently broken -// Solve by parsing a namespace pose2SLAM::Values and making a Pose2SLAMValues class -// We also have to solve the shared pointer mess to avoid duplicate methods - -class GaussianFactor { - GaussianFactor(string key1, - Matrix A1, - Vector b_in, - const SharedDiagonal& model); - GaussianFactor(string key1, - Matrix A1, - string key2, - Matrix A2, - Vector b_in, - const SharedDiagonal& model); - GaussianFactor(string key1, - Matrix A1, - string key2, - Matrix A2, - string key3, - Matrix A3, - Vector b_in, - const SharedDiagonal& model); - bool involves(string key) const; - Matrix getA(string key) const; - pair matrix(const Ordering& ordering) const; - pair eliminate(string key) const; -}; - -class GaussianConditional { - GaussianConditional(string key, - Vector d, - Matrix R, - Vector sigmas); - GaussianConditional(string key, - Vector d, - Matrix R, - string name1, - Matrix S, - Vector sigmas); - GaussianConditional(string key, - Vector d, - Matrix R, - string name1, - Matrix S, - string name2, - Matrix T, - Vector sigmas); - void add(string key, Matrix S); -}; - -class GaussianFactorGraph { - GaussianConditional* eliminateOne(string key); - GaussianBayesNet* eliminate_(const Ordering& ordering); - VectorValues* optimize_(const Ordering& ordering); - pair matrix(const Ordering& ordering) const; - Matrix sparse(const Ordering& ordering) const; - VectorValues* steepestDescent_(const VectorValues& x0) const; - VectorValues* conjugateGradientDescent_(const VectorValues& x0) const; -}; - - -class Pose2Values{ - Pose2Values(); - Pose2 get(string key) const; - void insert(string name, const Pose2& val); - void print(string s) const; - void clear(); - int size(); -}; - -class Pose2Factor { - Pose2Factor(string key1, string key2, - const Pose2& measured, Matrix measurement_covariance); - void print(string name) const; - double error(const Pose2Values& c) const; - size_t size() const; - GaussianFactor* linearize(const Pose2Values& config) const; -}; - -class Pose2Graph{ - Pose2Graph(); - void print(string s) const; - GaussianFactorGraph* linearize_(const Pose2Values& config) const; - void push_back(Pose2Factor* factor); -}; - -class Ordering{ - Ordering(string key); - Ordering subtract(const Ordering& keys) const; - void unique (); - void reverse (); -}; - - -class SymbolicFactor{ - SymbolicFactor(const Ordering& keys); - void print(string s) const; -}; - - -class VectorValues { - void insert(string name, Vector val); - Vector get(string name) const; - bool contains(string name) const; -}; - -class Simulated2DPosePrior { - GaussianFactor* linearize(const Simulated2DValues& config) const; -}; - -class Simulated2DOrientedPosePrior { - GaussianFactor* linearize(const Simulated2DOrientedValues& config) const; -}; - -class Simulated2DPointPrior { - GaussianFactor* linearize(const Simulated2DValues& config) const; -}; - -class Simulated2DOdometry { - GaussianFactor* linearize(const Simulated2DValues& config) const; -}; - -class Simulated2DOrientedOdometry { - GaussianFactor* linearize(const Simulated2DOrientedValues& config) const; -}; - -class Simulated2DMeasurement { - GaussianFactor* linearize(const Simulated2DValues& config) const; -}; - -class Pose2SLAMOptimizer { - Pose2SLAMOptimizer(string dataset_name); - void print(string s) const; - void update(Vector x) const; - Vector optimize() const; - double error() const; - Matrix a1() const; - Matrix a2() const; - Vector b1() const; - Vector b2() const; -}; - - diff --git a/gtsam.h b/gtsam.h deleted file mode 100644 index 268b8b2fe..000000000 --- a/gtsam.h +++ /dev/null @@ -1,160 +0,0 @@ -class SharedGaussian { - SharedGaussian(Matrix covariance); - SharedGaussian(Vector sigmas); -}; - -class SharedDiagonal { - SharedDiagonal(Vector sigmas); -}; - -class Ordering { - Ordering(); - void print(string s) const; - bool equals(const Ordering& ord, double tol) const; - void push_back(string s); -}; - - -class VectorValues { - VectorValues(); - VectorValues(size_t nVars, size_t varDim); - void print(string s) const; - bool equals(const VectorValues& expected, double tol) const; - size_t size() const; -}; - -class GaussianFactor { - void print(string s) const; - bool equals(const GaussianFactor& lf, double tol) const; - bool empty() const; - Vector getb() const; - double error(const VectorValues& c) const; -}; - -class GaussianFactorSet { - GaussianFactorSet(); - void push_back(GaussianFactor* factor); -}; - -class GaussianConditional { - GaussianConditional(); - void print(string s) const; - bool equals(const GaussianConditional &cg, double tol) const; - Vector solve(const VectorValues& x); -}; - -class GaussianBayesNet { - GaussianBayesNet(); - void print(string s) const; - bool equals(const GaussianBayesNet& cbn, double tol) const; - void push_back(GaussianConditional* conditional); - void push_front(GaussianConditional* conditional); -}; - -class GaussianFactorGraph { - GaussianFactorGraph(); - void print(string s) const; - bool equals(const GaussianFactorGraph& lfgraph, double tol) const; - - size_t size() const; - void push_back(GaussianFactor* ptr_f); - double error(const VectorValues& c) const; - double probPrime(const VectorValues& c) const; - void combine(const GaussianFactorGraph& lfg); -}; - -class Point2 { - Point2(); - Point2(double x, double y); - void print(string s) const; - double x(); - double y(); -}; - -class Point3 { - Point3(); - Point3(double x, double y, double z); - Point3(Vector v); - void print(string s) const; - Vector vector() const; - double x(); - double y(); - double z(); -}; - -class Pose2 { - Pose2(); - Pose2(const Pose2& pose); - Pose2(double x, double y, double theta); - Pose2(double theta, const Point2& t); - Pose2(const Rot2& r, const Point2& t); - void print(string s) const; - bool equals(const Pose2& pose, double tol) const; - double x() const; - double y() const; - double theta() const; - size_t dim() const; - Pose2 expmap(const Vector& v) const; - Vector logmap(const Pose2& pose) const; - Point2 t() const; - Rot2 r() const; -}; - -class Simulated2DValues { - Simulated2DValues(); - void print(string s) const; - void insertPose(int i, const Point2& p); - void insertPoint(int j, const Point2& p); - int nrPoses() const; - int nrPoints() const; - Point2* pose(int i); - Point2* point(int j); -}; - -class Simulated2DOrientedValues { - Simulated2DOrientedValues(); - void print(string s) const; - void insertPose(int i, const Pose2& p); - void insertPoint(int j, const Point2& p); - int nrPoses() const; - int nrPoints() const; - Pose2* pose(int i); - Point2* point(int j); -}; - -class Simulated2DPosePrior { - Simulated2DPosePrior(Point2& mu, const SharedDiagonal& model, int i); - void print(string s) const; - double error(const Simulated2DValues& c) const; -}; - -class Simulated2DOrientedPosePrior { - Simulated2DOrientedPosePrior(Pose2& mu, const SharedDiagonal& model, int i); - void print(string s) const; - double error(const Simulated2DOrientedValues& c) const; -}; - -class Simulated2DPointPrior { - Simulated2DPointPrior(Point2& mu, const SharedDiagonal& model, int i); - void print(string s) const; - double error(const Simulated2DValues& c) const; -}; - -class Simulated2DOdometry { - Simulated2DOdometry(Point2& mu, const SharedDiagonal& model, int i1, int i2); - void print(string s) const; - double error(const Simulated2DValues& c) const; -}; - -class Simulated2DOrientedOdometry { - Simulated2DOrientedOdometry(Pose2& mu, const SharedDiagonal& model, int i1, int i2); - void print(string s) const; - double error(const Simulated2DOrientedValues& c) const; -}; - -class Simulated2DMeasurement { - Simulated2DMeasurement(Point2& mu, const SharedDiagonal& model, int i, int j); - void print(string s) const; - double error(const Simulated2DValues& c) const; -}; - diff --git a/wrap/.cvsignore b/wrap/.cvsignore deleted file mode 100644 index e9c87a8fc..000000000 --- a/wrap/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -Makefile -Makefile.in -wrap -.deps -.DS_Store diff --git a/wrap/Argument.cpp b/wrap/Argument.cpp deleted file mode 100644 index e44b3033c..000000000 --- a/wrap/Argument.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Argument.ccp - * Author: Frank Dellaert - **/ - -#include -#include -#include -#include - -#include "Argument.h" - -using namespace std; - -/* ************************************************************************* */ -void Argument::matlab_unwrap(ofstream& ofs, - const string& matlabName) -{ - // the templated unwrap function returns a pointer - // example: double tol = unwrap< double >(in[2]); - ofs << " "; - - if (is_ptr) - ofs << "shared_ptr<" << type << "> " << name << " = unwrap_shared_ptr< "; - else if (is_ref) - ofs << type << "& " << name << " = *unwrap_shared_ptr< "; - else - ofs << type << " " << name << " = unwrap< "; - - ofs << type << " >(" << matlabName; - if (is_ptr || is_ref) ofs << ", \"" << type << "\""; - ofs << ");" << endl; -} - -/* ************************************************************************* */ -string ArgumentList::types() { - string str; - bool first=true; - BOOST_FOREACH(Argument arg, *this) { - if (!first) str += ","; str += arg.type; first=false; - } - return str; -} - -/* ************************************************************************* */ -string ArgumentList::signature() { - string str; - BOOST_FOREACH(Argument arg, *this) - str += arg.type[0]; - return str; -} - -/* ************************************************************************* */ -string ArgumentList::names() { - string str; - bool first=true; - BOOST_FOREACH(Argument arg, *this) { - if (!first) str += ","; str += arg.name; first=false; - } - return str; -} - -/* ************************************************************************* */ -void ArgumentList::matlab_unwrap(ofstream& ofs, int start) { - int index = start; - BOOST_FOREACH(Argument arg, *this) { - stringstream buf; - buf << "in[" << index << "]"; - arg.matlab_unwrap(ofs,buf.str()); - index++; - } -} - -/* ************************************************************************* */ diff --git a/wrap/Argument.h b/wrap/Argument.h deleted file mode 100644 index 73c3ca12f..000000000 --- a/wrap/Argument.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Argument.h - * brief: arguments to constructors and methods - * Author: Frank Dellaert - **/ - -#pragma once - -#include -#include - -// Argument class -struct Argument { - bool is_const, is_ref, is_ptr; - std::string type; - std::string name; -Argument() : is_const(false), is_ref(false), is_ptr(false) {} - - // MATLAB code generation: - void matlab_unwrap(std::ofstream& ofs, - const std::string& matlabName); // MATLAB to C++ -}; - -// Argument list -struct ArgumentList : public std::list { - std::list args; - std::string types (); - std::string signature(); - std::string names (); - - // MATLAB code generation: - - /** - * emit code to unwrap arguments - * @param ofs output stream - * @param start initial index for input array, set to 1 for method - */ - void matlab_unwrap(std::ofstream& ofs, int start=0); // MATLAB to C++ -}; - diff --git a/wrap/Class.cpp b/wrap/Class.cpp deleted file mode 100644 index de1620733..000000000 --- a/wrap/Class.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Class.ccp - * Author: Frank Dellaert - **/ - -#include -#include - -#include - -#include "Class.h" -#include "utilities.h" - -using namespace std; - -/* ************************************************************************* */ -void Class::matlab_proxy(const string& classFile) { - // open destination classFile - ofstream ofs(classFile.c_str()); - if(!ofs) throw CantOpenFile(classFile); - if(verbose_) cerr << "generating " << classFile << endl; - - // emit class proxy code - emit_header_comment(ofs,"%"); - ofs << "classdef " << name << endl; - ofs << " properties" << endl; - ofs << " self = 0" << endl; - ofs << " end" << endl; - ofs << " methods" << endl; - ofs << " function obj = " << name << "(varargin)" << endl; - BOOST_FOREACH(Constructor c, constructors) - c.matlab_proxy_fragment(ofs,name); - ofs << " if nargin ~= 13 && obj.self == 0, error('" << name << " constructor failed'); end" << endl; - ofs << " end" << endl; - ofs << " function display(obj), obj.print(''); end" << endl; - ofs << " function disp(obj), obj.display; end" << endl; - ofs << " end" << endl; - ofs << "end" << endl; - - // close file - ofs.close(); -} - -/* ************************************************************************* */ -void Class::matlab_constructors(const string& toolboxPath,const string& nameSpace) { - BOOST_FOREACH(Constructor c, constructors) { - c.matlab_mfile (toolboxPath, name); - c.matlab_wrapper(toolboxPath, name, nameSpace); - } -} - -/* ************************************************************************* */ -void Class::matlab_methods(const string& classPath, const string& nameSpace) { - BOOST_FOREACH(Method m, methods) { - m.matlab_mfile (classPath); - m.matlab_wrapper(classPath, name, nameSpace); - } -} - -/* ************************************************************************* */ -void Class::matlab_make_fragment(ofstream& ofs, - const string& toolboxPath, - const string& mexFlags) -{ - string mex = "mex " + mexFlags + " "; - BOOST_FOREACH(Constructor c, constructors) - ofs << mex << c.matlab_wrapper_name(name) << ".cpp" << endl; - ofs << endl << "cd @" << name << endl; - BOOST_FOREACH(Method m, methods) - ofs << mex << m.name << ".cpp" << endl; - ofs << endl; -} - -/* ************************************************************************* */ diff --git a/wrap/Class.h b/wrap/Class.h deleted file mode 100644 index f00812b95..000000000 --- a/wrap/Class.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Class.h - * brief: describe the C++ class that is being wrapped - * Author: Frank Dellaert - **/ - -#pragma once - -#include -#include - -#include "Constructor.h" -#include "Method.h" - -// Class has name, constructors, methods -struct Class { - std::string name; - std::list constructors; - std::list methods; - bool verbose_; - - Class(bool verbose=true) : verbose_(verbose) {} - - // MATLAB code generation: - void matlab_proxy(const std::string& classFile); // proxy class - void matlab_constructors(const std::string& toolboxPath, - const std::string& nameSpace); // constructor wrappers - void matlab_methods(const std::string& classPath, - const std::string& nameSpace); // method wrappers - void matlab_make_fragment(std::ofstream& ofs, - const std::string& toolboxPath, - const std::string& mexFlags); // make fragment -}; - diff --git a/wrap/Constructor.cpp b/wrap/Constructor.cpp deleted file mode 100644 index d26e16a07..000000000 --- a/wrap/Constructor.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Constructor.ccp - * Author: Frank Dellaert - **/ - -#include -#include - -#include - -#include "utilities.h" -#include "Constructor.h" - -using namespace std; - -/* ************************************************************************* */ -string Constructor::matlab_wrapper_name(const string& className) { - string str = "new_" + className + "_" + args.signature(); - return str; -} - -/* ************************************************************************* */ -void Constructor::matlab_proxy_fragment(ofstream& ofs, const string& className) { - ofs << " if nargin == " << args.size() << ", obj.self = " - << matlab_wrapper_name(className) << "("; - bool first = true; - for(size_t i=0;i" << endl; - ofs << "#include <" << className << ".h>" << endl; - if (!nameSpace.empty()) ofs << "using namespace " << nameSpace << ";" << endl; - ofs << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])" << endl; - ofs << "{" << endl; - ofs << " checkArguments(\"" << name << "\",nargout,nargin," << args.size() << ");" << endl; - args.matlab_unwrap(ofs); // unwrap arguments - ofs << " " << className << "* self = new " << className << "(" << args.names() << ");" << endl; - ofs << " out[0] = wrap_constructed(self,\"" << className << "\");" << endl; - ofs << "}" << endl; - - // close file - ofs.close(); -} - -/* ************************************************************************* */ diff --git a/wrap/Constructor.h b/wrap/Constructor.h deleted file mode 100644 index 0a15c06d1..000000000 --- a/wrap/Constructor.h +++ /dev/null @@ -1,43 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Constructor.h - * brief: class describing a constructor + code generation - * Author: Frank Dellaert - **/ - -#pragma once - -#include -#include - -#include "Argument.h" - -// Constructor class -struct Constructor { - ArgumentList args; - bool verbose_; - - Constructor(bool verbose=true) : verbose_(verbose) {} - - // MATLAB code generation - // toolboxPath is main toolbox directory, e.g., ../matlab - // classFile is class proxy file, e.g., ../matlab/@Point2/Point2.m - - std::string matlab_wrapper_name(const std::string& className); // wrapper name - void matlab_proxy_fragment(std::ofstream& ofs, const std::string& className); // proxy class fragment - void matlab_mfile (const std::string& toolboxPath, const std::string& className); // m-file - void matlab_wrapper(const std::string& toolboxPath, - const std::string& className, - const std::string& nameSpace); // wrapper -}; - diff --git a/wrap/Makefile.am b/wrap/Makefile.am deleted file mode 100644 index 620dab26e..000000000 --- a/wrap/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ -common = utilities.cpp Argument.cpp Constructor.cpp Method.cpp Class.cpp Module.cpp - -check_PROGRAMS = testSpirit testWrap -testSpirit_SOURCES = testSpirit.cpp -testWrap_SOURCES = testWrap.cpp ${common} - -# generate local toolbox dir -interfacePath = $(top_srcdir) -moduleName = gtsam -toolboxpath = ../toolbox -nameSpace = "gtsam" -mexFlags = "${BOOST_CPPFLAGS} -I${prefix}/include -I${prefix}/include/gtsam/linear -I${prefix}/include/gtsam/nonlinear -I${prefix}/include/gtsam/base -I${prefix}/include/gtsam/geometry -I${prefix}/include/gtsam/slam -L${exec_prefix}/lib -lgtsam" -all: - ./wrap ${interfacePath} ${moduleName} ${toolboxpath} ${nameSpace} ${mexFlags} - -# install the header files -noinst_HEADERS = geometry.h utilities.h Argument.h Constructor.h Method.h Class.h Module.h wrap-matlab.h - -noinst_PROGRAMS = wrap -wrap_SOURCES = ${common} wrap.cpp -AM_CPPFLAGS = $(BOOST_CPPFLAGS) -I$(top_srcdir) -DTOPSRCDIR="\"$(top_srcdir)\"" -AM_CXXFLAGS = -MMD -AM_LDFLAGS = $(BOOST_LDFLAGS) -L../CppUnitLite -lCppUnitLite - -TESTS = $(check_PROGRAMS) - -# install the headers and matlab toolbox -install-exec-hook: all - install -d ${toolbox}/gtsam && \ - cp -rf ../toolbox/* ${toolbox}/gtsam && \ - install -d ${includedir}/wrap && \ - cp -f ${srcdir}/wrap-matlab.h ${includedir}/wrap/matlab.h - -# clean local toolbox dir -clean: - @test -z "wrap" || rm -f wrap - @test -z "../toolbox" || rm -rf ../toolbox - -# rule to run an executable -%.run: % libgtsam.la - ./$^ diff --git a/wrap/Method.cpp b/wrap/Method.cpp deleted file mode 100644 index cec6391bb..000000000 --- a/wrap/Method.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Method.ccp - * Author: Frank Dellaert - **/ - -#include -#include - -#include - -#include "Method.h" -#include "utilities.h" - -using namespace std; - -/* ************************************************************************* */ -// auxiliary function to wrap an argument into a shared_ptr template -/* ************************************************************************* */ -string maybe_shared_ptr(bool add, const string& type) { - string str = add? "shared_ptr<" : ""; - str += type; - if (add) str += ">"; - return str; -} - -/* ************************************************************************* */ -string Method::return_type(bool add_ptr, pairing p) { - if (p==pair && returns_pair) { - string str = "pair< " + - maybe_shared_ptr(add_ptr && returns_ptr, returns ) + ", " + - maybe_shared_ptr(add_ptr && returns_ptr, returns2) + " >"; - return str; - } else - return maybe_shared_ptr(add_ptr && returns_ptr, (p==arg2)? returns2 : returns); -} - -/* ************************************************************************* */ -void Method::matlab_mfile(const string& classPath) { - - // open destination m-file - string wrapperFile = classPath + "/" + name + ".m"; - ofstream ofs(wrapperFile.c_str()); - if(!ofs) throw CantOpenFile(wrapperFile); - if(verbose_) cerr << "generating " << wrapperFile << endl; - - // generate code - emit_header_comment(ofs, "%"); - ofs << "% usage: obj." << name << "(" << args.names() << ")" << endl; - string returnType = returns_pair? "[first,second]" : "result"; - ofs << "function " << returnType << " = " << name << "(obj"; - if (args.size()) ofs << "," << args.names(); - ofs << ")" << endl; - ofs << " error('need to compile " << name << ".cpp');" << endl; - ofs << "end" << endl; - - // close file - ofs.close(); -} - -/* ************************************************************************* */ -void Method::matlab_wrapper(const string& classPath, - const string& className, - const string& nameSpace) -{ - // open destination wrapperFile - string wrapperFile = classPath + "/" + name + ".cpp"; - ofstream ofs(wrapperFile.c_str()); - if(!ofs) throw CantOpenFile(wrapperFile); - if(verbose_) cerr << "generating " << wrapperFile << endl; - - // generate code - - // header - emit_header_comment(ofs, "//"); - ofs << "#include \n"; - ofs << "#include <" << className << ".h>\n"; - if (!nameSpace.empty()) ofs << "using namespace " << nameSpace << ";" << endl; - - // call - ofs << "void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; - // start - ofs << "{\n"; - - // check arguments - // extra argument obj -> nargin-1 is passed ! - // example: checkArguments("equals",nargout,nargin-1,2); - ofs << " checkArguments(\"" << name << "\",nargout,nargin-1," << args.size() << ");\n"; - - // get class pointer - // example: shared_ptr = unwrap_shared_ptr< Test >(in[0], "Test"); - ofs << " shared_ptr<" << className << "> self = unwrap_shared_ptr< " << className - << " >(in[0],\"" << className << "\");" << endl; - - // unwrap arguments, see Argument.cpp - args.matlab_unwrap(ofs,1); - - // call method - // example: bool result = self->return_field(t); - ofs << " "; - if (returns!="void") - ofs << return_type(true,pair) << " result = "; - ofs << "self->" << name << "(" << args.names() << ");\n"; - - // wrap result - // example: out[0]=wrap(result); - if (returns_pair) { - if (returns_ptr) - ofs << " out[0] = wrap_shared_ptr(result.first,\"" << returns << "\");\n"; - else - ofs << " out[0] = wrap< " << return_type(true,arg1) << " >(result.first);\n"; - if (returns_ptr2) - ofs << " out[1] = wrap_shared_ptr(result.second,\"" << returns2 << "\");\n"; - else - ofs << " out[1] = wrap< " << return_type(true,arg2) << " >(result.second);\n"; - } - else if (returns_ptr) - ofs << " out[0] = wrap_shared_ptr(result,\"" << returns << "\");\n"; - else if (returns!="void") - ofs << " out[0] = wrap< " << return_type(true,arg1) << " >(result);\n"; - - // finish - ofs << "}\n"; - - // close file - ofs.close(); -} - -/* ************************************************************************* */ diff --git a/wrap/Method.h b/wrap/Method.h deleted file mode 100644 index 8666f74ac..000000000 --- a/wrap/Method.h +++ /dev/null @@ -1,46 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Method.h - * brief: describes and generates code for methods - * Author: Frank Dellaert - **/ - -#pragma once - -#include -#include - -#include "Argument.h" - -// Method class -struct Method { - bool is_const; - ArgumentList args; - std::string returns, returns2, name; - bool returns_ptr, returns_ptr2, returns_pair; - bool verbose_; - - Method(bool verbose=true) : returns_ptr(false), returns_ptr2(false), returns_pair(false), verbose_(verbose) {} - - enum pairing {arg1, arg2, pair}; - std::string return_type(bool add_ptr, pairing p); - - // MATLAB code generation - // classPath is class directory, e.g., ../matlab/@Point2 - - void matlab_mfile (const std::string& classPath); // m-file - void matlab_wrapper(const std::string& classPath, - const std::string& className, - const std::string& nameSpace); // wrapper -}; - diff --git a/wrap/Module.cpp b/wrap/Module.cpp deleted file mode 100644 index 82977e336..000000000 --- a/wrap/Module.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Module.ccp - * Author: Frank Dellaert - **/ - -#include -#include - -//#define BOOST_SPIRIT_DEBUG -#include -#include - -#include "Module.h" -#include "utilities.h" - -using namespace std; -using namespace BOOST_SPIRIT_CLASSIC_NS; - -typedef rule Rule; - -/* ************************************************************************* */ -// We parse an interface file into a Module object. -// The grammar is defined using the boost/spirit combinatorial parser. -// For example, str_p("const") parses the string "const", and the >> -// operator creates a sequence parser. The grammar below, composed of rules -// and with start rule [class_p], doubles as the specs for our interface files. -/* ************************************************************************* */ - -Module::Module(const string& interfacePath, - const string& moduleName, bool verbose) : name(moduleName), verbose_(verbose) -{ - // these variables will be imperatively updated to gradually build [cls] - // The one with postfix 0 are used to reset the variables after parse. - Argument arg0, arg; - ArgumentList args0, args; - Constructor constructor0(verbose), constructor(verbose); - Method method0(verbose), method(verbose); - Class cls0(verbose),cls(verbose); - - //---------------------------------------------------------------------------- - // Grammar with actions that build the Class object. Actions are - // defined within the square brackets [] and are executed whenever a - // rule is successfully parsed. Define BOOST_SPIRIT_DEBUG to debug. - // The grammar is allows a very restricted C++ header: - // - No comments allowed. - // -Only types allowed are string, bool, size_t int, double, Vector, and Matrix - // as well as class names that start with an uppercase letter - // - The types unsigned int and bool should be specified as int. - // ---------------------------------------------------------------------------- - - // lexeme_d turns off white space skipping - // http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/directives.html - - Rule className_p = lexeme_d[upper_p >> *(alnum_p | '_')]; - - Rule classPtr_p = - className_p [assign_a(arg.type)] >> - ch_p('*') [assign_a(arg.is_ptr,true)]; - - Rule classRef_p = - !str_p("const") [assign_a(arg.is_const,true)] >> - className_p [assign_a(arg.type)] >> - ch_p('&') [assign_a(arg.is_ref,true)]; - - Rule basisType_p = - (str_p("string") | "bool" | "size_t" | "int" | "double"); - - Rule ublasType = - (str_p("Vector") | "Matrix")[assign_a(arg.type)] >> - !ch_p('*')[assign_a(arg.is_ptr,true)]; - - Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; - - Rule argument_p = - ((basisType_p[assign_a(arg.type)] | ublasType | classPtr_p | classRef_p) >> name_p[assign_a(arg.name)]) - [push_back_a(args, arg)] - [assign_a(arg,arg0)]; - - Rule argumentList_p = !argument_p >> * (',' >> argument_p); - - Rule constructor_p = - (className_p >> '(' >> argumentList_p >> ')' >> ';') - [assign_a(constructor.args,args)] - [assign_a(args,args0)] - [push_back_a(cls.constructors, constructor)] - [assign_a(constructor,constructor0)]; - - Rule returnType1_p = - basisType_p[assign_a(method.returns)] | - ((className_p | "Vector" | "Matrix")[assign_a(method.returns)] >> - !ch_p('*') [assign_a(method.returns_ptr,true)]); - - Rule returnType2_p = - basisType_p[assign_a(method.returns2)] | - ((className_p | "Vector" | "Matrix")[assign_a(method.returns2)] >> - !ch_p('*') [assign_a(method.returns_ptr2,true)]); - - Rule pair_p = - (str_p("pair") >> '<' >> returnType1_p >> ',' >> returnType2_p >> '>') - [assign_a(method.returns_pair,true)]; - - Rule void_p = str_p("void")[assign_a(method.returns)]; - - Rule returnType_p = void_p | returnType1_p | pair_p; - - Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; - - Rule method_p = - (returnType_p >> methodName_p[assign_a(method.name)] >> - '(' >> argumentList_p >> ')' >> - !str_p("const")[assign_a(method.is_const,true)] >> ';') - [assign_a(method.args,args)] - [assign_a(args,args0)] - [push_back_a(cls.methods, method)] - [assign_a(method,method0)]; - - Rule class_p = str_p("class") >> className_p[assign_a(cls.name)] >> '{' >> - *constructor_p >> - *method_p >> - '}' >> ";"; - - Rule module_p = +class_p - [push_back_a(classes,cls)] - [assign_a(cls,cls0)] - >> !end_p; - - //---------------------------------------------------------------------------- - // for debugging, define BOOST_SPIRIT_DEBUG -# ifdef BOOST_SPIRIT_DEBUG - BOOST_SPIRIT_DEBUG_NODE(className_p); - BOOST_SPIRIT_DEBUG_NODE(classPtr_p); - BOOST_SPIRIT_DEBUG_NODE(classRef_p); - BOOST_SPIRIT_DEBUG_NODE(basisType_p); - BOOST_SPIRIT_DEBUG_NODE(name_p); - BOOST_SPIRIT_DEBUG_NODE(argument_p); - BOOST_SPIRIT_DEBUG_NODE(argumentList_p); - BOOST_SPIRIT_DEBUG_NODE(constructor_p); - BOOST_SPIRIT_DEBUG_NODE(returnType1_p); - BOOST_SPIRIT_DEBUG_NODE(returnType2_p); - BOOST_SPIRIT_DEBUG_NODE(pair_p); - BOOST_SPIRIT_DEBUG_NODE(void_p); - BOOST_SPIRIT_DEBUG_NODE(returnType_p); - BOOST_SPIRIT_DEBUG_NODE(methodName_p); - BOOST_SPIRIT_DEBUG_NODE(method_p); - BOOST_SPIRIT_DEBUG_NODE(class_p); - BOOST_SPIRIT_DEBUG_NODE(module_p); -# endif - //---------------------------------------------------------------------------- - - // read interface file - string interfaceFile = interfacePath + "/" + moduleName + ".h"; - string contents = file_contents(interfaceFile); - - // Comment parser : does not work for some reason - rule<> comment_p = str_p("/*") >> +anychar_p >> "*/"; - rule<> skip_p = space_p; // | comment_p; - - // and parse contents - parse_info info = parse(contents.c_str(), module_p, skip_p); - if(!info.full) { - printf("parsing stopped at \n%.20s\n",info.stop); - throw ParseFailed(info.length); - } -} - -/* ************************************************************************* */ -void Module::matlab_code(const string& toolboxPath, - const string& nameSpace, - const string& mexFlags) -{ - try { - string installCmd = "install -d " + toolboxPath; - system(installCmd.c_str()); - - // create make m-file - string makeFile = toolboxPath + "/make_" + name + ".m"; - ofstream ofs(makeFile.c_str()); - if(!ofs) throw CantOpenFile(makeFile); - - if (verbose_) cerr << "generating " << makeFile << endl; - emit_header_comment(ofs,"%"); - ofs << "echo on" << endl << endl; - ofs << "toolboxpath = pwd" << endl; - ofs << "addpath(toolboxpath);" << endl << endl; - - // generate proxy classes and wrappers - BOOST_FOREACH(Class cls, classes) { - // create directory if needed - string classPath = toolboxPath + "/@" + cls.name; - string installCmd = "install -d " + classPath; - system(installCmd.c_str()); - - // create proxy class - string classFile = classPath + "/" + cls.name + ".m"; - cls.matlab_proxy(classFile); - - // create constructor and method wrappers - cls.matlab_constructors(toolboxPath,nameSpace); - cls.matlab_methods(classPath,nameSpace); - - // add lines to make m-file - ofs << "cd(toolboxpath)" << endl; - cls.matlab_make_fragment(ofs, toolboxPath, mexFlags); - } - - // finish make m-file - ofs << "cd(toolboxpath)" << endl << endl; - ofs << "echo off" << endl; - ofs.close(); - } - catch(exception &e) { - cerr << "generate_matlab_toolbox failed because " << e.what() << endl; - } - -} - -/* ************************************************************************* */ diff --git a/wrap/Module.h b/wrap/Module.h deleted file mode 100644 index 5ee1248ca..000000000 --- a/wrap/Module.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: Module.h - * brief: describes module to be wrapped - * Author: Frank Dellaert - **/ - -#pragma once - -#include -#include - -#include "Class.h" - -// A module has classes -struct Module { - std::string name; - std::list classes; - bool verbose_; - - /** - * constructor that parses interface file - */ - Module(const std::string& interfacePath, - const std::string& moduleName, - bool verbose=true); - - /** - * MATLAB code generation: - */ - void matlab_code(const std::string& path, - const std::string& nameSpace, - const std::string& mexFlags); -}; - diff --git a/wrap/expected/@Point2/Point2.m b/wrap/expected/@Point2/Point2.m deleted file mode 100644 index 9cdfd6fd5..000000000 --- a/wrap/expected/@Point2/Point2.m +++ /dev/null @@ -1,15 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -classdef Point2 - properties - self = 0 - end - methods - function obj = Point2(varargin) - if nargin == 0, obj.self = new_Point2_(); end - if nargin == 2, obj.self = new_Point2_dd(varargin{1},varargin{2}); end - if nargin ~= 13 && obj.self == 0, error('Point2 constructor failed'); end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/expected/@Point2/dim.cpp b/wrap/expected/@Point2/dim.cpp deleted file mode 100644 index 2955d58c3..000000000 --- a/wrap/expected/@Point2/dim.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("dim",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - int result = self->dim(); - out[0] = wrap< int >(result); -} diff --git a/wrap/expected/@Point2/dim.m b/wrap/expected/@Point2/dim.m deleted file mode 100644 index 93caab12f..000000000 --- a/wrap/expected/@Point2/dim.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.dim() -function result = dim(obj) - error('need to compile dim.cpp'); -end diff --git a/wrap/expected/@Point2/x.cpp b/wrap/expected/@Point2/x.cpp deleted file mode 100644 index 5f98d17c6..000000000 --- a/wrap/expected/@Point2/x.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("x",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - double result = self->x(); - out[0] = wrap< double >(result); -} diff --git a/wrap/expected/@Point2/x.m b/wrap/expected/@Point2/x.m deleted file mode 100644 index 4dae83bf5..000000000 --- a/wrap/expected/@Point2/x.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.x() -function result = x(obj) - error('need to compile x.cpp'); -end diff --git a/wrap/expected/@Point2/y.cpp b/wrap/expected/@Point2/y.cpp deleted file mode 100644 index 835aa8a1e..000000000 --- a/wrap/expected/@Point2/y.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("y",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point2 >(in[0],"Point2"); - double result = self->y(); - out[0] = wrap< double >(result); -} diff --git a/wrap/expected/@Point2/y.m b/wrap/expected/@Point2/y.m deleted file mode 100644 index 9e2897114..000000000 --- a/wrap/expected/@Point2/y.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.y() -function result = y(obj) - error('need to compile y.cpp'); -end diff --git a/wrap/expected/@Point3/Point3.m b/wrap/expected/@Point3/Point3.m deleted file mode 100644 index 139c7d079..000000000 --- a/wrap/expected/@Point3/Point3.m +++ /dev/null @@ -1,14 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -classdef Point3 - properties - self = 0 - end - methods - function obj = Point3(varargin) - if nargin == 3, obj.self = new_Point3_ddd(varargin{1},varargin{2},varargin{3}); end - if nargin ~= 13 && obj.self == 0, error('Point3 constructor failed'); end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/expected/@Point3/norm.cpp b/wrap/expected/@Point3/norm.cpp deleted file mode 100644 index 37ad329ce..000000000 --- a/wrap/expected/@Point3/norm.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("norm",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Point3 >(in[0],"Point3"); - double result = self->norm(); - out[0] = wrap< double >(result); -} diff --git a/wrap/expected/@Point3/norm.m b/wrap/expected/@Point3/norm.m deleted file mode 100644 index 02943303f..000000000 --- a/wrap/expected/@Point3/norm.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.norm() -function result = norm(obj) - error('need to compile norm.cpp'); -end diff --git a/wrap/expected/@Test/Test.m b/wrap/expected/@Test/Test.m deleted file mode 100644 index 31e5e35b2..000000000 --- a/wrap/expected/@Test/Test.m +++ /dev/null @@ -1,14 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -classdef Test - properties - self = 0 - end - methods - function obj = Test(varargin) - if nargin == 0, obj.self = new_Test_(); end - if nargin ~= 13 && obj.self == 0, error('Test constructor failed'); end - end - function display(obj), obj.print(''); end - function disp(obj), obj.display; end - end -end diff --git a/wrap/expected/@Test/create_ptrs.cpp b/wrap/expected/@Test/create_ptrs.cpp deleted file mode 100644 index 9a7215a60..000000000 --- a/wrap/expected/@Test/create_ptrs.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("create_ptrs",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - pair< shared_ptr, shared_ptr > result = self->create_ptrs(); - out[0] = wrap_shared_ptr(result.first,"Test"); - out[1] = wrap_shared_ptr(result.second,"Test"); -} diff --git a/wrap/expected/@Test/create_ptrs.m b/wrap/expected/@Test/create_ptrs.m deleted file mode 100644 index 0fbbd9be5..000000000 --- a/wrap/expected/@Test/create_ptrs.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.create_ptrs() -function [first,second] = create_ptrs(obj) - error('need to compile create_ptrs.cpp'); -end diff --git a/wrap/expected/@Test/print.cpp b/wrap/expected/@Test/print.cpp deleted file mode 100644 index 5db55477c..000000000 --- a/wrap/expected/@Test/print.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("print",nargout,nargin-1,0); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - self->print(); -} diff --git a/wrap/expected/@Test/print.m b/wrap/expected/@Test/print.m deleted file mode 100644 index 91e8ff31a..000000000 --- a/wrap/expected/@Test/print.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.print() -function result = print(obj) - error('need to compile print.cpp'); -end diff --git a/wrap/expected/@Test/return_TestPtr.cpp b/wrap/expected/@Test/return_TestPtr.cpp deleted file mode 100644 index 0c22621a6..000000000 --- a/wrap/expected/@Test/return_TestPtr.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_TestPtr",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - shared_ptr value = unwrap_shared_ptr< Test >(in[1], "Test"); - shared_ptr result = self->return_TestPtr(value); - out[0] = wrap_shared_ptr(result,"Test"); -} diff --git a/wrap/expected/@Test/return_TestPtr.m b/wrap/expected/@Test/return_TestPtr.m deleted file mode 100644 index 0753c283b..000000000 --- a/wrap/expected/@Test/return_TestPtr.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_TestPtr(value) -function result = return_TestPtr(obj,value) - error('need to compile return_TestPtr.cpp'); -end diff --git a/wrap/expected/@Test/return_bool.cpp b/wrap/expected/@Test/return_bool.cpp deleted file mode 100644 index d05f5c3b7..000000000 --- a/wrap/expected/@Test/return_bool.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_bool",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - bool value = unwrap< bool >(in[1]); - bool result = self->return_bool(value); - out[0] = wrap< bool >(result); -} diff --git a/wrap/expected/@Test/return_bool.m b/wrap/expected/@Test/return_bool.m deleted file mode 100644 index 3ef97ad8f..000000000 --- a/wrap/expected/@Test/return_bool.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_bool(value) -function result = return_bool(obj,value) - error('need to compile return_bool.cpp'); -end diff --git a/wrap/expected/@Test/return_double.cpp b/wrap/expected/@Test/return_double.cpp deleted file mode 100644 index edbffb889..000000000 --- a/wrap/expected/@Test/return_double.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_double",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - double value = unwrap< double >(in[1]); - double result = self->return_double(value); - out[0] = wrap< double >(result); -} diff --git a/wrap/expected/@Test/return_double.m b/wrap/expected/@Test/return_double.m deleted file mode 100644 index 87e2929da..000000000 --- a/wrap/expected/@Test/return_double.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_double(value) -function result = return_double(obj,value) - error('need to compile return_double.cpp'); -end diff --git a/wrap/expected/@Test/return_field.cpp b/wrap/expected/@Test/return_field.cpp deleted file mode 100644 index 727f6faa0..000000000 --- a/wrap/expected/@Test/return_field.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_field",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Test& t = *unwrap_shared_ptr< Test >(in[1], "Test"); - bool result = self->return_field(t); - out[0] = wrap< bool >(result); -} diff --git a/wrap/expected/@Test/return_field.m b/wrap/expected/@Test/return_field.m deleted file mode 100644 index 7e63e32e2..000000000 --- a/wrap/expected/@Test/return_field.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_field(t) -function result = return_field(obj,t) - error('need to compile return_field.cpp'); -end diff --git a/wrap/expected/@Test/return_int.cpp b/wrap/expected/@Test/return_int.cpp deleted file mode 100644 index 61b53f4ce..000000000 --- a/wrap/expected/@Test/return_int.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_int",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - int value = unwrap< int >(in[1]); - int result = self->return_int(value); - out[0] = wrap< int >(result); -} diff --git a/wrap/expected/@Test/return_int.m b/wrap/expected/@Test/return_int.m deleted file mode 100644 index df5502203..000000000 --- a/wrap/expected/@Test/return_int.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_int(value) -function result = return_int(obj,value) - error('need to compile return_int.cpp'); -end diff --git a/wrap/expected/@Test/return_matrix1.cpp b/wrap/expected/@Test/return_matrix1.cpp deleted file mode 100644 index c7b12ddad..000000000 --- a/wrap/expected/@Test/return_matrix1.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_matrix1",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Matrix value = unwrap< Matrix >(in[1]); - Matrix result = self->return_matrix1(value); - out[0] = wrap< Matrix >(result); -} diff --git a/wrap/expected/@Test/return_matrix1.m b/wrap/expected/@Test/return_matrix1.m deleted file mode 100644 index bb71670db..000000000 --- a/wrap/expected/@Test/return_matrix1.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_matrix1(value) -function result = return_matrix1(obj,value) - error('need to compile return_matrix1.cpp'); -end diff --git a/wrap/expected/@Test/return_matrix2.cpp b/wrap/expected/@Test/return_matrix2.cpp deleted file mode 100644 index e41cf5f96..000000000 --- a/wrap/expected/@Test/return_matrix2.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_matrix2",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Matrix value = unwrap< Matrix >(in[1]); - Matrix result = self->return_matrix2(value); - out[0] = wrap< Matrix >(result); -} diff --git a/wrap/expected/@Test/return_matrix2.m b/wrap/expected/@Test/return_matrix2.m deleted file mode 100644 index b8b74dd03..000000000 --- a/wrap/expected/@Test/return_matrix2.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_matrix2(value) -function result = return_matrix2(obj,value) - error('need to compile return_matrix2.cpp'); -end diff --git a/wrap/expected/@Test/return_pair.cpp b/wrap/expected/@Test/return_pair.cpp deleted file mode 100644 index 0e274049e..000000000 --- a/wrap/expected/@Test/return_pair.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_pair",nargout,nargin-1,2); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Vector v = unwrap< Vector >(in[1]); - Matrix A = unwrap< Matrix >(in[2]); - pair< Vector, Matrix > result = self->return_pair(v,A); - out[0] = wrap< Vector >(result.first); - out[1] = wrap< Matrix >(result.second); -} diff --git a/wrap/expected/@Test/return_pair.m b/wrap/expected/@Test/return_pair.m deleted file mode 100644 index 35348fd9b..000000000 --- a/wrap/expected/@Test/return_pair.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_pair(v,A) -function [first,second] = return_pair(obj,v,A) - error('need to compile return_pair.cpp'); -end diff --git a/wrap/expected/@Test/return_ptrs.cpp b/wrap/expected/@Test/return_ptrs.cpp deleted file mode 100644 index 4ad4c4fd4..000000000 --- a/wrap/expected/@Test/return_ptrs.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_ptrs",nargout,nargin-1,2); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - shared_ptr p1 = unwrap_shared_ptr< Test >(in[1], "Test"); - shared_ptr p2 = unwrap_shared_ptr< Test >(in[2], "Test"); - pair< shared_ptr, shared_ptr > result = self->return_ptrs(p1,p2); - out[0] = wrap_shared_ptr(result.first,"Test"); - out[1] = wrap_shared_ptr(result.second,"Test"); -} diff --git a/wrap/expected/@Test/return_ptrs.m b/wrap/expected/@Test/return_ptrs.m deleted file mode 100644 index ba1a16659..000000000 --- a/wrap/expected/@Test/return_ptrs.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_ptrs(p1,p2) -function [first,second] = return_ptrs(obj,p1,p2) - error('need to compile return_ptrs.cpp'); -end diff --git a/wrap/expected/@Test/return_size_t.cpp b/wrap/expected/@Test/return_size_t.cpp deleted file mode 100644 index ce5a1a9e4..000000000 --- a/wrap/expected/@Test/return_size_t.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_size_t",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - size_t value = unwrap< size_t >(in[1]); - size_t result = self->return_size_t(value); - out[0] = wrap< size_t >(result); -} diff --git a/wrap/expected/@Test/return_size_t.m b/wrap/expected/@Test/return_size_t.m deleted file mode 100644 index ad4500fd1..000000000 --- a/wrap/expected/@Test/return_size_t.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_size_t(value) -function result = return_size_t(obj,value) - error('need to compile return_size_t.cpp'); -end diff --git a/wrap/expected/@Test/return_string.cpp b/wrap/expected/@Test/return_string.cpp deleted file mode 100644 index d09e8fb31..000000000 --- a/wrap/expected/@Test/return_string.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_string",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - string value = unwrap< string >(in[1]); - string result = self->return_string(value); - out[0] = wrap< string >(result); -} diff --git a/wrap/expected/@Test/return_string.m b/wrap/expected/@Test/return_string.m deleted file mode 100644 index 28a02b0d1..000000000 --- a/wrap/expected/@Test/return_string.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_string(value) -function result = return_string(obj,value) - error('need to compile return_string.cpp'); -end diff --git a/wrap/expected/@Test/return_vector1.cpp b/wrap/expected/@Test/return_vector1.cpp deleted file mode 100644 index 079ebff09..000000000 --- a/wrap/expected/@Test/return_vector1.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_vector1",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Vector value = unwrap< Vector >(in[1]); - Vector result = self->return_vector1(value); - out[0] = wrap< Vector >(result); -} diff --git a/wrap/expected/@Test/return_vector1.m b/wrap/expected/@Test/return_vector1.m deleted file mode 100644 index 266017c86..000000000 --- a/wrap/expected/@Test/return_vector1.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_vector1(value) -function result = return_vector1(obj,value) - error('need to compile return_vector1.cpp'); -end diff --git a/wrap/expected/@Test/return_vector2.cpp b/wrap/expected/@Test/return_vector2.cpp deleted file mode 100644 index 693d3d06b..000000000 --- a/wrap/expected/@Test/return_vector2.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("return_vector2",nargout,nargin-1,1); - shared_ptr self = unwrap_shared_ptr< Test >(in[0],"Test"); - Vector value = unwrap< Vector >(in[1]); - Vector result = self->return_vector2(value); - out[0] = wrap< Vector >(result); -} diff --git a/wrap/expected/@Test/return_vector2.m b/wrap/expected/@Test/return_vector2.m deleted file mode 100644 index f237ce228..000000000 --- a/wrap/expected/@Test/return_vector2.m +++ /dev/null @@ -1,5 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -% usage: obj.return_vector2(value) -function result = return_vector2(obj,value) - error('need to compile return_vector2.cpp'); -end diff --git a/wrap/expected/make_geometry.m b/wrap/expected/make_geometry.m deleted file mode 100644 index a266b2d6d..000000000 --- a/wrap/expected/make_geometry.m +++ /dev/null @@ -1,44 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -echo on - -toolboxpath = pwd -addpath(toolboxpath); - -cd(toolboxpath) -mex -O5 new_Point2_.cpp -mex -O5 new_Point2_dd.cpp - -cd @Point2 -mex -O5 x.cpp -mex -O5 y.cpp -mex -O5 dim.cpp - -cd(toolboxpath) -mex -O5 new_Point3_ddd.cpp - -cd @Point3 -mex -O5 norm.cpp - -cd(toolboxpath) -mex -O5 new_Test_.cpp - -cd @Test -mex -O5 return_bool.cpp -mex -O5 return_size_t.cpp -mex -O5 return_int.cpp -mex -O5 return_double.cpp -mex -O5 return_string.cpp -mex -O5 return_vector1.cpp -mex -O5 return_matrix1.cpp -mex -O5 return_vector2.cpp -mex -O5 return_matrix2.cpp -mex -O5 return_pair.cpp -mex -O5 return_field.cpp -mex -O5 return_TestPtr.cpp -mex -O5 create_ptrs.cpp -mex -O5 return_ptrs.cpp -mex -O5 print.cpp - -cd(toolboxpath) - -echo off diff --git a/wrap/expected/new_Point2_.cpp b/wrap/expected/new_Point2_.cpp deleted file mode 100644 index 6a78d318d..000000000 --- a/wrap/expected/new_Point2_.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Point2_",nargout,nargin,0); - Point2* self = new Point2(); - out[0] = wrap_constructed(self,"Point2"); -} diff --git a/wrap/expected/new_Point2_.m b/wrap/expected/new_Point2_.m deleted file mode 100644 index b5cab71ab..000000000 --- a/wrap/expected/new_Point2_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -function result = new_Point2_(obj) - error('need to compile new_Point2_.cpp'); -end diff --git a/wrap/expected/new_Point2_dd.cpp b/wrap/expected/new_Point2_dd.cpp deleted file mode 100644 index 15a8a190d..000000000 --- a/wrap/expected/new_Point2_dd.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Point2_dd",nargout,nargin,2); - double x = unwrap< double >(in[0]); - double y = unwrap< double >(in[1]); - Point2* self = new Point2(x,y); - out[0] = wrap_constructed(self,"Point2"); -} diff --git a/wrap/expected/new_Point2_dd.m b/wrap/expected/new_Point2_dd.m deleted file mode 100644 index bdd42b766..000000000 --- a/wrap/expected/new_Point2_dd.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -function result = new_Point2_dd(obj,x,y) - error('need to compile new_Point2_dd.cpp'); -end diff --git a/wrap/expected/new_Point3_ddd.cpp b/wrap/expected/new_Point3_ddd.cpp deleted file mode 100644 index 82c95bdc6..000000000 --- a/wrap/expected/new_Point3_ddd.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Point3_ddd",nargout,nargin,3); - double x = unwrap< double >(in[0]); - double y = unwrap< double >(in[1]); - double z = unwrap< double >(in[2]); - Point3* self = new Point3(x,y,z); - out[0] = wrap_constructed(self,"Point3"); -} diff --git a/wrap/expected/new_Point3_ddd.m b/wrap/expected/new_Point3_ddd.m deleted file mode 100644 index 229b9658c..000000000 --- a/wrap/expected/new_Point3_ddd.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -function result = new_Point3_ddd(obj,x,y,z) - error('need to compile new_Point3_ddd.cpp'); -end diff --git a/wrap/expected/new_Test_.cpp b/wrap/expected/new_Test_.cpp deleted file mode 100644 index ab2171762..000000000 --- a/wrap/expected/new_Test_.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// automatically generated by wrap on 2010-Feb-23 -#include -#include -void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) -{ - checkArguments("new_Test_",nargout,nargin,0); - Test* self = new Test(); - out[0] = wrap_constructed(self,"Test"); -} diff --git a/wrap/expected/new_Test_.m b/wrap/expected/new_Test_.m deleted file mode 100644 index 1aae9b6f5..000000000 --- a/wrap/expected/new_Test_.m +++ /dev/null @@ -1,4 +0,0 @@ -% automatically generated by wrap on 2010-Feb-23 -function result = new_Test_(obj) - error('need to compile new_Test_.cpp'); -end diff --git a/wrap/geometry.h b/wrap/geometry.h deleted file mode 100644 index 9b1d80b00..000000000 --- a/wrap/geometry.h +++ /dev/null @@ -1,39 +0,0 @@ - -class Point2 { - Point2(); - Point2(double x, double y); - double x(); - double y(); - int dim() const; -}; - -class Point3 { - Point3(double x, double y, double z); - double norm() const; -}; - -class Test { - Test(); - - bool return_bool (bool value); - size_t return_size_t (size_t value); - int return_int (int value); - double return_double (double value); - - string return_string (string value); - Vector return_vector1(Vector value); - Matrix return_matrix1(Matrix value); - Vector return_vector2(Vector value); - Matrix return_matrix2(Matrix value); - - pair return_pair (Vector v, Matrix A); - - bool return_field(const Test& t) const; - - Test* return_TestPtr(Test* value); - - pair create_ptrs (); - pair return_ptrs (Test* p1, Test* p2); - - void print(); -}; diff --git a/wrap/hello.cpp b/wrap/hello.cpp deleted file mode 100644 index a140afd11..000000000 --- a/wrap/hello.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -// example for wrapping python with boost -// from http://www.boost.org/doc/libs/1_37_0/libs/python/doc/tutorial/doc/html/index.html - -char const* greet() -{ - return "hello, world"; -} - -#include - -BOOST_PYTHON_MODULE(hello_ext) -{ - using namespace boost::python; - def("greet", greet); -} diff --git a/wrap/testSpirit.cpp b/wrap/testSpirit.cpp deleted file mode 100644 index 120e5561f..000000000 --- a/wrap/testSpirit.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * Unit test for Boost's awesome Spirit parser - * Author: Frank Dellaert - **/ - -#include -#include -#include - -using namespace std; -using namespace BOOST_SPIRIT_CLASSIC_NS; - -typedef rule Rule; - -/* ************************************************************************* */ -// lexeme_d turns off white space skipping -// http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/doc/directives.html -Rule name_p = lexeme_d[alpha_p >> *(alnum_p | '_')]; -Rule className_p = lexeme_d[upper_p >> *(alnum_p | '_')]; -Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')]; - -Rule basisType_p = (str_p("string") | "bool" | "size_t" | "int" | "double" | "Vector" | "Matrix"); - -/* ************************************************************************* */ -TEST( spirit, real ) { - // check if we can parse 8.99 as a real - CHECK(parse("8.99", real_p, space_p).full); - // make sure parsing fails on this one - CHECK(!parse("zztop", real_p, space_p).full); -} - -/* ************************************************************************* */ -TEST( spirit, string ) { - // check if we can parse a string - CHECK(parse("double", str_p("double"), space_p).full); -} - -/* ************************************************************************* */ -TEST( spirit, sequence ) { - // check that we skip white space - CHECK(parse("int int", str_p("int") >> *str_p("int"), space_p).full); - CHECK(parse("int --- - -- -", str_p("int") >> *ch_p('-'), space_p).full); - CHECK(parse("const \t string", str_p("const") >> str_p("string"), space_p).full); - - // not that (see spirit FAQ) the vanilla rule<> does not deal with whitespace - rule<>vanilla_p = str_p("const") >> str_p("string"); - CHECK(!parse("const \t string", vanilla_p, space_p).full); - - // to fix it, we need to use - rulephrase_level_p = str_p("const") >> str_p("string"); - CHECK(parse("const \t string", phrase_level_p, space_p).full); -} - -/* ************************************************************************* */ -// parser for interface files - -// const string reference reference -Rule constStringRef_p = - str_p("const") >> "string" >> '&'; - -// class reference -Rule classRef_p = className_p >> '&'; - -// const class reference -Rule constClassRef_p = str_p("const") >> classRef_p; - -// method parsers -Rule constMethod_p = basisType_p >> methodName_p >> '(' >> ')' >> "const" >> ';'; - -/* ************************************************************************* */ -TEST( spirit, basisType_p ) { - CHECK(!parse("Point3", basisType_p, space_p).full); - CHECK(parse("string", basisType_p, space_p).full); -} - -/* ************************************************************************* */ -TEST( spirit, className_p ) { - CHECK(parse("Point3", className_p, space_p).full); -} - -/* ************************************************************************* */ -TEST( spirit, classRef_p ) { - CHECK(parse("Point3 &", classRef_p, space_p).full); - CHECK(parse("Point3&", classRef_p, space_p).full); -} - -/* ************************************************************************* */ -TEST( spirit, constMethod_p ) { - CHECK(parse("double norm() const;", constMethod_p, space_p).full); -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ diff --git a/wrap/testWrap.cpp b/wrap/testWrap.cpp deleted file mode 100644 index 6e9f84d59..000000000 --- a/wrap/testWrap.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * Unit test for wrap.c - * Author: Frank Dellaert - **/ - -#include -#include -#include -#include - -#include "utilities.h" -#include "Module.h" - -using namespace std; -static bool verbose = false; -#ifdef TOPSRCDIR -static string topdir = TOPSRCDIR; -#else -static string topdir = ".."; -#endif - -/* ************************************************************************* */ -TEST( wrap, ArgumentList ) { - ArgumentList args; - Argument arg; arg.type = "double"; arg.name = "x"; - args.push_back(arg); - args.push_back(arg); - args.push_back(arg); - CHECK(args.signature()=="ddd"); - CHECK(args.types()=="double,double,double"); - CHECK(args.names()=="x,x,x"); -} - -/* ************************************************************************* */ -TEST( wrap, check_exception ) { - THROWS_EXCEPTION(Module("/notarealpath", "geometry",verbose)); - CHECK_EXCEPTION(Module("/alsonotarealpath", "geometry",verbose), CantOpenFile); -} - -/* ************************************************************************* */ -TEST( wrap, parse ) { - string path = topdir + "/wrap"; - - Module module(path.c_str(), "geometry",verbose); - CHECK(module.classes.size()==3); - - // check second class, Point3 - Class cls = *(++module.classes.begin()); - CHECK(cls.name=="Point3"); - CHECK(cls.constructors.size()==1); - CHECK(cls.methods.size()==1); - - // first constructor takes 3 doubles - Constructor c1 = cls.constructors.front(); - CHECK(c1.args.size()==3); - - // check first double argument - Argument a1 = c1.args.front(); - CHECK(!a1.is_const); - CHECK(a1.type=="double"); - CHECK(!a1.is_ref); - CHECK(a1.name=="x"); - - // check method - Method m1 = cls.methods.front(); - CHECK(m1.returns=="double"); - CHECK(m1.name=="norm"); - CHECK(m1.args.size()==0); - CHECK(m1.is_const); -} - -/* ************************************************************************* */ -TEST( wrap, matlab_code ) { - // Parse into class object - string path = topdir + "/wrap"; - Module module(path,"geometry",verbose); - - // emit MATLAB code - // make_geometry will not compile, use make testwrap to generate real make - module.matlab_code("actual", "", "-O5"); - - CHECK(files_equal(path + "/expected/@Point2/Point2.m" , "actual/@Point2/Point2.m" )); - CHECK(files_equal(path + "/expected/@Point2/x.cpp" , "actual/@Point2/x.cpp" )); - - CHECK(files_equal(path + "/expected/@Point3/Point3.m" , "actual/@Point3/Point3.m" )); - CHECK(files_equal(path + "/expected/new_Point3_ddd.m" , "actual/new_Point3_ddd.m" )); - CHECK(files_equal(path + "/expected/new_Point3_ddd.cpp", "actual/new_Point3_ddd.cpp")); - CHECK(files_equal(path + "/expected/@Point3/norm.m" , "actual/@Point3/norm.m" )); - CHECK(files_equal(path + "/expected/@Point3/norm.cpp" , "actual/@Point3/norm.cpp" )); - - CHECK(files_equal(path + "/expected/new_Test_.cpp" , "actual/new_Test_.cpp" )); - CHECK(files_equal(path + "/expected/@Test/Test.m" , "actual/@Test/Test.m" )); - CHECK(files_equal(path + "/expected/@Test/return_string.cpp" , "actual/@Test/return_string.cpp" )); - CHECK(files_equal(path + "/expected/@Test/return_pair.cpp" , "actual/@Test/return_pair.cpp" )); - CHECK(files_equal(path + "/expected/@Test/return_field.cpp" , "actual/@Test/return_field.cpp" )); - CHECK(files_equal(path + "/expected/@Test/return_TestPtr.cpp", "actual/@Test/return_TestPtr.cpp")); - CHECK(files_equal(path + "/expected/@Test/return_ptrs.cpp" , "actual/@Test/return_ptrs.cpp" )); - CHECK(files_equal(path + "/expected/@Test/print.m" , "actual/@Test/print.m" )); - CHECK(files_equal(path + "/expected/@Test/print.cpp" , "actual/@Test/print.cpp" )); - - CHECK(files_equal(path + "/expected/make_geometry.m" , "actual/make_geometry.m" )); -} - -/* ************************************************************************* */ -int main() { TestResult tr; return TestRegistry::runAllTests(tr); } -/* ************************************************************************* */ diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp deleted file mode 100644 index f7376390f..000000000 --- a/wrap/utilities.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: utilities.ccp - * Author: Frank Dellaert - **/ - -#include -#include - -#include - -#include "utilities.h" - -using namespace std; -using namespace boost::gregorian; - -/* ************************************************************************* */ -string file_contents(const string& filename, bool skipheader) { - ifstream ifs(filename.c_str()); - if(!ifs) throw CantOpenFile(filename); - - // read file into stringstream - stringstream ss; - if (skipheader) ifs.ignore(256,'\n'); - ss << ifs.rdbuf(); - ifs.close(); - - // return string - return ss.str(); -} - -/* ************************************************************************* */ -bool files_equal(const string& expected, const string& actual, bool skipheader) { - try { - string expected_contents = file_contents(expected, skipheader); - string actual_contents = file_contents(actual, skipheader); - bool equal = actual_contents == expected_contents; - if (!equal) { - stringstream command; - command << "diff " << actual << " " << expected << endl; - system(command.str().c_str()); - } - return equal; - } - catch (const string& reason) { - cerr << "expection: " << reason << endl; - return false; - } - return true; -} - -/* ************************************************************************* */ -void emit_header_comment(ofstream& ofs, const string& delimiter) { - date today = day_clock::local_day(); - ofs << delimiter << " automatically generated by wrap on " << today << endl; -} - -/* ************************************************************************* */ diff --git a/wrap/utilities.h b/wrap/utilities.h deleted file mode 100644 index e75c44025..000000000 --- a/wrap/utilities.h +++ /dev/null @@ -1,60 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: utilities.ccp - * Author: Frank Dellaert - **/ - -#pragma once - -#include -#include - -class CantOpenFile : public std::exception { - private: - std::string filename_; - public: - CantOpenFile(const std::string& filename) : filename_(filename) {} - ~CantOpenFile() throw() {} - virtual const char* what() const throw() { - return ("Can't open file " + filename_).c_str(); - } -}; - -class ParseFailed : public std::exception { - private: - int length_; - public: - ParseFailed(int length) : length_(length) {} - ~ParseFailed() throw() {} - virtual const char* what() const throw() { - std::stringstream buf; - buf << "Parse failed at character " << (length_+1); - return buf.str().c_str(); - } -}; - -/** - * read contents of a file into a std::string - */ -std::string file_contents(const std::string& filename, bool skipheader=false); - -/** - * Check whether two files are equal - * By default, skips the first line of actual so header is not generated - */ -bool files_equal(const std::string& expected, const std::string& actual, bool skipheader=true); - -/** - * emit a header at the top of generated files - */ -void emit_header_comment(std::ofstream& ofs, const std::string& delimiter); diff --git a/wrap/wrap-matlab.h b/wrap/wrap-matlab.h deleted file mode 100644 index 6889daaa6..000000000 --- a/wrap/wrap-matlab.h +++ /dev/null @@ -1,438 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -// header file to be included in MATLAB wrappers -// Copyright (c) 2008 Frank Dellaert, All Rights reserved -// wrapping and unwrapping is done using specialized templates, see -// http://www.cplusplus.com/doc/tutorial/templates.html - -extern "C" { -#include -} - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace boost; // not usual, but for conciseness of generated code - -// start GTSAM Specifics ///////////////////////////////////////////////// -typedef numeric::ublas::vector Vector; -typedef numeric::ublas::matrix Matrix; -// to make keys be constructed from strings: -#define GTSAM_MAGIC_KEY -// to enable Matrix and Vector constructor for SharedGaussian: -#define GTSAM_MAGIC_GAUSSIAN -// end GTSAM Specifics ///////////////////////////////////////////////// - -#ifdef __LP64__ -// 64-bit Mac -#define mxUINT32OR64_CLASS mxUINT64_CLASS -#else -#define mxUINT32OR64_CLASS mxUINT32_CLASS -#endif - -//***************************************************************************** -// Utilities -//***************************************************************************** - -void error(const char* str) { - mexErrMsgIdAndTxt("wrap:error", str); -} - -mxArray *scalar(mxClassID classid) { - mwSize dims[1]; dims[0]=1; - return mxCreateNumericArray(1, dims, classid, mxREAL); -} - -void checkScalar(const mxArray* array, const char* str) { - int m = mxGetM(array), n = mxGetN(array); - if (m!=1 || n!=1) - mexErrMsgIdAndTxt("wrap: not a scalar in ", str); -} - -//***************************************************************************** -// Check arguments -//***************************************************************************** - -void checkArguments(const string& name, int nargout, int nargin, int expected) { - stringstream err; - err << name << " expects " << expected << " arguments, not " << nargin; - if (nargin!=expected) - error(err.str().c_str()); -} - -//***************************************************************************** -// wrapping C++ basis types in MATLAB arrays -//***************************************************************************** - -// default wrapping throws an error: only basis types are allowed in wrap -template -mxArray* wrap(Class& value) { - error("wrap internal error: attempted wrap of invalid type"); -} - -// specialization to string -// wraps into a character array -template<> -mxArray* wrap(string& value) { - return mxCreateString(value.c_str()); -} - -// specialization to bool -template<> -mxArray* wrap(bool& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(bool*)mxGetData(result) = value; - return result; -} - -// specialization to size_t -template<> -mxArray* wrap(size_t& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(size_t*)mxGetData(result) = value; - return result; -} - -// specialization to int -template<> -mxArray* wrap(int& value) { - mxArray *result = scalar(mxUINT32OR64_CLASS); - *(int*)mxGetData(result) = value; - return result; -} - -// specialization to double -> just double -template<> -mxArray* wrap(double& value) { - return mxCreateDoubleScalar(value); -} - -// wrap a const BOOST vector into a double vector -mxArray* wrap_Vector(const Vector& v) { - int m = v.size(); - mxArray *result = mxCreateDoubleMatrix(m, 1, mxREAL); - double *data = mxGetPr(result); - for (int i=0;i double vector -template<> -mxArray* wrap(Vector& v) { - return wrap_Vector(v); -} - -// const version -template<> -mxArray* wrap(const Vector& v) { - return wrap_Vector(v); -} - -// wrap a const BOOST MATRIX into a double matrix -mxArray* wrap_Matrix(const Matrix& A) { - int m = A.size1(), n = A.size2(); - mxArray *result = mxCreateDoubleMatrix(m, n, mxREAL); - double *data = mxGetPr(result); - // converts from column-major to row-major - for (int j=0;j double matrix -template<> -mxArray* wrap(Matrix& A) { - return wrap_Matrix(A); -} - -// const version -template<> -mxArray* wrap(const Matrix& A) { - return wrap_Matrix(A); -} - -//***************************************************************************** -// unwrapping MATLAB arrays into C++ basis types -//***************************************************************************** - -// default unwrapping throws an error -// as wrap only supports passing a reference or one of the basic types -template -T unwrap(const mxArray* array) { - error("wrap internal error: attempted unwrap of invalid type"); -} - -// specialization to string -// expects a character array -// Warning: relies on mxChar==char -template<> -string unwrap(const mxArray* array) { - char *data = mxArrayToString(array); - if (data==NULL) error("unwrap: not a character array"); - string str(data); - mxFree(data); - return str; -} - -// specialization to bool -template<> -bool unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return mxGetScalar(array) != 0.0; -} - -// specialization to size_t -template<> -size_t unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return (size_t)mxGetScalar(array); -} - -// specialization to int -template<> -int unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return (int)mxGetScalar(array); -} - -// specialization to double -template<> -double unwrap(const mxArray* array) { - checkScalar(array,"unwrap"); - return (double)mxGetScalar(array); -} - -// specialization to BOOST vector -template<> -Vector unwrap< Vector >(const mxArray* array) { - int m = mxGetM(array), n = mxGetN(array); - if (mxIsDouble(array)==false || n!=1) error("unwrap: not a vector"); - double* data = (double*)mxGetData(array); - Vector v(m); - copy(data,data+m,v.begin()); - return v; -} - -// specialization to BOOST matrix -template<> -Matrix unwrap< Matrix >(const mxArray* array) { - if (mxIsDouble(array)==false) error("unwrap: not a matrix"); - int m = mxGetM(array), n = mxGetN(array); - double* data = (double*)mxGetData(array); - Matrix A(m,n); - // converts from row-major to column-major - for (int j=0;j class Collector; - -template -class ObjectHandle { -private: - ObjectHandle* signature; // use 'this' as a unique object signature - const std::type_info* type; // type checking information - shared_ptr t; // object pointer - -public: - // Constructor for free-store allocated objects. - // Creates shared pointer, will delete if is last one to hold pointer - ObjectHandle(T* ptr) : - type(&typeid(T)), t(shared_ptr (ptr)) { - signature = this; - Collector::register_handle(this); - } - - // Constructor for shared pointers - // Creates shared pointer, will delete if is last one to hold pointer - ObjectHandle(shared_ptr ptr) : - type(&typeid(T)), t(ptr) { - signature = this; - } - - ~ObjectHandle() { - // object is in shared_ptr, will be automatically deleted - signature = 0; // destroy signature - } - - // Get the actual object contained by handle - shared_ptr get_object() const { - return t; - } - - // Print the mexhandle for debugging - void print(const char* str) { - mexPrintf("mexhandle %s:\n", str); - mexPrintf(" signature = %d:\n", signature); - mexPrintf(" pointer = %d:\n", t.get()); - } - - // Convert ObjectHandle to a mxArray handle (to pass back from mex-function). - // Create a numeric array as handle for an ObjectHandle. - // We ASSUME we can store object pointer in the mxUINT32 element of mxArray. - mxArray* to_mex_handle() { - mxArray* handle = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); - *reinterpret_cast**> (mxGetPr(handle)) = this; - return handle; - } - - string type_name() const { - return type->name(); - } - - // Convert mxArray (passed to mex-function) to an ObjectHandle. - // Import a handle from MatLab as a mxArray of UINT32. Check that - // it is actually a pointer to an ObjectHandle. - static ObjectHandle* from_mex_handle(const mxArray* handle) { - if (mxGetClassID(handle) != mxUINT32OR64_CLASS || mxIsComplex(handle) - || mxGetM(handle) != 1 || mxGetN(handle) != 1) error( - "Parameter is not an ObjectHandle type."); - - // We *assume* we can store ObjectHandle pointer in the mxUINT32 of handle - ObjectHandle* obj = *reinterpret_cast (mxGetPr(handle)); - - if (!obj) // gross check to see we don't have an invalid pointer - error("Parameter is NULL. It does not represent an ObjectHandle object."); - // TODO: change this for max-min check for pointer values - - if (obj->signature != obj) // check memory has correct signature - error("Parameter does not represent an ObjectHandle object."); - - /* - if (*(obj->type) != typeid(T)) { // check type - mexPrintf("Given: <%s>, Required: <%s>.\n", obj->type_name(), typeid(T).name()); - error("Given ObjectHandle does not represent the correct type."); - } - */ - - return obj; - } - - friend class Collector ; // allow Collector access to signature -}; - -// --------------------------------------------------------- -// ------------------ Garbage Collection ------------------- -// --------------------------------------------------------- - -// Garbage collection singleton (one collector object for each type T). -// Ensures that registered handles are deleted when the dll is released (they -// may also be deleted previously without problem). -// The Collector provides protection against resource leaks in the case -// where 'clear all' is called in MatLab. (This is because MatLab will call -// the destructors of statically allocated objects but not free-store allocated -// objects.) -template -class Collector { - typedef ObjectHandle Handle; - typedef std::list< Handle* > ObjList; - typedef typename ObjList::iterator iterator; - ObjList objlist; -public: - ~Collector() { - for (iterator i= objlist.begin(); i!=objlist.end(); ++i) { - if ((*i)->signature == *i) // check for valid signature - delete *i; - } - } - - static void register_handle (Handle* obj) { - static Collector singleton; - singleton.objlist.push_back(obj); - } - -private: // prevent construction - Collector() {} - Collector(const Collector&); -}; - -//***************************************************************************** -// wrapping C++ objects in a MATLAB proxy class -//***************************************************************************** - -/* - For every C++ class Class, a matlab proxy class @Class/Class.m object - is created. Its constructor will check which of the C++ constructors - needs to be called, based on nr of arguments. It then calls the - corresponding mex function new_Class_signature, which will create a - C++ object using new, and pass the pointer to wrap_constructed - (below). This creates a mexhandle and returns it to the proxy class - constructor, which assigns it to self. Matlab owns this handle now. -*/ -template -mxArray* wrap_constructed(Class* pointer, const char *classname) { - ObjectHandle* handle = new ObjectHandle(pointer); - return handle->to_mex_handle(); -} - -/* - [create_object] creates a MATLAB proxy class object with a mexhandle - in the self property. Matlab does not allow the creation of matlab - objects from within mex files, hence we resort to an ugly trick: we - invoke the proxy class constructor by calling MATLAB, and pass 13 - dummy arguments to let the constructor know we want an object without - the self property initialized. We then assign the mexhandle to self. -*/ -// TODO: think about memory -mxArray* create_object(const char *classname, mxArray* h) { - mxArray *result; - mxArray* dummy[13] = {h,h,h,h,h, h,h,h,h,h, h,h,h}; - mexCallMATLAB(1,&result,13,dummy,classname); - mxSetProperty(result, 0, "self", h); - return result; -} - -/* - When the user calls a method that returns a shared pointer, we create - an ObjectHandle from the shared_pointer and return it as a proxy - class to matlab. -*/ -template -mxArray* wrap_shared_ptr(shared_ptr< Class > shared_ptr, const char *classname) { - ObjectHandle* handle = new ObjectHandle(shared_ptr); - return create_object(classname,handle->to_mex_handle()); -} - -//***************************************************************************** -// unwrapping a MATLAB proxy class to a C++ object reference -//***************************************************************************** - -/* - Besides the basis types, the only other argument type allowed is a - shared pointer to a C++ object. In this case, matlab needs to pass a - proxy class object to the mex function. [unwrap_shared_ptr] extracts - the ObjectHandle from the self property, and returns a shared pointer - to the object. -*/ -template -shared_ptr unwrap_shared_ptr(const mxArray* obj, const string& className) { - bool isClass = mxIsClass(obj, className.c_str()); - if (!isClass) { - mexPrintf("Expected %s, got %s\n", className.c_str(), mxGetClassName(obj)); - error("Argument has wrong type."); - } - mxArray* mxh = mxGetProperty(obj,0,"self"); - if (mxh==NULL) error("unwrap_reference: invalid wrap object"); - ObjectHandle* handle = ObjectHandle::from_mex_handle(mxh); - return handle->get_object(); -} - -//***************************************************************************** diff --git a/wrap/wrap.cpp b/wrap/wrap.cpp deleted file mode 100644 index 1a52da6bd..000000000 --- a/wrap/wrap.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* ---------------------------------------------------------------------------- - - * GTSAM Copyright 2010, Georgia Tech Research Corporation, - * Atlanta, Georgia 30332-0415 - * All Rights Reserved - * Authors: Frank Dellaert, et al. (see THANKS for the full author list) - - * See LICENSE for the license information - - * -------------------------------------------------------------------------- */ - -/** - * file: wrap.ccp - * brief: wraps functions - * Author: Frank Dellaert - **/ - -#include -#include - -#include "Module.h" - -using namespace std; - -/* ************************************************************************* */ -/** - * main function to wrap a module - */ -void generate_matlab_toolbox(const string& interfacePath, - const string& moduleName, - const string& toolboxPath, - const string& nameSpace, - const string& mexFlags) -{ - // Parse into class object - Module module(interfacePath, moduleName, false); - - // emit MATLAB code - module.matlab_code(toolboxPath,nameSpace,mexFlags); -} - -/* ************************************************************************* */ - -int main(int argc, const char* argv[]) { - if (argc<5 || argc>6) { - cerr << "wrap parses an interface file and produces a MATLAB toolbox" << endl; - cerr << "usage: wrap interfacePath moduleName toolboxPath" << endl; - cerr << " interfacePath : *absolute* path to directory of module interface file" << endl; - cerr << " moduleName : the name of the module, interface file must be called moduleName.h" << endl; - cerr << " toolboxPath : the directory in which to generate the wrappers" << endl; - cerr << " nameSpace : namespace to use, pass empty string if none" << endl; - cerr << " [mexFlags] : extra flags for the mex command" << endl; - } - else - generate_matlab_toolbox(argv[1],argv[2],argv[3],argv[4],argc==5 ? " " : argv[5]); -} - -/* ************************************************************************* */