-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomputing-ornstein-uhlenbeck-process-trajectories-in-ruby.html
179 lines (175 loc) · 21.2 KB
/
computing-ornstein-uhlenbeck-process-trajectories-in-ruby.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<!doctype html><html lang=en>
<head>
<meta charset=utf-8>
<meta http-equiv=x-ua-compatible content="chrome=1">
<meta name=HandheldFriendly content="True">
<meta name=MobileOptimized content="320">
<meta name=viewport content="width=device-width,initial-scale=1">
<meta name=referrer content="no-referrer">
<meta name=description content="Adam Drake is an advisor to scale-up tech companies. He writes about ML/AI/crypto/data, leadership, and building tech teams.">
<title>
Computing Ornstein-Uhlenbeck Process Trajectories in Ruby - Adam Drake
</title>
<link rel="shortcut icon" href=/static/favicon.ico>
<link rel=stylesheet href=https://adamdrake.com/sass/style.min.4b0d3fd52024283b14d542e540f013de2976b7a9ca4436a50d9555c6a678c3be.css integrity="sha256-Sw0/1SAkKDsU1ULlQPAT3il2t6nKRDalDZVVxqZ4w74=" crossorigin=anonymous media=screen>
<meta name=twitter:card content="summary_large_image">
<meta name=twitter:image content="https://adamdrake.com/static/images/twitter-card.jpg">
<meta name=twitter:title content="Computing Ornstein-Uhlenbeck Process Trajectories in Ruby">
<meta name=twitter:description content="This code is adapted from some Matlab code I found that simulates the OU process exactly. I had to code up a quick Gaussian random number generator in Ruby because I didn’t find a method to handle that. As noted in the comments I used the Box-Muller Transformation but if lots of random numbers are required the Ziggurat Algorithm could be used instead.
#!/usr/bin/env ruby include Math require 'rubygems' require 'gnuplot' #Gaussian random number generator using the Box-Muller Transformation #If this is too slow it can be replaced with the Ziggurat Algorithm def randn z1 = rand z2 = rand rand_normal = sqrt(-2.">
<meta property="og:title" content="Computing Ornstein-Uhlenbeck Process Trajectories in Ruby">
<meta property="og:description" content="This code is adapted from some Matlab code I found that simulates the OU process exactly. I had to code up a quick Gaussian random number generator in Ruby because I didn’t find a method to handle that. As noted in the comments I used the Box-Muller Transformation but if lots of random numbers are required the Ziggurat Algorithm could be used instead.
#!/usr/bin/env ruby include Math require 'rubygems' require 'gnuplot' #Gaussian random number generator using the Box-Muller Transformation #If this is too slow it can be replaced with the Ziggurat Algorithm def randn z1 = rand z2 = rand rand_normal = sqrt(-2.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://adamdrake.com/computing-ornstein-uhlenbeck-process-trajectories-in-ruby.html"><meta property="og:image" content="https://adamdrake.com/static/images/twitter-card.jpg"><meta property="article:section" content="posts">
<meta property="article:published_time" content="2011-05-31T00:00:00+00:00">
<meta property="article:modified_time" content="2011-05-31T00:00:00+00:00">
</head>
<body>
<div class=title-box>
<div class=title-left>
<h1 class=name><a href=/>Adam Drake</a></h1>
</div>
<div class=title-right>
<div class=social-icons>
<a href=https://github.com/adamdrake>
<img class=icon src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAC5UlEQVR4nO2a0XXiMBBFKYESKIEOlg5CB3EHmw5wB9DBbgebDnAHTgemA9PB3Q8J1mtkaSSPjTnRPYePHIzem/FoJFtZrTKZTCaTyWQmBFgD78ABOAMNjzT2u4O9dv1s36OwQf8EakewUmo7xuskA9gAR6AdEXif1o65eXZ8XjDlqxm4KxGHZ8f5ALBlXKnHUrOUagAKpr3rQ7TAfgnBP5viOwd/Y94ksKzgb8wzHTAN7xlzPkTLHI0Rf7ffdZJUAleFwK52rK0de+e5tp46+NJn1HH92vGbK1DZz6f93P7uJ6zEsQsMJKycKvgN/tKvAr/dIyhRybU2WUNMMxWAUyDzlbrosBdfAvSrAFPKocZXqYr6/YQS0KL5AAV8BAQBWjXBsB/JKlRoCkr2+Q9NcCqQrS46KwKm/CXsVARlnnxLYZfx0wDZru9TIa5YX6E+ABq7Q8LdH2a8+x1fe4GvUkMolOnZ5r7DW6gXVBoizeQi6d5CN6fREAlRjQ8l2VuwD2iI5AR89wRcJhdJ9xbioiEiWW83o4XifW0EvioNIUkCitFC8b4kG7RKQ0iyETqPDyna11ng66QhJNlxwTKfBVS2wtKHoZoZDjGtH+kplI4f4GsJSYgM/ktTOOYcoMa+wdUEU/ZNhI9CU3zN44NHZRPze8DAH+BNQfvNjhWD/gMaj6vB/YQWcw7g2zCdMUfnwcrA3Okjsi4/xPju7zDmqoKWfwcWW8f3XS4I+oPVCe4+PVwlOqlJcL0cvb+Bxd8rPkbqSBHrJIF7Z1gKzIsbI/J1vk81Rcx9c65S/+89PKaM9zYZOxJKMiH4a0ySRzFwh34pa8QyT/Adg675flQcP4ZCSzfWpCsJDWbJ+9H5vCeMvezgO0Z3CE5qEsYNMd+cD4FpjN73Bglj+qgWE3wXTNd3VkPCWEN3fdp1fiyYJfDUT0TCOP3AT7zS/wyvVvcmWZGwN7cB3x64XivwTCaTyWQymVfgL42yxWFGEKJcAAAAAElFTkSuQmCC width=64 height=64>
</a>
<a href=https://twitter.com/aadrake>
<img class=icon src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACQ0lEQVR4nO2a0XWjMBBFXQIluIR0EDpIOjAdLB1kO0g6sDvIdgAd2B3gDkwHNx8jEkIMNmTGkvfMPUc//hjmPTTSIHm1chzHcRzHcRzHSQggAx6BlzA2wEPsvMwBcqBinCYYkl2I8WyRXKEe9Ct2BmwnhJ8z4mEQ46ln3lo7wTwELlQDrz7F72eI7zgBr8D74Pc37RxXwK73gEI59naB+DEOTJTHb5IcvqFCKW7+U8PvxIex0cqxS/QcW4W4jZL4rhyqvhka2rtEx9izcHsC1krih7RLc5pK9jDxwBMXtqaRmKWB+KO6+JDsvyse3gCbGTH/Kou3WQBDssWMRBrgz6VkDAywER+SzZDamkuFmPFjWqJsgJn4XsIaNVsh+/4L0y3vbMwNCCZcsxZEwVr4K7JtZXzvClOhtTagY49M3VMcnaPU1gZM9QEpsLM24C22wgsU1gZYta1a2J8Wke4sOJqLDwZkpLkW6B+A3JkJtz0sRUxIpRwONxU/MGKNNEXHiAYUMYQ/I81QN2I1Rcebiw8GrFn2ZaiN/tn/DBO0v+XnUkcT3zOhjiS+RfviY6EBGXE+j4vY2r+BHJTcak3YxdZ7FmQ2lMiMsDIj3p4/B+S2p9EWj+WhpwbILBheVGpQJy0e6Qu2BsIh4Zp/RM4Jl1xrX0NLzEanJzRH+v0K/boeI70pj3R+1ltdDeSxtU6CXJFpdoAtMsPu6w9QyMJXsuxz+ICcJ8SvcS2QLTAPo0RKphtl+P2+3rLjOI7jOI7jOP8tH5ahgbeYuZE9AAAAAElFTkSuQmCC width=64 height=64>
</a>
<a href=https://linkedin.com/in/aadrake>
<img class=icon src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAzElEQVRIie2WWxGDMBBFVwISkIAEnBQJOCoOKqE4AAeNg+Lg9AOY2VmSTls29If7eTPJmbubl8gioAEG/DQAF9ECOkeA1VUnya1GgPEA0CARs2dO2QLBi2RBAShU78pcoF6MgCkH6AlUClJ7QGKgFXYD7l6QFOhbBeYN9Hb3bkCRHqX8CaiNV6aAe0CV9Ra/IHIsfgapRYuIv7lt9iTSi7VmbHP+9oB0eR6peR6gj+adoBP0X9ART/l43OdkiZnzu9XZmjb4lnFkTSIiLyov4WUSpGLDAAAAAElFTkSuQmCC width=64 height=64>
</a>
</div>
<button class="subscribe subscribe-btn">
<a href=https://www.digitalmaneuver.com/#/portal>Subscribe to my newsletter</a>
</button>
</div>
</div>
<div class="nav-box row">
<div class=nav-left-menu>
<ul>
<li><a href=/>Latest</a> | </li>
<li><a href=/about.html>About</a> | </li>
<li><a href=/cases.html>Case Studies</a> | </li>
<li><a href=/contact.html>Contact</a> | </li>
<li><a href=/press.html>Press</a></li>
</ul>
</div>
</div>
<section class=section>
<div class=container>
<a href=https://applybyapi.com><button class=btn>Struggling to hire developers? Check out ApplyByAPI!</button></a>
<h1 class=page-title>Computing Ornstein-Uhlenbeck Process Trajectories in Ruby</h1>
<h2 class=content-date>May 31, 2011</h2>
<div class=share-links>
Share this:
<a class=twitter-share-button href="https://twitter.com/intent/tweet?text=Read%20Computing%20Ornstein-Uhlenbeck%20Process%20Trajectories%20in%20Ruby%20https%3a%2f%2fadamdrake.com%2fcomputing-ornstein-uhlenbeck-process-trajectories-in-ruby.html" onclick="return window.open(this.href,'twitter-share','width=550,height=235'),!1">
twitter
</a> //
<a class=icon-facebook href="https://www.facebook.com/sharer/sharer.php?u=https%3a%2f%2fadamdrake.com%2fcomputing-ornstein-uhlenbeck-process-trajectories-in-ruby.html" onclick="return window.open(this.href,'facebook-share','width=580,height=296'),!1">
facebook
</a> //
<a class=icon-linkedin href="https://www.linkedin.com/shareArticle?mini=true&url=https://adamdrake.com&title=Computing%20Ornstein-Uhlenbeck%20Process%20Trajectories%20in%20Ruby&source=Adam%20Drake" onclick="return window.open(this.href,'linkedin-share','width=980,height=980'),!1">
linkedin
</a>
</div>
<div class=content>
<p>This code is adapted from some Matlab code I found that simulates the OU
process exactly. I had to code up a quick Gaussian random number
generator in Ruby because I didn’t find a method to handle that. As
noted in the comments I used the Box-Muller Transformation but if lots
of random numbers are required the Ziggurat Algorithm could be used
instead.</p>
<div class=highlight><pre tabindex=0 style=background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-ruby data-lang=ruby>
<span style=color:#09f;font-style:italic>#!/usr/bin/env ruby</span>
<span style=color:#069>include</span> <span style=color:#360>Math</span>
<span style=color:#366>require</span> <span style=color:#c30>'rubygems'</span>
<span style=color:#366>require</span> <span style=color:#c30>'gnuplot'</span>
<span style=color:#09f;font-style:italic>#Gaussian random number generator using the Box-Muller Transformation</span>
<span style=color:#09f;font-style:italic>#If this is too slow it can be replaced with the Ziggurat Algorithm</span>
<span style=color:#069;font-weight:700>def</span> <span style=color:#c0f>randn</span>
z1 <span style=color:#555>=</span> <span style=color:#366>rand</span>
z2 <span style=color:#555>=</span> <span style=color:#366>rand</span>
rand_normal <span style=color:#555>=</span> sqrt(<span style=color:#555>-</span><span style=color:#f60>2</span><span style=color:#555>.</span><span style=color:#f60>0</span><span style=color:#555>*</span>log(z1))<span style=color:#555>*</span>sin(<span style=color:#f60>2</span><span style=color:#555>.</span><span style=color:#f60>0</span><span style=color:#555>*</span><span style=color:#360>PI</span><span style=color:#555>*</span>z2)
<span style=color:#069;font-weight:700>return</span> rand_normal<span style=color:#555>.</span>to_f
<span style=color:#069;font-weight:700>end</span>
<span style=color:#09f;font-style:italic>#Enter the parameters for the simulation</span>
steps <span style=color:#555>=</span> <span style=color:#f60>400</span>
<span style=color:#09f;font-style:italic>#start_time = 0 #simulation start time</span>
<span style=color:#09f;font-style:italic>#end_time = 400 #simuation end time</span>
dt <span style=color:#555>=</span> <span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>01</span> <span style=color:#09f;font-style:italic>#time step</span>
tau <span style=color:#555>=</span> <span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>1</span> <span style=color:#09f;font-style:italic>#relaxation time</span>
c <span style=color:#555>=</span> <span style=color:#f60>1</span><span style=color:#555>.</span><span style=color:#f60>0</span> <span style=color:#09f;font-style:italic>#diffusion constant</span>
x0 <span style=color:#555>=</span> <span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>0</span>
x <span style=color:#555>=</span> <span style=color:#555>[]</span> <span style=color:#09f;font-style:italic>#initial value for stochastic variable x</span>
mu <span style=color:#555>=</span> <span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>0</span> <span style=color:#09f;font-style:italic>#mean of stochatic process x</span>
y0 <span style=color:#555>=</span> <span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>0</span>
y <span style=color:#555>=</span> <span style=color:#555>[]</span> <span style=color:#09f;font-style:italic>#initial value for integral x </span>
start_dist <span style=color:#555>=</span> <span style=color:#555>-</span><span style=color:#f60>2</span><span style=color:#555>.</span><span style=color:#f60>0</span> <span style=color:#09f;font-style:italic>#start of OU pdf </span>
end_dist <span style=color:#555>=</span> <span style=color:#f60>2</span><span style=color:#555>.</span><span style=color:#f60>0</span> <span style=color:#09f;font-style:italic>#end of OU pdf</span>
time <span style=color:#555>=</span> (<span style=color:#f60>0</span><span style=color:#555>..</span>steps)<span style=color:#555>.</span>step(dt)
i <span style=color:#555>=</span> <span style=color:#f60>0</span>
x<span style=color:#555>[</span><span style=color:#f60>0</span><span style=color:#555>]</span> <span style=color:#555>=</span> x0
y<span style=color:#555>[</span><span style=color:#f60>0</span><span style=color:#555>]</span> <span style=color:#555>=</span> y0
time<span style=color:#555>.</span>each <span style=color:#069;font-weight:700>do</span> <span style=color:#555>|</span>t<span style=color:#555>|</span>
i <span style=color:#555>=</span> i <span style=color:#555>+</span> <span style=color:#f60>1</span>
r1 <span style=color:#555>=</span> randn
r2 <span style=color:#555>=</span> randn
<span style=color:#366>puts</span> x<span style=color:#555>[</span>i<span style=color:#555>-</span><span style=color:#f60>1</span><span style=color:#555>]</span>
x<span style=color:#555>[</span>i<span style=color:#555>]</span> <span style=color:#555>=</span> x<span style=color:#555>[</span>i<span style=color:#555>-</span><span style=color:#f60>1</span><span style=color:#555>]</span> <span style=color:#555>*</span> exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau) <span style=color:#555>+</span> sqrt((c<span style=color:#555>*</span>tau<span style=color:#555>*</span><span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>5</span>)<span style=color:#555>*</span>(<span style=color:#f60>1</span><span style=color:#555>-</span>(exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau))<span style=color:#555>**</span><span style=color:#f60>2</span>))<span style=color:#555>*</span>r1
y<span style=color:#555>[</span>i<span style=color:#555>]</span> <span style=color:#555>=</span> y<span style=color:#555>[</span>i<span style=color:#555>-</span><span style=color:#f60>1</span><span style=color:#555>]</span> <span style=color:#555>+</span> x<span style=color:#555>[</span>i<span style=color:#555>-</span><span style=color:#f60>1</span><span style=color:#555>]*</span>tau<span style=color:#555>*</span>(<span style=color:#f60>1</span><span style=color:#555>-</span>exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau))<span style=color:#555>+</span>sqrt((c<span style=color:#555>*</span>tau<span style=color:#555>**</span><span style=color:#f60>3</span><span style=color:#555>*</span>(dt<span style=color:#555>/</span>tau<span style=color:#555>-</span><span style=color:#f60>2</span><span style=color:#555>*</span> \
(<span style=color:#f60>1</span><span style=color:#555>-</span>exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau))<span style=color:#555>+</span><span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>5</span><span style=color:#555>*</span>(<span style=color:#f60>1</span><span style=color:#555>-</span>exp(<span style=color:#555>-</span><span style=color:#f60>2</span><span style=color:#555>*</span>dt<span style=color:#555>/</span>tau))))<span style=color:#555>-</span>((<span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>5</span><span style=color:#555>*</span>c<span style=color:#555>*</span>tau<span style=color:#555>**</span><span style=color:#f60>2</span>)<span style=color:#555>*</span> \
(<span style=color:#f60>1</span><span style=color:#555>-</span>exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau))<span style=color:#555>**</span><span style=color:#f60>2</span>)<span style=color:#555>**</span><span style=color:#f60>2</span><span style=color:#555>/</span>((c<span style=color:#555>*</span>tau<span style=color:#555>/</span><span style=color:#f60>2</span>)<span style=color:#555>*</span>(<span style=color:#f60>1</span><span style=color:#555>-</span>exp(<span style=color:#555>-</span><span style=color:#f60>2</span><span style=color:#555>*</span>dt<span style=color:#555>/</span>tau))))<span style=color:#555>*</span>r2<span style=color:#555>+</span> \
((<span style=color:#f60>0</span><span style=color:#555>.</span><span style=color:#f60>5</span><span style=color:#555>*</span>c<span style=color:#555>*</span>tau<span style=color:#555>**</span><span style=color:#f60>2</span>)<span style=color:#555>*</span>(<span style=color:#f60>1</span><span style=color:#555>-</span>exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau))<span style=color:#555>**</span><span style=color:#f60>2</span>)<span style=color:#555>/</span>(sqrt((c<span style=color:#555>*</span>tau<span style=color:#555>/</span><span style=color:#f60>2</span>)<span style=color:#555>*</span> \
(<span style=color:#f60>1</span><span style=color:#555>-</span>(exp(<span style=color:#555>-</span>dt<span style=color:#555>/</span>tau))<span style=color:#555>**</span><span style=color:#f60>2</span>)))<span style=color:#555>*</span>r1
<span style=color:#069;font-weight:700>end</span>
k <span style=color:#555>=</span> <span style=color:#f60>0</span>
j <span style=color:#555>=</span> (start_dist<span style=color:#555>..</span>end_dist)<span style=color:#555>.</span>step(dt)
<span style=color:#366>p</span> <span style=color:#555>=</span> <span style=color:#555>[]</span>
j<span style=color:#555>.</span>each <span style=color:#069;font-weight:700>do</span> <span style=color:#555>|</span>l<span style=color:#555>|</span>
k <span style=color:#555>=</span> k <span style=color:#555>+</span> <span style=color:#f60>1</span>
<span style=color:#366>p</span><span style=color:#555>[</span>k<span style=color:#555>]</span> <span style=color:#555>=</span> sqrt((<span style=color:#f60>1</span><span style=color:#555>/</span>tau)<span style=color:#555>/</span>(<span style=color:#360>PI</span><span style=color:#555>*</span>c))<span style=color:#555>*</span>exp(<span style=color:#555>-</span>(<span style=color:#f60>1</span><span style=color:#555>/</span>tau)<span style=color:#555>*</span>(l<span style=color:#555>-</span>mu)<span style=color:#555>**</span><span style=color:#f60>2</span><span style=color:#555>/</span>(c))
<span style=color:#069;font-weight:700>end</span>
</code></pre></div><p>That’s it. Not too difficult to compute with Ruby, but I also did another version in R. I’ll post about that shortly.</p>
</div>
</div>
</section>
<div class="nav-box row">
<div class=nav-left-menu>
<ul>
<li><a href=/>Latest</a> | </li>
<li><a href=/about.html>About</a> | </li>
<li><a href=/cases.html>Case Studies</a> | </li>
<li><a href=/contact.html>Contact</a> | </li>
<li><a href=/press.html>Press</a></li>
</ul>
</div>
</div>
<div class="footer-box row">
<div class="footer-left col-md-6 col-xs-12">
<div class="footer-bio content">
<p><strong>Adam Drake</strong> leads technical business transformations in global and multi-cultural environments. He has a passion for helping companies become more productive by improving internal leadership capabilities, and accelerating product development through technology and data architecture guidance. Adam has served as a White House Presidential Innovation Fellow and is an IEEE Senior Member.</p>
</div>
</div>
<div class=footer-right>
<div class=social-icons>
<a href=https://github.com/adamdrake>
<img class=icon src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAC5UlEQVR4nO2a0XXiMBBFKYESKIEOlg5CB3EHmw5wB9DBbgebDnAHTgemA9PB3Q8J1mtkaSSPjTnRPYePHIzem/FoJFtZrTKZTCaTyWQmBFgD78ABOAMNjzT2u4O9dv1s36OwQf8EakewUmo7xuskA9gAR6AdEXif1o65eXZ8XjDlqxm4KxGHZ8f5ALBlXKnHUrOUagAKpr3rQ7TAfgnBP5viOwd/Y94ksKzgb8wzHTAN7xlzPkTLHI0Rf7ffdZJUAleFwK52rK0de+e5tp46+NJn1HH92vGbK1DZz6f93P7uJ6zEsQsMJKycKvgN/tKvAr/dIyhRybU2WUNMMxWAUyDzlbrosBdfAvSrAFPKocZXqYr6/YQS0KL5AAV8BAQBWjXBsB/JKlRoCkr2+Q9NcCqQrS46KwKm/CXsVARlnnxLYZfx0wDZru9TIa5YX6E+ABq7Q8LdH2a8+x1fe4GvUkMolOnZ5r7DW6gXVBoizeQi6d5CN6fREAlRjQ8l2VuwD2iI5AR89wRcJhdJ9xbioiEiWW83o4XifW0EvioNIUkCitFC8b4kG7RKQ0iyETqPDyna11ng66QhJNlxwTKfBVS2wtKHoZoZDjGtH+kplI4f4GsJSYgM/ktTOOYcoMa+wdUEU/ZNhI9CU3zN44NHZRPze8DAH+BNQfvNjhWD/gMaj6vB/YQWcw7g2zCdMUfnwcrA3Okjsi4/xPju7zDmqoKWfwcWW8f3XS4I+oPVCe4+PVwlOqlJcL0cvb+Bxd8rPkbqSBHrJIF7Z1gKzIsbI/J1vk81Rcx9c65S/+89PKaM9zYZOxJKMiH4a0ySRzFwh34pa8QyT/Adg675flQcP4ZCSzfWpCsJDWbJ+9H5vCeMvezgO0Z3CE5qEsYNMd+cD4FpjN73Bglj+qgWE3wXTNd3VkPCWEN3fdp1fiyYJfDUT0TCOP3AT7zS/wyvVvcmWZGwN7cB3x64XivwTCaTyWQymVfgL42yxWFGEKJcAAAAAElFTkSuQmCC width=64 height=64>
</a>
<a href=https://twitter.com/aadrake>
<img class=icon src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACQ0lEQVR4nO2a0XWjMBBFXQIluIR0EDpIOjAdLB1kO0g6sDvIdgAd2B3gDkwHNx8jEkIMNmTGkvfMPUc//hjmPTTSIHm1chzHcRzHcRzHSQggAx6BlzA2wEPsvMwBcqBinCYYkl2I8WyRXKEe9Ct2BmwnhJ8z4mEQ46ln3lo7wTwELlQDrz7F72eI7zgBr8D74Pc37RxXwK73gEI59naB+DEOTJTHb5IcvqFCKW7+U8PvxIex0cqxS/QcW4W4jZL4rhyqvhka2rtEx9izcHsC1krih7RLc5pK9jDxwBMXtqaRmKWB+KO6+JDsvyse3gCbGTH/Kou3WQBDssWMRBrgz6VkDAywER+SzZDamkuFmPFjWqJsgJn4XsIaNVsh+/4L0y3vbMwNCCZcsxZEwVr4K7JtZXzvClOhtTagY49M3VMcnaPU1gZM9QEpsLM24C22wgsU1gZYta1a2J8Wke4sOJqLDwZkpLkW6B+A3JkJtz0sRUxIpRwONxU/MGKNNEXHiAYUMYQ/I81QN2I1Rcebiw8GrFn2ZaiN/tn/DBO0v+XnUkcT3zOhjiS+RfviY6EBGXE+j4vY2r+BHJTcak3YxdZ7FmQ2lMiMsDIj3p4/B+S2p9EWj+WhpwbILBheVGpQJy0e6Qu2BsIh4Zp/RM4Jl1xrX0NLzEanJzRH+v0K/boeI70pj3R+1ltdDeSxtU6CXJFpdoAtMsPu6w9QyMJXsuxz+ICcJ8SvcS2QLTAPo0RKphtl+P2+3rLjOI7jOI7jOP8tH5ahgbeYuZE9AAAAAElFTkSuQmCC width=64 height=64>
</a>
<a href=https://linkedin.com/in/aadrake>
<img class=icon src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAzElEQVRIie2WWxGDMBBFVwISkIAEnBQJOCoOKqE4AAeNg+Lg9AOY2VmSTls29If7eTPJmbubl8gioAEG/DQAF9ECOkeA1VUnya1GgPEA0CARs2dO2QLBi2RBAShU78pcoF6MgCkH6AlUClJ7QGKgFXYD7l6QFOhbBeYN9Hb3bkCRHqX8CaiNV6aAe0CV9Ra/IHIsfgapRYuIv7lt9iTSi7VmbHP+9oB0eR6peR6gj+adoBP0X9ART/l43OdkiZnzu9XZmjb4lnFkTSIiLyov4WUSpGLDAAAAAElFTkSuQmCC width=64 height=64>
</a>
</div>
<button class="subscribe subscribe-btn">
<a href=https://www.digitalmaneuver.com/#/portal>Subscribe to my newsletter</a>
</button>
</div>
</div>
<div class="container has-text-centered footer-copyright">
</div>
</body>