diff --git a/doc/pub/BM/html/BM-bs.html b/doc/pub/BM/html/BM-bs.html new file mode 100644 index 000000000..a2a6f79f8 --- /dev/null +++ b/doc/pub/BM/html/BM-bs.html @@ -0,0 +1,1639 @@ + + + + + + + +Solving quantum mechanical problems with Machine Learning and Boltzmann machines + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

 

 

 

+ + + + + +
+

Solving quantum mechanical problems with Machine Learning and Boltzmann machines

+ +

+ + +

+Morten Hjorth-Jensen +
+ +

+ + +

Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University and Department of Physics, University of Oslo, Norway
+
+

+

Jul 26, 2018

+
+

+ +

+ + + +

What is this talk about?

+
+
+

+The main aim is to give you a short and pedestrian introduction to how we can use Machine Learning methods +to solve quantum mechanical many-body problems. And why this could be of interest. + +

+The hope is that after this talk you have gotten the basic ideas to get you started. Peeping into https://github.com/mhjensenseminars/MachineLearningTalk, you'll find a Jupyter notebook, slides, codes etc that will allow you to reproduce the simulations discussed here, and perhaps run your own very first calculations. + +

+Furthermore, since we will also talk about Monte Carlo simulations, the exciting idea of Monte Carlo optimization and Machine Learning can be used to mesh strategies for reducing the curse of dimensionality. + +

+

+
+ + +

+ + +

Why?

+ +

+How can we avoid the dimensionality curse? Many possibilities + +

    +
  1. smarter basis functions
  2. +
  3. resummation of specific correlations
  4. +
  5. stochastic sampling of high-lying states (stochastic FCI, CC and soon SRG)
  6. +
  7. many more
  8. +
+ +Machine Learning and Quantum Computing hold also great promise in tackling the +ever increasing dimensionalities. Here we will focus on Machine Learning. + +

+ + +

Overview

+
+
+

+ +

    +
  • Short intro to Machine Learning
  • +
  • Variational Monte Carlo (Markov Chain Monte Carlo, \( \mathrm{MC}^2 \)) and two-electron quantum dots, solving quantum mechanical problems in a stochastic way. It will serve as our motivation for switching to Machine Learning.
  • +
  • From Variational Monte Carlo to Boltzmann Machines and Machine Learning
  • +
+
+
+ + +

+ + +

What are the Machine Learning calculations here based on?

+ +

+This work is inspired by the idea of representing the wave function with +a restricted Boltzmann machine (RBM), presented recently by G. Carleo and M. Troyer, Science 355, Issue 6325, pp. 602-606 (2017). They +named such a wave function/network a neural network quantum state (NQS). In their article they apply it to the quantum mechanical +spin lattice systems of the Ising model and Heisenberg model, with +encouraging results. + +

+Thanks to Vilde Flugsrud and Alfred Alocias Mariadason for many discussions and interpretations of the above paper. + +

+ + +

A new world

+
+
+

+Machine learning (ML) is an extremely rich field, in spite of its young age. The +increases we have seen during the last three decades in computational +capabilities have been followed by developments of methods and +techniques for analyzing and handling large date sets, relying heavily +on statistics, computer science and mathematics. The field is rather +new and developing rapidly. + +

+Popular software packages written in Python for ML are + +

+ +These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +
+
+ + +

+ + +

Lots of room for creativity

+
+
+

+Not all the +algorithms and methods can be given a rigorous mathematical +justification, opening up thereby for experimenting +and trial and error and thereby exciting new developments. +

+
+ + +

+

+
+

+A solid command of linear algebra, multivariate theory, +probability theory, statistical data analysis, +understanding errors and Monte Carlo methods is important in order to understand many of the +various algorithms and methods. +

+
+ + +

+

+
+

+A familiarity with ML is almost becoming a prerequisite for many of the most exciting employment +opportunities. Add quantum computing and there you are. +

+
+ + +

+ + +

Some members of the ML family

+ +

+

+
+

+ +

    +
  1. Linear regression and its variants, in essence polynomial regression
  2. +
  3. Decision tree algorithms, from simpler to more complex ones like random forests
  4. +
  5. Nearest neighbors models
  6. +
  7. Bayesian statistics and regression
  8. +
  9. Support vector machines and finally various variants of
  10. +
  11. Artifical neural networks and deep learning
  12. +
  13. ....
  14. +
+
+
+ + +

+ + +

What are the basic ingredients?

+
+
+

+Almost every problem in ML and data science starts with the same ingredients: + +

    +
  • The dataset \( \mathbf{x} \) (could be some observable quantity of the system we are studying)
  • +
  • A model which is a function of a set of parameters \( \mathbf{\alpha} \) that relates to the dataset, say a likelihood function \( p(\mathbf{x}\vert \mathbf{\alpha}) \) or just a simple model \( f(\mathbf{\alpha}) \)
  • +
  • A so-called cost function \( \mathcal{C} (\mathbf{x}, f(\mathbf{\alpha})) \) which allows us to decide how well our model represents the dataset.
  • +
+ +We seek to minimize the function \( \mathcal{C} (\mathbf{x}, f(\mathbf{\alpha})) \) by finding the parameter values which minimize \( \mathcal{C} \). This leads to various minimization algorithms. +
+
+ + +

+ + +

What is Machine Learning?

+
+
+

+Machine learning is the science of giving computers the ability to +learn without being explicitly programmed. The idea is that there +exist generic algorithms which can be used to find patterns in a broad +class of data sets without having to write code specifically for each +problem. The algorithm will build its own logic based on the data. + +

+Machine learning is a subfield of computer science, and is closely +related to computational statistics. It evolved from the study of +pattern recognition in artificial intelligence (AI) research, and has +made contributions to AI tasks like computer vision, natural language +processing and speech recognition. It has also, especially in later +years, found applications in a wide variety of other areas, including +bioinformatics, economy, physics, finance and marketing. + +

+You will notice however that many of the basic ideas discussed do come from Physics! +

+
+ + +

+ + +

Types of Machine Learning

+ +

+

+
+

+The approaches to machine learning are many, but are often split into two main categories. +In supervised learning we know the answer to a problem, +and let the computer deduce the logic behind it. On the other hand, unsupervised learning +is a method for finding patterns and relationship in data sets without any prior knowledge of the system. +Some authours also operate with a third category, namely reinforcement learning. This is a paradigm +of learning inspired by behavioural psychology, where learning is achieved by trial-and-error, +solely from rewards and punishment. + +

+Another way to categorize machine learning tasks is to consider the desired output of a system. +Some of the most common tasks are: + +

    +
  • Classification: Outputs are divided into two or more classes. The goal is to produce a model that assigns inputs into one of these classes. An example is to identify digits based on pictures of hand-written ones. Classification is typically supervised learning.
  • +
  • Regression: Finding a functional relationship between an input data set and a reference data set. The goal is to construct a function that maps input data to continuous output values.
  • +
  • Clustering: Data are divided into groups with certain common traits, without knowing the different groups beforehand. It is thus a form of unsupervised learning.
  • +
+
+
+ + +

+ + +

References

+
+
+

+ +

+
+
+ + +

+ + +

Another interesting article

+ +

+Here we will use so-called reduced Boltzmann Machines to simulate quantum many-body problems. For Monte Carlo aficionados, there is a very close similarity with what are called shadow wave functions, see the work of Pederiva and Kalos and collaborators, Phys Rev. E 90, 053304 (2014). + +

+ + +

Just for fun illustration of scikit-learn: Hudson bay data

+
+
+

+Most mammalian predators rely on a variety of prey, which complicates mathematical modeling; however, a few predators have become highly specialized and seek almost exclusively a single prey species. An example of this simplified predator-prey interaction is seen in Canadian northern forests, where the populations of the lynx and the snowshoe hare are intertwined in a life and death struggle. + +

+One reason that this particular system has been so extensively studied is that the Hudson Bay company kept careful records of all furs from the early 1800s into the 1900s. The records for the furs collected by the Hudson Bay company showed distinct oscillations (approximately 12 year periods), suggesting that these species caused almost periodic fluctuations of each other's populations. The table here shows data from 1900 to 1920. + +

+

+
+ + +

+ + +

Hares and lynx in Hudson bay from 1900 to 1920

+ +

+



+ +

+ + +

Linear regression in Python

+
+
+

+

+ + +

import numpy as np
+import matplotlib.pyplot as plt
+from IPython.display import display
+import sklearn
+from sklearn.linear_model import LinearRegression
+from sklearn.tree import DecisionTreeRegressor
+
+
+data = np.loadtxt('src/Hudson_Bay.csv', delimiter=',', skiprows=1)
+x = data[:,0]
+y = data[:,1]
+line = np.linspace(1900,1920,1000,endpoint=False).reshape(-1,1)
+reg = DecisionTreeRegressor(min_samples_split=3).fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, reg.predict(line), label="decision tree")
+regline = LinearRegression().fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, regline.predict(line), label= "Linear Regression")
+plt.plot(x, y, label= "Linear Regression")
+plt.show()
+
+

+

+
+ + +

+ + +

Artificial neurons

+
+
+

+ +

+The field of artificial neural networks has a long history of +development, and is closely connected with the advancement of computer +science and computers in general. A model of artificial neurons was +first developed by McCulloch and Pitts in 1943 to study signal +processing in the brain and has later been refined by others. The +general idea is to mimic neural networks in the human brain, which is +composed of billions of neurons that communicate with each other by +sending electrical signals. Each neuron accumulates its incoming +signals, which must exceed an activation threshold to yield an +output. If the threshold is not overcome, the neuron remains inactive, +i.e. has zero output. + +

+This behaviour has inspired a simple mathematical model for an artificial neuron. + +$$ + y = f\left(\sum_{i=1}^n w_ix_i\right) = f(u) +$$ + +Here, the output \( y \) of the neuron is the value of its activation function, which have as input +a weighted sum of signals \( x_i, \dots ,x_n \) received by \( n \) other neurons. +

+
+ + +

+ + +

A simple perceptron model

+ +

+



+ +

+ + +

Neural network types

+
+
+

+An artificial neural network (NN), is a computational model that consists of layers of connected neurons, or nodes. +It is supposed to mimic a biological nervous system by letting each neuron interact with other neurons +by sending signals in the form of mathematical functions between layers. +A wide variety of different NNs have +been developed, but most of them consist of an input layer, an output layer and eventual layers in-between, called +hidden layers. All layers can contain an arbitrary number of nodes, and each connection between two nodes +is associated with a weight variable. + +

+



+
+
+ + +

+ + +

The system: two electrons in a harmonic oscillator trap in two dimensions

+ +

+The Hamiltonian of the quantum dot is given by +$$ \hat{H} = \hat{H}_0 + \hat{V}, +$$ + +where \( \hat{H}_0 \) is the many-body HO Hamiltonian, and \( \hat{V} \) is the +inter-electron Coulomb interactions. In dimensionless units, +$$ \hat{V}= \sum_{i < j}^N \frac{1}{r_{ij}}, +$$ + +with \( r_{ij}=\sqrt{\mathbf{r}_i^2 - \mathbf{r}_j^2} \). + +

+This leads to the separable Hamiltonian, with the relative motion part given by (\( r_{ij}=r \)) +$$ +\hat{H}_r=-\nabla^2_r + \frac{1}{4}\omega^2r^2+ \frac{1}{r}, +$$ + +plus a standard Harmonic Oscillator problem for the center-of-mass motion. +This system has analytical solutions in two and three dimensions (M. Taut 1993 and 1994). + +

+ + +

Quantum Monte Carlo Motivation

+
+
+

+Given a hamiltonian \( H \) and a trial wave function \( \Psi_T \), the variational principle states that the expectation value of \( \langle H \rangle \), defined through +$$ + \langle E \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})H(\boldsymbol{R})\Psi_T(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})\Psi_T(\boldsymbol{R})}, +$$ + +is an upper bound to the ground state energy \( E_0 \) of the hamiltonian \( H \), that is +$$ + E_0 \le \langle H \rangle . +$$ + +In general, the integrals involved in the calculation of various expectation values are multi-dimensional ones. Traditional integration methods such as the Gauss-Legendre will not be adequate for say the computation of the energy of a many-body system. +

+
+ + +

+ + +

Quantum Monte Carlo Motivation

+
+
+

+Choose a trial wave function +\( \psi_T(\boldsymbol{R}) \). +$$ + P(\boldsymbol{R},\boldsymbol{\alpha})= \frac{\left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2}{\int \left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2d\boldsymbol{R}}. +$$ + +This is our model, or likelihood/probability distribution function (PDF). It depends on some variational parameters \( \boldsymbol{\alpha} \). +The approximation to the expectation value of the Hamiltonian is now +$$ + \langle E[\boldsymbol{\alpha}] \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})H(\boldsymbol{R})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})}. +$$ +

+
+ + +

+ + +

Quantum Monte Carlo Motivation

+
+
+

+$$ + E_L(\boldsymbol{R},\boldsymbol{\alpha})=\frac{1}{\psi_T(\boldsymbol{R},\boldsymbol{\alpha})}H\psi_T(\boldsymbol{R},\boldsymbol{\alpha}), +$$ + +called the local energy, which, together with our trial PDF yields +$$ + E[\boldsymbol{\alpha}]=\int P(\boldsymbol{R})E_L(\boldsymbol{R},\boldsymbol{\alpha}) d\boldsymbol{R}\approx \frac{1}{N}\sum_{i=1}^NE_L(\boldsymbol{R_i},\boldsymbol{\alpha}) +$$ + +with \( N \) being the number of Monte Carlo samples. +

+
+ + +

+ + +

Quantum Monte Carlo

+
+
+

+The Algorithm for performing a variational Monte Carlo calculations runs thus as this + +

    +
  • Initialisation: Fix the number of Monte Carlo steps. Choose an initial \( \boldsymbol{R} \) and variational parameters \( \alpha \) and calculate \( \left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2 \).
  • +
  • Initialise the energy and the variance and start the Monte Carlo calculation by looping over trials.
  • + +
      +
    • Calculate a trial position \( \boldsymbol{R}_p=\boldsymbol{R}+r*step \) where \( r \) is a random variable \( r \in [0,1] \).
    • +
    • Metropolis algorithm to accept or reject this move \( w = P(\boldsymbol{R}_p,\boldsymbol{\alpha})/P(\boldsymbol{R},\boldsymbol{\alpha}) \).
    • +
    • If the step is accepted, then we set \( \boldsymbol{R}=\boldsymbol{R}_p \).
    • +
    • Update averages
    • +
    + +
  • Finish and compute final averages.
  • +
+ +Observe that the jumping in space is governed by the variable step. This is often called brute-force sampling. +Need importance sampling to get more relevant sampling. +
+
+ + +

+ + +

The trial wave function

+
+
+

+We want to perform a Variational Monte Carlo calculation of the ground state of two electrons in a quantum dot well with different oscillator energies, assuming total spin \( S=0 \). +Our trial wave function has the following form +$$ +\begin{equation} + \psi_{T}(\boldsymbol{r}_1,\boldsymbol{r}_2) = + C\exp{\left(-\alpha_1\omega(r_1^2+r_2^2)/2\right)} + \exp{\left(\frac{r_{12}}{(1+\alpha_2 r_{12})}\right)}, +\label{eq:trial} +\end{equation} +$$ + +where the $\alpha$s represent our variational parameters, two in this case. + +

+Why does the trial function look like this? How did we get there? This will be our main motivation for switching to +Machine Learning. + +

+

+
+ + +

+ + +

The correlation part of the wave function

+ +

+To find an ansatz for the correlated part of the wave function, it is useful to rewrite the two-particle +local energy in terms of the relative and center-of-mass motion. +Let us denote the distance between the two electrons as +\( r_{12} \). We omit the center-of-mass motion since we are only interested in the case when +\( r_{12} \rightarrow 0 \). The contribution from the center-of-mass (CoM) variable \( {\bf R}_{\mathrm{CoM}} \) +gives only a finite contribution. +We focus only on the terms that are relevant for \( r_{12} \) and for three dimensions. The relevant local energy becomes then +$$ +\lim_{r_{12} \rightarrow 0}E_L(R)= + \frac{1}{{\cal R}_T(r_{12})}\left(2\frac{d^2}{dr_{ij}^2}+\frac{4}{r_{ij}}\frac{d}{dr_{ij}}+ +\frac{2}{r_{ij}}-\frac{l(l+1)}{r_{ij}^2}+2E +\right){\cal R}_T(r_{12}) = 0. +$$ + +Set \( l=0 \) and we have the so-called cusp condition +$$ +\frac{d {\cal R}_T(r_{12})}{dr_{12}} = -\frac{1}{2(l+1)} +{\cal R}_T(r_{12})\qquad r_{12}\to 0 +$$ + +

+ + +

Resulting ansatz

+The above results in +$$ +{\cal R}_T \propto \exp{(r_{ij}/2)}, +$$ + +for anti-parallel spins and +$$ +{\cal R}_T \propto \exp{(r_{ij}/4)}, +$$ + +for anti-parallel spins. +This is the so-called cusp condition for the relative motion, resulting in a minimal requirement +for the correlation part of the wave fuction. +For general systems containing more than say two electrons, we have this +condition for each electron pair \( ij \). + +

+ + +

The VMC code

+ +

+ + +

# Importing various packages
+from math import exp, sqrt
+from random import random, seed
+import numpy as np
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import sys
+
+#Trial wave function for quantum dots in two dims
+def WaveFunction(r,alpha,beta):
+    r1 = r[0,0]**2 + r[0,1]**2
+    r2 = r[1,0]**2 + r[1,1]**2
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = r12/(1+beta*r12)
+    return exp(-0.5*alpha*(r1+r2)+deno)
+
+#Local energy  for quantum dots in two dims, using analytical local energy
+def LocalEnergy(r,alpha,beta):
+    
+    r1 = (r[0,0]**2 + r[0,1]**2)
+    r2 = (r[1,0]**2 + r[1,1]**2)
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = 1.0/(1+beta*r12)
+    deno2 = deno*deno
+    return 0.5*(1-alpha*alpha)*(r1 + r2) +2.0*alpha + 1.0/r12+deno2*(alpha*r12-deno2+2*beta*deno-1.0/r12)
+
+# The Monte Carlo sampling with the Metropolis algo
+def MonteCarloSampling():
+
+    NumberMCcycles= 100000
+    StepSize = 1.0
+    # positions
+    PositionOld = np.zeros((NumberParticles,Dimension), np.double)
+    PositionNew = np.zeros((NumberParticles,Dimension), np.double)
+    # seed for rng generator
+    seed()
+    # start variational parameter
+    alpha = 0.9
+    for ia in range(MaxVariations):
+        alpha += .025
+        AlphaValues[ia] = alpha
+        beta = 0.2 
+        for jb in range(MaxVariations):
+            beta += .01
+            BetaValues[jb] = beta
+            energy = energy2 = 0.0
+            DeltaE = 0.0
+            #Initial position
+            for i in range(NumberParticles):
+                for j in range(Dimension):
+                    PositionOld[i,j] = StepSize * (random() - .5)
+            wfold = WaveFunction(PositionOld,alpha,beta)
+
+            #Loop over MC MCcycles
+            for MCcycle in range(NumberMCcycles):
+                #Trial position
+                for i in range(NumberParticles):
+                    for j in range(Dimension):
+                        PositionNew[i,j] = PositionOld[i,j] + StepSize * (random() - .5)
+                wfnew = WaveFunction(PositionNew,alpha,beta)
+
+                #Metropolis test to see whether we accept the move
+                if random() < wfnew**2 / wfold**2:
+                   PositionOld = PositionNew.copy()
+                   wfold = wfnew
+                   DeltaE = LocalEnergy(PositionOld,alpha,beta)
+                energy += DeltaE
+                energy2 += DeltaE**2
+
+            #We calculate mean, variance and error ...
+            energy /= NumberMCcycles
+            energy2 /= NumberMCcycles
+            variance = energy2 - energy**2
+            error = sqrt(variance/NumberMCcycles)
+            Energies[ia,jb] = energy    
+    return Energies, AlphaValues, BetaValues
+
+
+#Here starts the main program with variable declarations
+NumberParticles = 2
+Dimension = 2
+MaxVariations = 10
+Energies = np.zeros((MaxVariations,MaxVariations))
+AlphaValues = np.zeros(MaxVariations)
+BetaValues = np.zeros(MaxVariations)
+(Energies, AlphaValues, BetaValues) = MonteCarloSampling()
+
+# Prepare for plots
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+# Plot the surface.
+X, Y = np.meshgrid(AlphaValues, BetaValues)
+surf = ax.plot_surface(X, Y, Energies,cmap=cm.coolwarm,linewidth=0, antialiased=False)
+# Customize the z axis.
+zmin = np.matrix(Energies).min()
+zmax = np.matrix(Energies).max()
+ax.set_zlim(zmin, zmax)
+ax.set_xlabel(r'$\alpha$')
+ax.set_ylabel(r'$\beta$')
+ax.set_zlabel(r'$\langle E \rangle$')
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+plt.show()
+
+

+ + +

Technical aspect, improvements and how to define the cost function

+
+
+

+ +

+The above procedure is not the smartest one. Looping over all variational parameters becomes expensive. +Also, we don't use importance sampling and optimizations of the standard deviation (blocking, bootstrap, jackknife). +Such codes are included in the above Github address. + +

+We can also be smarter and use minimization methods to find the optimal variational parameters with fewer Monte Carlo cycles and then +fire up our heavy artillery. + +

+One way to achieve this is to minimize the energy as function of the variational parameters. + +

+

+
+ + +

+ + +

Energy derivatives

+
+
+

+To find the derivatives of the local energy expectation value as function of the variational parameters, we can use the chain rule and the hermiticity of the Hamiltonian. + +

+Let us define +$$ +\bar{E}_{\alpha_i}=\frac{d\langle E_L\rangle}{d\alpha_i}. +$$ + +as the derivative of the energy with respect to the variational parameter \( \alpha_i \) +We define also the derivative of the trial function (skipping the subindex \( T \)) as +$$ +\bar{\Psi}_{i}=\frac{d\Psi}{d\alpha_i}. +$$ +

+
+ + +

+ + +

Derivatives of the local energy

+
+
+

+The elements of the gradient of the local energy are then (using the chain rule and the hermiticity of the Hamiltonian) +$$ +\bar{E}_{i}= 2\left( \langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L \rangle\right). +$$ + +From a computational point of view it means that you need to compute the expectation values of +$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle, +$$ + +and +$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L\rangle +$$ + +These integrals are evaluted using MC intergration (with all its possible error sources). +We can then use methods like stochastic gradient or other minimization methods to find the optimal variational parameters (I don't discuss this topic here, but these methods are very important in ML). +

+
+ + +

+ + +

How do we define our cost function?

+
+
+

+We have a model, our likelihood function. + +

+How should we define the cost function? + +

+

+
+ + +

+ + +

Meet the variance and its derivatives

+
+
+

+Suppose the trial function (our model) is the exact wave function. The action of the hamiltionan +on the wave function +$$ + H\Psi = \mathrm{constant}\times \Psi, +$$ + +The integral which defines various +expectation values involving moments of the hamiltonian becomes then +$$ + \langle E^n \rangle = \langle H^n \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})H^n(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}= +\mathrm{constant}\times\frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}=\mathrm{constant}. +$$ + +This gives an important information: If I want the variance, the exact wave function leads to zero variance! +The variance is defined as +$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2. +$$ + +Variation is then performed by minimizing both the energy and the variance. + +

+

+
+ + +

+ + +

The variance defines the cost function

+
+
+

+We can then take the derivatives of +$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2, +$$ + +with respect to the variational parameters. The derivatives of the variance can then be used to defined the +so-called Hessian matrix, which in turn allows us to use minimization methods like Newton's method or +standard gradient methods. + +

+This leads to however a more complicated expression, with obvious errors when evaluating integrals by Monte Carlo integration. Less used, see however Filippi and Umrigar. The expression becomes complicated +$$ +\bar{E}_{ij} = 2\left[ \langle (\frac{\bar{\Psi}_{ij}}{\Psi}+\frac{\bar{\Psi}_{j}}{\Psi}\frac{\bar{\Psi}_{i}}{\Psi})(E_L-\langle E\rangle)\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\bar{E}_j-\langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\bar{E}_i\right] +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L{_j}\rangle +\langle \frac{\bar{\Psi}_{j}}{\Psi}E_L{_i}\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L{_j}\rangle \langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\langle E_L{_i}\rangle. +$$ + +

+Evaluating the cost function means having to evaluate the above second derivative of the energy. + +

+

+
+ + +

+ + +

Boltzmann Machines

+ +

+Why use a generative model rather than the more well known discriminative deep neural networks (DNN)? + +

+ + + +

Some similarities and differences from DNNs

+ +
    +
  1. Both use gradient-descent based learning procedures for minimizing cost functions
  2. +
  3. Energy based models don't use backpropagation and automatic differentiation for computing gradients, instead turning to Markov Chain Monte Carlo methods.
  4. +
  5. DNNs often have several hidden layers. A restricted Boltzmann machine has only one hidden layer, however several RBMs can be stacked to make up Deep Belief Networks, of which they constitute the building blocks.
  6. +
+ +History: The RBM was developed by amongst others Geoffrey Hinton, called by some the "Godfather of Deep Learning", working with the University of Toronto and Google. + +

+ + +

The structure of the RBM network

+ +

+



+ +

+ + +

The network

+ +

+The network layers: + +

    +
  1. A function \( \mathbf{x} \) that represents the visible layer, a vector of \( M \) elements (nodes). This layer represents both what the RBM might be given as training input, and what we want it to be able to reconstruct. This might for example be the pixels of an image, the spin values of the Ising model, or coefficients representing speech.
  2. +
  3. The function \( \mathbf{h} \) represents the hidden, or latent, layer. A vector of \( N \) elements (nodes). Also called "feature detectors".
  4. +
+ + + +

Goals

+ +

+The goal of the hidden layer is to increase the model's expressive power. We encode complex interactions between visible variables by introducing additional, hidden variables that interact with visible degrees of freedom in a simple manner, yet still reproduce the complex correlations between visible degrees in the data once marginalized over (integrated out). + +

+Examples of this trick being employed in physics: + +

    +
  1. The Hubbard-Stratonovich transformation
  2. +
  3. The introduction of ghost fields in gauge theory
  4. +
  5. Shadow wave functions in Quantum Monte Carlo simulations
  6. +
+ +The network parameters, to be optimized/learned: + +
    +
  1. \( \mathbf{a} \) represents the visible bias, a vector of same length as \( \mathbf{x} \).
  2. +
  3. \( \mathbf{b} \) represents the hidden bias, a vector of same lenght as \( \mathbf{h} \).
  4. +
  5. \( W \) represents the interaction weights, a matrix of size \( M\times N \).
  6. +
+ + + +

Joint distribution and the Energy function

+The restricted Boltzmann machine is described by a Bolztmann distribution +$$ +\begin{align} + P_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}, +\label{_auto1} +\end{align} +$$ + +where \( Z \) is the normalization constant or partition function, defined as +$$ +\begin{align} + Z = \int \int e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})} d\mathbf{x} d\mathbf{h}. +\label{_auto2} +\end{align} +$$ + +It is common to ignore \( T_0 \) by setting it to one. + +

+ + +

Network Elements

+ +

+The function \( E(\mathbf{x},\mathbf{h}) \) gives the energy of a +configuration (pair of vectors) \( (\mathbf{x}, \mathbf{h}) \). The lower +the energy of a configuration, the higher the probability of it. This +function also depends on the parameters \( \mathbf{a} \), \( \mathbf{b} \) and +\( W \). Thus, when we adjust them during the learning procedure, we are +adjusting the energy function to best fit our problem. + +

+ + +

Defining different types of RBMs

+There are different variants of RBMs, and the differences lie in the types of visible and hidden units we choose as well as in the implementation of the energy function \( E(\mathbf{x},\mathbf{h}) \). + +

+

+
+

+ +

+RBMs were first developed using binary units in both the visible and hidden layer. The corresponding energy function is defined as follows: +$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = - \sum_i^M x_i a_i- \sum_j^N b_j h_j - \sum_{i,j}^{M,N} x_i w_{ij} h_j, +\label{_auto3} +\end{align} +$$ + +where the binary values taken on by the nodes are most commonly 0 and 1. +

+
+ +
+
+

+ +

+Another varient is the RBM where the visible units are Gaussian while the hidden units remain binary: +$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = \sum_i^M \frac{(x_i - a_i)^2}{2\sigma_i^2} - \sum_j^N b_j h_j - \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma_i^2}. +\label{_auto4} +\end{align} +$$ +

+
+ + +

+ + +

More about RBMs

+ +
    +
  1. Useful when we model continuous data (i.e., we wish \( \mathbf{x} \) to be continuous)
  2. +
  3. Requires a smaller learning rate, since there's no upper bound to the value a component might take in the reconstruction
  4. +
+ +Other types of units include: + +
    +
  1. Softmax and multinomial units
  2. +
  3. Gaussian visible and hidden units
  4. +
  5. Binomial units
  6. +
  7. Rectified linear units
  8. +
+ + + +

Sampling: Metropolis sampling

+In order to sample from the RBM probability distribution it is common to use Markov Chain Monte Carlo (MCMC) algorithms such as Metropolis-Hastings or Gibbs sampling. + +

+Metropolis sampling starts by suggesting a new configuration \( \boldsymbol{x}^{k+1} \). In the brute force method this is done by some random change of the visible units. The new configuration is then accepted with the acceptance probability +$$ +\begin{align} + A(\boldsymbol{x}^k \rightarrow \boldsymbol{x}^{k+1}) = \text{min} (1, \frac{P(\boldsymbol{x}^{k+1})}{P(\boldsymbol{x}^k)}), +\label{_auto5} +\end{align} +$$ + +where we need the marginalized probability +$$ +\begin{align} + P(\boldsymbol{x}) &= \sum_\mathbf{h} P_{rbm}(\mathbf{x}, \mathbf{h}) +\label{_auto6}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\label{_auto7} +\end{align} +$$ + +

+ + +

Sampling: Gibbs sampling

+ +

+In this method we sample from the joint probability \( P_{rbm} (\mathbf{x}, \mathbf{h}) \) by way of a two step sampling process. We alternately update the visible and hidden units. +New samples are generated according to the conditional probabilities \( P(x_i|\mathbf{h}) \) and \( P(h_j|\mathbf{x}) \) respectively and accepted with the probability of \( 1 \). While the the visible nodes are dependent on the hidden nodes and vice versa, the nodes are independent of other nodes within the same layer. This is due to there being no intra layer interactions in the restricted Boltzmann machine. + +

+The conditional probabilities are often referred to as the activitation functions in the neural networks context due to their role in determining the node outputs. For the binary-binary RBM they are +$$ +\begin{align} + P(h_j = 1 | \boldsymbol{x}) &= \frac{1}{1 + e^{-b_j - \sum_i x_i w_{ij}}} +\label{_auto8}\\ + P(x_i = 1 | \boldsymbol{h}) &= \frac{1}{1 + e^{-a_j - \sum_j h_j w_{ij}}}, +\label{_auto9} +\end{align} +$$ + +where we recognize the logistic sigmoid function \( \sigma (x) = 1/(1+exp(-x)) \). + +

+ + +

Gaussian RBM

+For the Gaussian-Binary RBM the conditional probabilities are +$$ +\begin{align} + P(x_i|\mathbf{h}) &= \mathcal{N}(x_i; a_i+ \sum_j h_j w_{ij}, \sigma^2) +\label{_auto10}\\ + P(h_j=1|\mathbf{x}) &= \frac{1}{1+e^{-b_j-\frac{1}{\sigma^2} \sum_i x_i w_{ij}}}, +\label{_auto11} +\end{align} +$$ + +while the visible units now follow a normal distribution, we see the hidden units again follow the logistic sigmoid function. + +

+ + +

Cost function

+ +

+When working with a training dataset, the most common training approach is maximizing the log-likelihood of the training data. The log likelihood characterizes the log-probability of generating the observed data using our generative model. Using this method our cost function is chosen as the negative log-likelihood. The learning then consists of trying to find parameters that maximize the probability of the dataset, and is known as Maximum Likelihood Estimation (MLE). +Denoting the parameters as \( \boldsymbol{\theta} = a_1,...,a_M,b_1,...,b_N,w_{11},...,w_{MN} \), the log-likelihood is given by +$$ +\begin{align} + \mathcal{L}(\{ \theta_i \}) &= \langle \text{log} P_\theta(\boldsymbol{x}) \rangle_{data} +\label{_auto12}\\ + &= - \langle E(\boldsymbol{x}; \{ \theta_i\}) \rangle_{data} - \text{log} Z(\{ \theta_i\}), +\label{_auto13} +\end{align} +$$ + +where we used that the normalization constant does not depend on the data, \( \langle \text{log} Z(\{ \theta_i\}) \rangle = \text{log} Z(\{ \theta_i\}) \) +Our cost function is the negative log-likelihood, \( \mathcal{C}(\{ \theta_i \}) = - \mathcal{L}(\{ \theta_i \}) \) + +

+ + +

Optimization / Training

+The training procedure of choice often is Stochastic Gradient Descent (SGD). It consists of a series of iterations where we update the parameters according to the equation +$$ +\begin{align} + \boldsymbol{\theta}_{k+1} = \boldsymbol{\theta}_k - \eta \nabla \mathcal{C} (\boldsymbol{\theta}_k) +\label{_auto14} +\end{align} +$$ + +at each \( k \)-th iteration. There are a range of variants of the algorithm which aim at making the learning rate \( \eta \) more adaptive so the method might be more efficient while remaining stable. + +

+We now need the gradient of the cost function in order to minimize it. We find that +$$ +\begin{align} + \frac{\partial \mathcal{C}(\{ \theta_i\})}{\partial \theta_i} + &= \langle \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i} \rangle_{data} + + \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i} +\label{_auto15}\\ + &= \langle O_i(\boldsymbol{x}) \rangle_{data} - \langle O_i(\boldsymbol{x}) \rangle_{model}, +\label{_auto16} +\end{align} +$$ + +where in order to simplify notation we defined the "operator" +$$ +\begin{align} + O_i(\boldsymbol{x}) = \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i}, +\label{_auto17} +\end{align} +$$ + +and used the statistical mechanics relationship between expectation values and the log-partition function: +$$ +\begin{align} + \langle O_i(\boldsymbol{x}) \rangle_{model} = \text{Tr} P_\theta(\boldsymbol{x})O_i(\boldsymbol{x}) = - \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i}. +\label{_auto18} +\end{align} +$$ + +

+ + +

More on RBMs

+ +

+The data-dependent term in the gradient is known as the positive phase of the gradient, while the model-dependent term is known as the negative phase of the gradient. The aim of the training is to lower the energy of configurations that are near observed data points (increasing their probability), and raising the energy of configurations that are far from observed data points (decreasing their probability). + +

+The gradient of the negative log-likelihood cost function of a Binary-Binary RBM is then +$$ +\begin{align} + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial w_{ij}} =& \langle x_i h_j \rangle_{data} - \langle x_i h_j \rangle_{model} +\label{_auto19}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial a_{ij}} =& \langle x_i \rangle_{data} - \langle x_i \rangle_{model} +\label{_auto20}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial b_{ij}} =& \langle h_i \rangle_{data} - \langle h_i \rangle_{model}. +\label{_auto21}\\ +\label{_auto22} +\end{align} +$$ + +To get the expecation values with respect to the data, we set the visible units to each of the observed samples in the training data, then update the hidden units according to the conditional probability found before. We then average over all samples in the training data to calculate expectation values with respect to the data. + +

+ + +

Which sampling to use

+ +

+To get the expectation values with respect to the model, we use Gibbs sampling. We can either initialize the \( \boldsymbol{x} \) randomly or with a training sample. While we ideally want a large number of Gibbs iterations \( n\rightarrow n \), one might decide to truncate it earlier for efficiency. Doing this while having intialized \( \boldsymbol{x} \) with a training data vector is referred to as contrastive divergence (CD), because one is then closer to approximating the gradient of this function than the negative log-likelihood. The contrastive divergence function is the difference between two Kullback-Leibler divergences (also called relative entropy), which measure how one probability distribution diverges from a second, expected probability distribution (in this case the estimated one from the ground truth one). + +

+ + +

RBMs for the quantum many body problem

+ +

+The idea of applying RBMs to quantum many body problems was presented by G. Carleo and M. Troyer, working with ETH Zurich and Microsoft Research. + +

+Some of their motivation included + +

+ + + +

Choose the right RBM

+ +

+Carleo and Troyer applied the RBM to the quantum mechanical spin lattice systems of the Ising model and Heisenberg model, with encouraging results. Our goal is to test the method on systems of moving particles. For the spin lattice systems it was natural to use a binary-binary RBM, with the nodes taking values of 1 and -1. For moving particles, on the other hand, we want the visible nodes to be continuous, representing position coordinates. Thus, we start by choosing a Gaussian-binary RBM, where the visible nodes are continuous and hidden nodes take on values of 0 or 1. If eventually we would like the hidden nodes to be continuous as well the rectified linear units seem like the most relevant choice. + +

+ + +

Representing the wave function

+The wavefunction should be a probability amplitude depending on \( \boldsymbol{x} \). The RBM model is given by the joint distribution of \( \boldsymbol{x} \) and \( \boldsymbol{h} \) +$$ +\begin{align} + F_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}. +\label{_auto23} +\end{align} +$$ + +To find the marginal distribution of \( \boldsymbol{x} \) we set: +$$ +\begin{align} + F_{rbm}(\mathbf{x}) &= \sum_\mathbf{h} F_{rbm}(\mathbf{x}, \mathbf{h}) +\label{_auto24}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\label{_auto25} +\end{align} +$$ + +Now this is what we use to represent the wave function, calling it a neural-network quantum state (NQS) +$$ +\begin{align} + \Psi (\mathbf{X}) &= F_{rbm}(\mathbf{x}) +\label{_auto26}\\ + &= \frac{1}{Z}\sum_{\boldsymbol{h}} e^{-E(\mathbf{x}, \mathbf{h})} +\label{_auto27}\\ + &= \frac{1}{Z} \sum_{\{h_j\}} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2} + \sum_j^N b_j h_j + \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma^2}} +\label{_auto28}\\ + &= \frac{1}{Z} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2}} \prod_j^N (1 + e^{b_j + \sum_i^M \frac{x_i w_{ij}}{\sigma^2}}). +\label{_auto29}\\ +\label{_auto30} +\end{align} +$$ + +

+ + +

Choose the cost function

+Now we don't necessarily have training data (unless we generate it by using some other method). However, what we do have is the variational principle which allows us to obtain the ground state wave function by minimizing the expectation value of the energy of a trial wavefunction (corresponding to the untrained NQS). Similarly to the traditional variational Monte Carlo method then, it is the local energy we wish to minimize. The gradient to use for the stochastic gradient descent procedure is +$$ +\begin{align} + G_i = \frac{\partial \langle E_L \rangle}{\partial \theta_i} + = 2(\langle E_L \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle - \langle E_L \rangle \langle \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle ), +\label{_auto31} +\end{align} +$$ + +where the local energy is given by +$$ +\begin{align} + E_L = \frac{1}{\Psi} \hat{\mathbf{H}} \Psi. +\label{_auto32} +\end{align} +$$ + +

+ + +

Running the codes

+
+
+

+You can find the codes for the simple two-electron case at the Github repository https://github.com/mhjensenseminars/MachineLearningTalk/tree/master/doc/Programs/MLcpp/src. Python codes to come, only c++ as of now. + +

+The trial wave function is based on the product of a Slater determinant with Gaussian orbitals, a simple Jastrow factor \( \exp{(r_{ij})} \) and the reduced Boltzmann machines. + +

+The Broyden-Fletcher-Goldfarb-Shanno algorithm was used to perform the minimization. We used \( 14 \) hidden nodes in the calculations below. + +

+

+
+ + +

+ + +

Energy as function of iterations, \( N=2 \) electrons

+
+
+

+



+
+
+ + +

+ + +

Energy as function of iterations, \( N=6 \) electrons

+
+
+

+



+
+
+ + +

+ + +

Conclusions and where do we stand

+
+
+

+ +

    +
  • A simple extension of the work of G. Carleo and M. Troyer, Science 355, Issue 6325, pp. 602-606 (2017) gives excellent results for two-electron systems as well as good agreement with standard VMC calculations for \( N=6 \) and \( N=12 \) electrons.
  • +
  • Minimization problem can be tricky.
  • +
  • Anti-symmetry dealt with multiplying the trail wave function with an optimized Slater determinant.
  • +
  • To come: Analysis of wave function from ML and compare with diffusion and Variational Monte Carlo calculations as well as the analytical results of Taut for the two-electron case.
  • +
  • Extend to more fermions. How do we deal with the antisymmetry of the multi-fermion wave function? + +
      +
    1. Here we used standard Hartree-Fock theory to define an optimal Slater determinant. Takes care of the antisymmetry. What about constructing an anti-symmetrized network function?
    2. +
    3. Use thereafter ML to determine the correlated part of the wafe function (including a standard Jastrow factor).
    4. +
    5. Test this for multi-fermion systems and compare with other many-body methods.
    6. +
    + +
  • Can we use ML to find out which correlations are relevant and thereby diminish the dimensionality problem in say CC or SRG theories?
  • +
+
+
+ + +

+ + + +

+ + + + + + + +
+ © 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+ + + + + + diff --git a/doc/pub/BM/html/BM-reveal.html b/doc/pub/BM/html/BM-reveal.html new file mode 100644 index 000000000..d84d03de9 --- /dev/null +++ b/doc/pub/BM/html/BM-reveal.html @@ -0,0 +1,1681 @@ +\ + + + + + + +Solving quantum mechanical problems with Machine Learning and Boltzmann machines + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + +
+ + + + +

Solving quantum mechanical problems with Machine Learning and Boltzmann machines

+ +

+ + +

+Morten Hjorth-Jensen +
+ +

+ + +

Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University and Department of Physics, University of Oslo, Norway
+
+

 
+

Jul 26, 2018

+
+

+ +

+ © 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+
+ + +
+

What is this talk about?

+
+ +

+The main aim is to give you a short and pedestrian introduction to how we can use Machine Learning methods +to solve quantum mechanical many-body problems. And why this could be of interest. + +

+The hope is that after this talk you have gotten the basic ideas to get you started. Peeping into https://github.com/mhjensenseminars/MachineLearningTalk, you'll find a Jupyter notebook, slides, codes etc that will allow you to reproduce the simulations discussed here, and perhaps run your own very first calculations. + +

+Furthermore, since we will also talk about Monte Carlo simulations, the exciting idea of Monte Carlo optimization and Machine Learning can be used to mesh strategies for reducing the curse of dimensionality. + + +

+
+ + +
+

Why?

+ +

+How can we avoid the dimensionality curse? Many possibilities + +

    +

  1. smarter basis functions
  2. +

  3. resummation of specific correlations
  4. +

  5. stochastic sampling of high-lying states (stochastic FCI, CC and soon SRG)
  6. +

  7. many more
  8. +
+

+ +Machine Learning and Quantum Computing hold also great promise in tackling the +ever increasing dimensionalities. Here we will focus on Machine Learning. +

+ + +
+

Overview

+
+ +
    +

  • Short intro to Machine Learning
  • +

  • Variational Monte Carlo (Markov Chain Monte Carlo, \( \mathrm{MC}^2 \)) and two-electron quantum dots, solving quantum mechanical problems in a stochastic way. It will serve as our motivation for switching to Machine Learning.
  • +

  • From Variational Monte Carlo to Boltzmann Machines and Machine Learning
  • +
+
+
+ + +
+

What are the Machine Learning calculations here based on?

+ +

+This work is inspired by the idea of representing the wave function with +a restricted Boltzmann machine (RBM), presented recently by G. Carleo and M. Troyer, Science 355, Issue 6325, pp. 602-606 (2017). They +named such a wave function/network a neural network quantum state (NQS). In their article they apply it to the quantum mechanical +spin lattice systems of the Ising model and Heisenberg model, with +encouraging results. + +

+Thanks to Vilde Flugsrud and Alfred Alocias Mariadason for many discussions and interpretations of the above paper. +

+ + +
+

A new world

+
+ +

+Machine learning (ML) is an extremely rich field, in spite of its young age. The +increases we have seen during the last three decades in computational +capabilities have been followed by developments of methods and +techniques for analyzing and handling large date sets, relying heavily +on statistics, computer science and mathematics. The field is rather +new and developing rapidly. + +

+Popular software packages written in Python for ML are + +

+

+ +These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +

+
+ + +
+

Lots of room for creativity

+
+ +

+Not all the +algorithms and methods can be given a rigorous mathematical +justification, opening up thereby for experimenting +and trial and error and thereby exciting new developments. +

+ +

+

+ +

+A solid command of linear algebra, multivariate theory, +probability theory, statistical data analysis, +understanding errors and Monte Carlo methods is important in order to understand many of the +various algorithms and methods. +

+ +

+

+Job market, a personal statement. +

+A familiarity with ML is almost becoming a prerequisite for many of the most exciting employment +opportunities. Add quantum computing and there you are. +

+
+ + +
+

Some members of the ML family

+ +

+

+ +
    +

  1. Linear regression and its variants, in essence polynomial regression
  2. +

  3. Decision tree algorithms, from simpler to more complex ones like random forests
  4. +

  5. Nearest neighbors models
  6. +

  7. Bayesian statistics and regression
  8. +

  9. Support vector machines and finally various variants of
  10. +

  11. Artifical neural networks and deep learning
  12. +

  13. ....
  14. +
+
+
+ + +
+

What are the basic ingredients?

+
+ +

+Almost every problem in ML and data science starts with the same ingredients: + +

    +

  • The dataset \( \mathbf{x} \) (could be some observable quantity of the system we are studying)
  • +

  • A model which is a function of a set of parameters \( \mathbf{\alpha} \) that relates to the dataset, say a likelihood function \( p(\mathbf{x}\vert \mathbf{\alpha}) \) or just a simple model \( f(\mathbf{\alpha}) \)
  • +

  • A so-called cost function \( \mathcal{C} (\mathbf{x}, f(\mathbf{\alpha})) \) which allows us to decide how well our model represents the dataset.
  • +
+

+ +We seek to minimize the function \( \mathcal{C} (\mathbf{x}, f(\mathbf{\alpha})) \) by finding the parameter values which minimize \( \mathcal{C} \). This leads to various minimization algorithms. +

+
+ + +
+

What is Machine Learning?

+
+ +

+Machine learning is the science of giving computers the ability to +learn without being explicitly programmed. The idea is that there +exist generic algorithms which can be used to find patterns in a broad +class of data sets without having to write code specifically for each +problem. The algorithm will build its own logic based on the data. + +

+Machine learning is a subfield of computer science, and is closely +related to computational statistics. It evolved from the study of +pattern recognition in artificial intelligence (AI) research, and has +made contributions to AI tasks like computer vision, natural language +processing and speech recognition. It has also, especially in later +years, found applications in a wide variety of other areas, including +bioinformatics, economy, physics, finance and marketing. + +

+You will notice however that many of the basic ideas discussed do come from Physics! +

+
+ + +
+

Types of Machine Learning

+ +

+

+ +

+The approaches to machine learning are many, but are often split into two main categories. +In supervised learning we know the answer to a problem, +and let the computer deduce the logic behind it. On the other hand, unsupervised learning +is a method for finding patterns and relationship in data sets without any prior knowledge of the system. +Some authours also operate with a third category, namely reinforcement learning. This is a paradigm +of learning inspired by behavioural psychology, where learning is achieved by trial-and-error, +solely from rewards and punishment. + +

+Another way to categorize machine learning tasks is to consider the desired output of a system. +Some of the most common tasks are: + +

    + +

  • Classification: Outputs are divided into two or more classes. The goal is to produce a model that assigns inputs into one of these classes. An example is to identify digits based on pictures of hand-written ones. Classification is typically supervised learning.
  • + +

  • Regression: Finding a functional relationship between an input data set and a reference data set. The goal is to construct a function that maps input data to continuous output values.
  • + +

  • Clustering: Data are divided into groups with certain common traits, without knowing the different groups beforehand. It is thus a form of unsupervised learning.
  • +
+
+
+ + +
+

References

+
+ + +
+
+ + +
+

Another interesting article

+ +

+Here we will use so-called reduced Boltzmann Machines to simulate quantum many-body problems. For Monte Carlo aficionados, there is a very close similarity with what are called shadow wave functions, see the work of Pederiva and Kalos and collaborators, Phys Rev. E 90, 053304 (2014). +

+ + +
+

Just for fun illustration of scikit-learn: Hudson bay data

+
+ +

+Most mammalian predators rely on a variety of prey, which complicates mathematical modeling; however, a few predators have become highly specialized and seek almost exclusively a single prey species. An example of this simplified predator-prey interaction is seen in Canadian northern forests, where the populations of the lynx and the snowshoe hare are intertwined in a life and death struggle. + +

+One reason that this particular system has been so extensively studied is that the Hudson Bay company kept careful records of all furs from the early 1800s into the 1900s. The records for the furs collected by the Hudson Bay company showed distinct oscillations (approximately 12 year periods), suggesting that these species caused almost periodic fluctuations of each other's populations. The table here shows data from 1900 to 1920. + + +

+
+ + +
+

Hares and lynx in Hudson bay from 1900 to 1920

+ +

+



+
+ + +
+

Linear regression in Python

+
+ +

+ + +

import numpy as np
+import matplotlib.pyplot as plt
+from IPython.display import display
+import sklearn
+from sklearn.linear_model import LinearRegression
+from sklearn.tree import DecisionTreeRegressor
+
+
+data = np.loadtxt('src/Hudson_Bay.csv', delimiter=',', skiprows=1)
+x = data[:,0]
+y = data[:,1]
+line = np.linspace(1900,1920,1000,endpoint=False).reshape(-1,1)
+reg = DecisionTreeRegressor(min_samples_split=3).fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, reg.predict(line), label="decision tree")
+regline = LinearRegression().fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, regline.predict(line), label= "Linear Regression")
+plt.plot(x, y, label= "Linear Regression")
+plt.show()
+
+ +
+
+ + +
+

Artificial neurons

+
+ +

+The field of artificial neural networks has a long history of +development, and is closely connected with the advancement of computer +science and computers in general. A model of artificial neurons was +first developed by McCulloch and Pitts in 1943 to study signal +processing in the brain and has later been refined by others. The +general idea is to mimic neural networks in the human brain, which is +composed of billions of neurons that communicate with each other by +sending electrical signals. Each neuron accumulates its incoming +signals, which must exceed an activation threshold to yield an +output. If the threshold is not overcome, the neuron remains inactive, +i.e. has zero output. + +

+This behaviour has inspired a simple mathematical model for an artificial neuron. + +

 
+$$ + y = f\left(\sum_{i=1}^n w_ix_i\right) = f(u) +$$ +

 
+ +Here, the output \( y \) of the neuron is the value of its activation function, which have as input +a weighted sum of signals \( x_i, \dots ,x_n \) received by \( n \) other neurons. +

+
+ + +
+

A simple perceptron model

+ +

+



+
+ + +
+

Neural network types

+
+ +

+An artificial neural network (NN), is a computational model that consists of layers of connected neurons, or nodes. +It is supposed to mimic a biological nervous system by letting each neuron interact with other neurons +by sending signals in the form of mathematical functions between layers. +A wide variety of different NNs have +been developed, but most of them consist of an input layer, an output layer and eventual layers in-between, called +hidden layers. All layers can contain an arbitrary number of nodes, and each connection between two nodes +is associated with a weight variable. + +

+



+
+
+ + +
+

The system: two electrons in a harmonic oscillator trap in two dimensions

+ +

+The Hamiltonian of the quantum dot is given by +

 
+$$ \hat{H} = \hat{H}_0 + \hat{V}, +$$ +

 
+ +where \( \hat{H}_0 \) is the many-body HO Hamiltonian, and \( \hat{V} \) is the +inter-electron Coulomb interactions. In dimensionless units, +

 
+$$ \hat{V}= \sum_{i < j}^N \frac{1}{r_{ij}}, +$$ +

 
+ +with \( r_{ij}=\sqrt{\mathbf{r}_i^2 - \mathbf{r}_j^2} \). + +

+This leads to the separable Hamiltonian, with the relative motion part given by (\( r_{ij}=r \)) +

 
+$$ +\hat{H}_r=-\nabla^2_r + \frac{1}{4}\omega^2r^2+ \frac{1}{r}, +$$ +

 
+ +plus a standard Harmonic Oscillator problem for the center-of-mass motion. +This system has analytical solutions in two and three dimensions (M. Taut 1993 and 1994). +

+ + +
+

Quantum Monte Carlo Motivation

+
+ +

+Given a hamiltonian \( H \) and a trial wave function \( \Psi_T \), the variational principle states that the expectation value of \( \langle H \rangle \), defined through +

 
+$$ + \langle E \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})H(\boldsymbol{R})\Psi_T(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})\Psi_T(\boldsymbol{R})}, +$$ +

 
+ +is an upper bound to the ground state energy \( E_0 \) of the hamiltonian \( H \), that is +

 
+$$ + E_0 \le \langle H \rangle . +$$ +

 
+ +In general, the integrals involved in the calculation of various expectation values are multi-dimensional ones. Traditional integration methods such as the Gauss-Legendre will not be adequate for say the computation of the energy of a many-body system. +

+
+ + +
+

Quantum Monte Carlo Motivation

+
+Basic steps. +

+Choose a trial wave function +\( \psi_T(\boldsymbol{R}) \). +

 
+$$ + P(\boldsymbol{R},\boldsymbol{\alpha})= \frac{\left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2}{\int \left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2d\boldsymbol{R}}. +$$ +

 
+ +This is our model, or likelihood/probability distribution function (PDF). It depends on some variational parameters \( \boldsymbol{\alpha} \). +The approximation to the expectation value of the Hamiltonian is now +

 
+$$ + \langle E[\boldsymbol{\alpha}] \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})H(\boldsymbol{R})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})}. +$$ +

 
+

+
+ + +
+

Quantum Monte Carlo Motivation

+
+Define a new quantity. +

 
+$$ + E_L(\boldsymbol{R},\boldsymbol{\alpha})=\frac{1}{\psi_T(\boldsymbol{R},\boldsymbol{\alpha})}H\psi_T(\boldsymbol{R},\boldsymbol{\alpha}), +$$ +

 
+ +called the local energy, which, together with our trial PDF yields +

 
+$$ + E[\boldsymbol{\alpha}]=\int P(\boldsymbol{R})E_L(\boldsymbol{R},\boldsymbol{\alpha}) d\boldsymbol{R}\approx \frac{1}{N}\sum_{i=1}^NE_L(\boldsymbol{R_i},\boldsymbol{\alpha}) +$$ +

 
+ +with \( N \) being the number of Monte Carlo samples. +

+
+ + +
+

Quantum Monte Carlo

+
+ +

+The Algorithm for performing a variational Monte Carlo calculations runs thus as this + +

    + +

  • Initialisation: Fix the number of Monte Carlo steps. Choose an initial \( \boldsymbol{R} \) and variational parameters \( \alpha \) and calculate \( \left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2 \).
  • + +

  • Initialise the energy and the variance and start the Monte Carlo calculation by looping over trials.
  • + +
      + +

    • Calculate a trial position \( \boldsymbol{R}_p=\boldsymbol{R}+r*step \) where \( r \) is a random variable \( r \in [0,1] \).
    • + +

    • Metropolis algorithm to accept or reject this move \( w = P(\boldsymbol{R}_p,\boldsymbol{\alpha})/P(\boldsymbol{R},\boldsymbol{\alpha}) \).
    • + +

    • If the step is accepted, then we set \( \boldsymbol{R}=\boldsymbol{R}_p \).
    • + +

    • Update averages
    • +
    +

  • Finish and compute final averages.
  • +
+

+ +Observe that the jumping in space is governed by the variable step. This is often called brute-force sampling. +Need importance sampling to get more relevant sampling. +

+
+ + +
+

The trial wave function

+
+ +

+We want to perform a Variational Monte Carlo calculation of the ground state of two electrons in a quantum dot well with different oscillator energies, assuming total spin \( S=0 \). +Our trial wave function has the following form +

 
+$$ +\begin{equation} + \psi_{T}(\boldsymbol{r}_1,\boldsymbol{r}_2) = + C\exp{\left(-\alpha_1\omega(r_1^2+r_2^2)/2\right)} + \exp{\left(\frac{r_{12}}{(1+\alpha_2 r_{12})}\right)}, +\tag{1} +\end{equation} +$$ +

 
+ +where the $\alpha$s represent our variational parameters, two in this case. + +

+Why does the trial function look like this? How did we get there? This will be our main motivation for switching to +Machine Learning. + + +

+
+ + +
+

The correlation part of the wave function

+ +

+To find an ansatz for the correlated part of the wave function, it is useful to rewrite the two-particle +local energy in terms of the relative and center-of-mass motion. +Let us denote the distance between the two electrons as +\( r_{12} \). We omit the center-of-mass motion since we are only interested in the case when +\( r_{12} \rightarrow 0 \). The contribution from the center-of-mass (CoM) variable \( {\bf R}_{\mathrm{CoM}} \) +gives only a finite contribution. +We focus only on the terms that are relevant for \( r_{12} \) and for three dimensions. The relevant local energy becomes then +

 
+$$ +\lim_{r_{12} \rightarrow 0}E_L(R)= + \frac{1}{{\cal R}_T(r_{12})}\left(2\frac{d^2}{dr_{ij}^2}+\frac{4}{r_{ij}}\frac{d}{dr_{ij}}+ +\frac{2}{r_{ij}}-\frac{l(l+1)}{r_{ij}^2}+2E +\right){\cal R}_T(r_{12}) = 0. +$$ +

 
+ +Set \( l=0 \) and we have the so-called cusp condition +

 
+$$ +\frac{d {\cal R}_T(r_{12})}{dr_{12}} = -\frac{1}{2(l+1)} +{\cal R}_T(r_{12})\qquad r_{12}\to 0 +$$ +

 
+

+ + +
+

Resulting ansatz

+The above results in +

 
+$$ +{\cal R}_T \propto \exp{(r_{ij}/2)}, +$$ +

 
+ +for anti-parallel spins and +

 
+$$ +{\cal R}_T \propto \exp{(r_{ij}/4)}, +$$ +

 
+ +for anti-parallel spins. +This is the so-called cusp condition for the relative motion, resulting in a minimal requirement +for the correlation part of the wave fuction. +For general systems containing more than say two electrons, we have this +condition for each electron pair \( ij \). +

+ + +
+

The VMC code

+ +

+ + +

# Importing various packages
+from math import exp, sqrt
+from random import random, seed
+import numpy as np
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import sys
+
+#Trial wave function for quantum dots in two dims
+def WaveFunction(r,alpha,beta):
+    r1 = r[0,0]**2 + r[0,1]**2
+    r2 = r[1,0]**2 + r[1,1]**2
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = r12/(1+beta*r12)
+    return exp(-0.5*alpha*(r1+r2)+deno)
+
+#Local energy  for quantum dots in two dims, using analytical local energy
+def LocalEnergy(r,alpha,beta):
+    
+    r1 = (r[0,0]**2 + r[0,1]**2)
+    r2 = (r[1,0]**2 + r[1,1]**2)
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = 1.0/(1+beta*r12)
+    deno2 = deno*deno
+    return 0.5*(1-alpha*alpha)*(r1 + r2) +2.0*alpha + 1.0/r12+deno2*(alpha*r12-deno2+2*beta*deno-1.0/r12)
+
+# The Monte Carlo sampling with the Metropolis algo
+def MonteCarloSampling():
+
+    NumberMCcycles= 100000
+    StepSize = 1.0
+    # positions
+    PositionOld = np.zeros((NumberParticles,Dimension), np.double)
+    PositionNew = np.zeros((NumberParticles,Dimension), np.double)
+    # seed for rng generator
+    seed()
+    # start variational parameter
+    alpha = 0.9
+    for ia in range(MaxVariations):
+        alpha += .025
+        AlphaValues[ia] = alpha
+        beta = 0.2 
+        for jb in range(MaxVariations):
+            beta += .01
+            BetaValues[jb] = beta
+            energy = energy2 = 0.0
+            DeltaE = 0.0
+            #Initial position
+            for i in range(NumberParticles):
+                for j in range(Dimension):
+                    PositionOld[i,j] = StepSize * (random() - .5)
+            wfold = WaveFunction(PositionOld,alpha,beta)
+
+            #Loop over MC MCcycles
+            for MCcycle in range(NumberMCcycles):
+                #Trial position
+                for i in range(NumberParticles):
+                    for j in range(Dimension):
+                        PositionNew[i,j] = PositionOld[i,j] + StepSize * (random() - .5)
+                wfnew = WaveFunction(PositionNew,alpha,beta)
+
+                #Metropolis test to see whether we accept the move
+                if random() < wfnew**2 / wfold**2:
+                   PositionOld = PositionNew.copy()
+                   wfold = wfnew
+                   DeltaE = LocalEnergy(PositionOld,alpha,beta)
+                energy += DeltaE
+                energy2 += DeltaE**2
+
+            #We calculate mean, variance and error ...
+            energy /= NumberMCcycles
+            energy2 /= NumberMCcycles
+            variance = energy2 - energy**2
+            error = sqrt(variance/NumberMCcycles)
+            Energies[ia,jb] = energy    
+    return Energies, AlphaValues, BetaValues
+
+
+#Here starts the main program with variable declarations
+NumberParticles = 2
+Dimension = 2
+MaxVariations = 10
+Energies = np.zeros((MaxVariations,MaxVariations))
+AlphaValues = np.zeros(MaxVariations)
+BetaValues = np.zeros(MaxVariations)
+(Energies, AlphaValues, BetaValues) = MonteCarloSampling()
+
+# Prepare for plots
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+# Plot the surface.
+X, Y = np.meshgrid(AlphaValues, BetaValues)
+surf = ax.plot_surface(X, Y, Energies,cmap=cm.coolwarm,linewidth=0, antialiased=False)
+# Customize the z axis.
+zmin = np.matrix(Energies).min()
+zmax = np.matrix(Energies).max()
+ax.set_zlim(zmin, zmax)
+ax.set_xlabel(r'$\alpha$')
+ax.set_ylabel(r'$\beta$')
+ax.set_zlabel(r'$\langle E \rangle$')
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+plt.show()
+
+
+ + +
+

Technical aspect, improvements and how to define the cost function

+
+ +

+The above procedure is not the smartest one. Looping over all variational parameters becomes expensive. +Also, we don't use importance sampling and optimizations of the standard deviation (blocking, bootstrap, jackknife). +Such codes are included in the above Github address. + +

+We can also be smarter and use minimization methods to find the optimal variational parameters with fewer Monte Carlo cycles and then +fire up our heavy artillery. + +

+One way to achieve this is to minimize the energy as function of the variational parameters. + + +

+
+ + +
+

Energy derivatives

+
+ +

+To find the derivatives of the local energy expectation value as function of the variational parameters, we can use the chain rule and the hermiticity of the Hamiltonian. + +

+Let us define +

 
+$$ +\bar{E}_{\alpha_i}=\frac{d\langle E_L\rangle}{d\alpha_i}. +$$ +

 
+ +as the derivative of the energy with respect to the variational parameter \( \alpha_i \) +We define also the derivative of the trial function (skipping the subindex \( T \)) as +

 
+$$ +\bar{\Psi}_{i}=\frac{d\Psi}{d\alpha_i}. +$$ +

 
+

+
+ + +
+

Derivatives of the local energy

+
+ +

+The elements of the gradient of the local energy are then (using the chain rule and the hermiticity of the Hamiltonian) +

 
+$$ +\bar{E}_{i}= 2\left( \langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L \rangle\right). +$$ +

 
+ +From a computational point of view it means that you need to compute the expectation values of +

 
+$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle, +$$ +

 
+ +and +

 
+$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L\rangle +$$ +

 
+ +These integrals are evaluted using MC intergration (with all its possible error sources). +We can then use methods like stochastic gradient or other minimization methods to find the optimal variational parameters (I don't discuss this topic here, but these methods are very important in ML). +

+
+ + +
+

How do we define our cost function?

+
+ +

+We have a model, our likelihood function. + +

+How should we define the cost function? + + +

+
+ + +
+

Meet the variance and its derivatives

+
+Why the variance? +

+Suppose the trial function (our model) is the exact wave function. The action of the hamiltionan +on the wave function +

 
+$$ + H\Psi = \mathrm{constant}\times \Psi, +$$ +

 
+ +The integral which defines various +expectation values involving moments of the hamiltonian becomes then +

 
+$$ + \langle E^n \rangle = \langle H^n \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})H^n(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}= +\mathrm{constant}\times\frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}=\mathrm{constant}. +$$ +

 
+ +This gives an important information: If I want the variance, the exact wave function leads to zero variance! +The variance is defined as +

 
+$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2. +$$ +

 
+ +Variation is then performed by minimizing both the energy and the variance. + + +

+
+ + +
+

The variance defines the cost function

+
+ +

+We can then take the derivatives of +

 
+$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2, +$$ +

 
+ +with respect to the variational parameters. The derivatives of the variance can then be used to defined the +so-called Hessian matrix, which in turn allows us to use minimization methods like Newton's method or +standard gradient methods. + +

+This leads to however a more complicated expression, with obvious errors when evaluating integrals by Monte Carlo integration. Less used, see however Filippi and Umrigar. The expression becomes complicated +

 
+$$ +\bar{E}_{ij} = 2\left[ \langle (\frac{\bar{\Psi}_{ij}}{\Psi}+\frac{\bar{\Psi}_{j}}{\Psi}\frac{\bar{\Psi}_{i}}{\Psi})(E_L-\langle E\rangle)\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\bar{E}_j-\langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\bar{E}_i\right] +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L{_j}\rangle +\langle \frac{\bar{\Psi}_{j}}{\Psi}E_L{_i}\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L{_j}\rangle \langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\langle E_L{_i}\rangle. +$$ +

 
+ +

+Evaluating the cost function means having to evaluate the above second derivative of the energy. + + +

+
+ + +
+

Boltzmann Machines

+ +

+Why use a generative model rather than the more well known discriminative deep neural networks (DNN)? + +

    +

  • Discriminitave methods have several limitations: They are mainly supervised learning methods, thus requiring labeled data. And there are tasks they cannot accomplish, like drawing new examples from an unknown probability distribution.
  • +

  • A generative model can learn to represent and sample from a probability distribution. The core idea is to learn a parametric model of the probability distribution from which the training data was drawn. As an example + +
      +

    1. A model for images could learn to draw new examples of cats and dogs, given a training dataset of images of cats and dogs.
    2. +

    3. Generate a sample of an ordered or disordered Ising model phase, having been given samples of such phases.
    4. +

    5. Model the trial wave function for Monte Carlo calculations
    6. +
    +

    +

+
+ + +
+

Some similarities and differences from DNNs

+ +
    +

  1. Both use gradient-descent based learning procedures for minimizing cost functions
  2. +

  3. Energy based models don't use backpropagation and automatic differentiation for computing gradients, instead turning to Markov Chain Monte Carlo methods.
  4. +

  5. DNNs often have several hidden layers. A restricted Boltzmann machine has only one hidden layer, however several RBMs can be stacked to make up Deep Belief Networks, of which they constitute the building blocks.
  6. +
+

+ +History: The RBM was developed by amongst others Geoffrey Hinton, called by some the "Godfather of Deep Learning", working with the University of Toronto and Google. +

+ + +
+

The structure of the RBM network

+ +

+



+
+ + +
+

The network

+ +

+The network layers: + +

    +

  1. A function \( \mathbf{x} \) that represents the visible layer, a vector of \( M \) elements (nodes). This layer represents both what the RBM might be given as training input, and what we want it to be able to reconstruct. This might for example be the pixels of an image, the spin values of the Ising model, or coefficients representing speech.
  2. +

  3. The function \( \mathbf{h} \) represents the hidden, or latent, layer. A vector of \( N \) elements (nodes). Also called "feature detectors".
  4. +
+
+ + +
+

Goals

+ +

+The goal of the hidden layer is to increase the model's expressive power. We encode complex interactions between visible variables by introducing additional, hidden variables that interact with visible degrees of freedom in a simple manner, yet still reproduce the complex correlations between visible degrees in the data once marginalized over (integrated out). + +

+Examples of this trick being employed in physics: + +

    +

  1. The Hubbard-Stratonovich transformation
  2. +

  3. The introduction of ghost fields in gauge theory
  4. +

  5. Shadow wave functions in Quantum Monte Carlo simulations
  6. +
+

+ +The network parameters, to be optimized/learned: + +

    +

  1. \( \mathbf{a} \) represents the visible bias, a vector of same length as \( \mathbf{x} \).
  2. +

  3. \( \mathbf{b} \) represents the hidden bias, a vector of same lenght as \( \mathbf{h} \).
  4. +

  5. \( W \) represents the interaction weights, a matrix of size \( M\times N \).
  6. +
+
+ + +
+

Joint distribution and the Energy function

+The restricted Boltzmann machine is described by a Bolztmann distribution +

 
+$$ +\begin{align} + P_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}, +\tag{2} +\end{align} +$$ +

 
+ +where \( Z \) is the normalization constant or partition function, defined as +

 
+$$ +\begin{align} + Z = \int \int e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})} d\mathbf{x} d\mathbf{h}. +\tag{3} +\end{align} +$$ +

 
+ +It is common to ignore \( T_0 \) by setting it to one. +

+ + +
+

Network Elements

+ +

+The function \( E(\mathbf{x},\mathbf{h}) \) gives the energy of a +configuration (pair of vectors) \( (\mathbf{x}, \mathbf{h}) \). The lower +the energy of a configuration, the higher the probability of it. This +function also depends on the parameters \( \mathbf{a} \), \( \mathbf{b} \) and +\( W \). Thus, when we adjust them during the learning procedure, we are +adjusting the energy function to best fit our problem. +

+ + +
+

Defining different types of RBMs

+There are different variants of RBMs, and the differences lie in the types of visible and hidden units we choose as well as in the implementation of the energy function \( E(\mathbf{x},\mathbf{h}) \). + +

+

+Binary-Binary RBM: +

+RBMs were first developed using binary units in both the visible and hidden layer. The corresponding energy function is defined as follows: +

 
+$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = - \sum_i^M x_i a_i- \sum_j^N b_j h_j - \sum_{i,j}^{M,N} x_i w_{ij} h_j, +\tag{4} +\end{align} +$$ +

 
+ +where the binary values taken on by the nodes are most commonly 0 and 1. +

+ +
+Gaussian-Binary RBM: +

+Another varient is the RBM where the visible units are Gaussian while the hidden units remain binary: +

 
+$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = \sum_i^M \frac{(x_i - a_i)^2}{2\sigma_i^2} - \sum_j^N b_j h_j - \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma_i^2}. +\tag{5} +\end{align} +$$ +

 
+

+
+ + +
+

More about RBMs

+ +
    +

  1. Useful when we model continuous data (i.e., we wish \( \mathbf{x} \) to be continuous)
  2. +

  3. Requires a smaller learning rate, since there's no upper bound to the value a component might take in the reconstruction
  4. +
+

+ +Other types of units include: + +

    +

  1. Softmax and multinomial units
  2. +

  3. Gaussian visible and hidden units
  4. +

  5. Binomial units
  6. +

  7. Rectified linear units
  8. +
+
+ + +
+

Sampling: Metropolis sampling

+In order to sample from the RBM probability distribution it is common to use Markov Chain Monte Carlo (MCMC) algorithms such as Metropolis-Hastings or Gibbs sampling. + +

+Metropolis sampling starts by suggesting a new configuration \( \boldsymbol{x}^{k+1} \). In the brute force method this is done by some random change of the visible units. The new configuration is then accepted with the acceptance probability +

 
+$$ +\begin{align} + A(\boldsymbol{x}^k \rightarrow \boldsymbol{x}^{k+1}) = \text{min} (1, \frac{P(\boldsymbol{x}^{k+1})}{P(\boldsymbol{x}^k)}), +\tag{6} +\end{align} +$$ +

 
+ +where we need the marginalized probability +

 
+$$ +\begin{align} + P(\boldsymbol{x}) &= \sum_\mathbf{h} P_{rbm}(\mathbf{x}, \mathbf{h}) +\tag{7}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\tag{8} +\end{align} +$$ +

 
+

+ + +
+

Sampling: Gibbs sampling

+ +

+In this method we sample from the joint probability \( P_{rbm} (\mathbf{x}, \mathbf{h}) \) by way of a two step sampling process. We alternately update the visible and hidden units. +New samples are generated according to the conditional probabilities \( P(x_i|\mathbf{h}) \) and \( P(h_j|\mathbf{x}) \) respectively and accepted with the probability of \( 1 \). While the the visible nodes are dependent on the hidden nodes and vice versa, the nodes are independent of other nodes within the same layer. This is due to there being no intra layer interactions in the restricted Boltzmann machine. + +

+The conditional probabilities are often referred to as the activitation functions in the neural networks context due to their role in determining the node outputs. For the binary-binary RBM they are +

 
+$$ +\begin{align} + P(h_j = 1 | \boldsymbol{x}) &= \frac{1}{1 + e^{-b_j - \sum_i x_i w_{ij}}} +\tag{9}\\ + P(x_i = 1 | \boldsymbol{h}) &= \frac{1}{1 + e^{-a_j - \sum_j h_j w_{ij}}}, +\tag{10} +\end{align} +$$ +

 
+ +where we recognize the logistic sigmoid function \( \sigma (x) = 1/(1+exp(-x)) \). +

+ + +
+

Gaussian RBM

+For the Gaussian-Binary RBM the conditional probabilities are +

 
+$$ +\begin{align} + P(x_i|\mathbf{h}) &= \mathcal{N}(x_i; a_i+ \sum_j h_j w_{ij}, \sigma^2) +\tag{11}\\ + P(h_j=1|\mathbf{x}) &= \frac{1}{1+e^{-b_j-\frac{1}{\sigma^2} \sum_i x_i w_{ij}}}, +\tag{12} +\end{align} +$$ +

 
+ +while the visible units now follow a normal distribution, we see the hidden units again follow the logistic sigmoid function. +

+ + +
+

Cost function

+ +

+When working with a training dataset, the most common training approach is maximizing the log-likelihood of the training data. The log likelihood characterizes the log-probability of generating the observed data using our generative model. Using this method our cost function is chosen as the negative log-likelihood. The learning then consists of trying to find parameters that maximize the probability of the dataset, and is known as Maximum Likelihood Estimation (MLE). +Denoting the parameters as \( \boldsymbol{\theta} = a_1,...,a_M,b_1,...,b_N,w_{11},...,w_{MN} \), the log-likelihood is given by +

 
+$$ +\begin{align} + \mathcal{L}(\{ \theta_i \}) &= \langle \text{log} P_\theta(\boldsymbol{x}) \rangle_{data} +\tag{13}\\ + &= - \langle E(\boldsymbol{x}; \{ \theta_i\}) \rangle_{data} - \text{log} Z(\{ \theta_i\}), +\tag{14} +\end{align} +$$ +

 
+ +where we used that the normalization constant does not depend on the data, \( \langle \text{log} Z(\{ \theta_i\}) \rangle = \text{log} Z(\{ \theta_i\}) \) +Our cost function is the negative log-likelihood, \( \mathcal{C}(\{ \theta_i \}) = - \mathcal{L}(\{ \theta_i \}) \) +

+ + +
+

Optimization / Training

+The training procedure of choice often is Stochastic Gradient Descent (SGD). It consists of a series of iterations where we update the parameters according to the equation +

 
+$$ +\begin{align} + \boldsymbol{\theta}_{k+1} = \boldsymbol{\theta}_k - \eta \nabla \mathcal{C} (\boldsymbol{\theta}_k) +\tag{15} +\end{align} +$$ +

 
+ +at each \( k \)-th iteration. There are a range of variants of the algorithm which aim at making the learning rate \( \eta \) more adaptive so the method might be more efficient while remaining stable. + +

+We now need the gradient of the cost function in order to minimize it. We find that +

 
+$$ +\begin{align} + \frac{\partial \mathcal{C}(\{ \theta_i\})}{\partial \theta_i} + &= \langle \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i} \rangle_{data} + + \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i} +\tag{16}\\ + &= \langle O_i(\boldsymbol{x}) \rangle_{data} - \langle O_i(\boldsymbol{x}) \rangle_{model}, +\tag{17} +\end{align} +$$ +

 
+ +where in order to simplify notation we defined the "operator" +

 
+$$ +\begin{align} + O_i(\boldsymbol{x}) = \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i}, +\tag{18} +\end{align} +$$ +

 
+ +and used the statistical mechanics relationship between expectation values and the log-partition function: +

 
+$$ +\begin{align} + \langle O_i(\boldsymbol{x}) \rangle_{model} = \text{Tr} P_\theta(\boldsymbol{x})O_i(\boldsymbol{x}) = - \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i}. +\tag{19} +\end{align} +$$ +

 
+

+ + +
+

More on RBMs

+ +

+The data-dependent term in the gradient is known as the positive phase of the gradient, while the model-dependent term is known as the negative phase of the gradient. The aim of the training is to lower the energy of configurations that are near observed data points (increasing their probability), and raising the energy of configurations that are far from observed data points (decreasing their probability). + +

+The gradient of the negative log-likelihood cost function of a Binary-Binary RBM is then +

 
+$$ +\begin{align} + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial w_{ij}} =& \langle x_i h_j \rangle_{data} - \langle x_i h_j \rangle_{model} +\tag{20}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial a_{ij}} =& \langle x_i \rangle_{data} - \langle x_i \rangle_{model} +\tag{21}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial b_{ij}} =& \langle h_i \rangle_{data} - \langle h_i \rangle_{model}. +\tag{22}\\ +\tag{23} +\end{align} +$$ +

 
+ +To get the expecation values with respect to the data, we set the visible units to each of the observed samples in the training data, then update the hidden units according to the conditional probability found before. We then average over all samples in the training data to calculate expectation values with respect to the data. +

+ + +
+

Which sampling to use

+ +

+To get the expectation values with respect to the model, we use Gibbs sampling. We can either initialize the \( \boldsymbol{x} \) randomly or with a training sample. While we ideally want a large number of Gibbs iterations \( n\rightarrow n \), one might decide to truncate it earlier for efficiency. Doing this while having intialized \( \boldsymbol{x} \) with a training data vector is referred to as contrastive divergence (CD), because one is then closer to approximating the gradient of this function than the negative log-likelihood. The contrastive divergence function is the difference between two Kullback-Leibler divergences (also called relative entropy), which measure how one probability distribution diverges from a second, expected probability distribution (in this case the estimated one from the ground truth one). +

+ + +
+

RBMs for the quantum many body problem

+ +

+The idea of applying RBMs to quantum many body problems was presented by G. Carleo and M. Troyer, working with ETH Zurich and Microsoft Research. + +

+Some of their motivation included + +

    +

  • "The wave function \( \Psi \) is a monolithic mathematical quantity that contains all the information on a quantum state, be it a single particle or a complex molecule. In principle, an exponential amount of information is needed to fully encode a generic many-body quantum state."
  • +

  • There are still interesting open problems, including fundamental questions ranging from the dynamical properties of high-dimensional systems to the exact ground-state properties of strongly interacting fermions.
  • +

  • The difficulty lies in finding a general strategy to reduce the exponential complexity of the full many-body wave function down to its most essential features. That is + +
      +

    1. \( \rightarrow \) Dimensional reduction
    2. +

    3. \( \rightarrow \) Feature extraction
    4. +
    +

  • Among the most successful techniques to attack these challenges, artifical neural networks play a prominent role.
  • +

  • Want to understand whether an artifical neural network may adapt to describe a quantum system.
  • +
+
+ + +
+

Choose the right RBM

+ +

+Carleo and Troyer applied the RBM to the quantum mechanical spin lattice systems of the Ising model and Heisenberg model, with encouraging results. Our goal is to test the method on systems of moving particles. For the spin lattice systems it was natural to use a binary-binary RBM, with the nodes taking values of 1 and -1. For moving particles, on the other hand, we want the visible nodes to be continuous, representing position coordinates. Thus, we start by choosing a Gaussian-binary RBM, where the visible nodes are continuous and hidden nodes take on values of 0 or 1. If eventually we would like the hidden nodes to be continuous as well the rectified linear units seem like the most relevant choice. +

+ + +
+

Representing the wave function

+The wavefunction should be a probability amplitude depending on \( \boldsymbol{x} \). The RBM model is given by the joint distribution of \( \boldsymbol{x} \) and \( \boldsymbol{h} \) +

 
+$$ +\begin{align} + F_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}. +\tag{24} +\end{align} +$$ +

 
+ +To find the marginal distribution of \( \boldsymbol{x} \) we set: +

 
+$$ +\begin{align} + F_{rbm}(\mathbf{x}) &= \sum_\mathbf{h} F_{rbm}(\mathbf{x}, \mathbf{h}) +\tag{25}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\tag{26} +\end{align} +$$ +

 
+ +Now this is what we use to represent the wave function, calling it a neural-network quantum state (NQS) +

 
+$$ +\begin{align} + \Psi (\mathbf{X}) &= F_{rbm}(\mathbf{x}) +\tag{27}\\ + &= \frac{1}{Z}\sum_{\boldsymbol{h}} e^{-E(\mathbf{x}, \mathbf{h})} +\tag{28}\\ + &= \frac{1}{Z} \sum_{\{h_j\}} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2} + \sum_j^N b_j h_j + \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma^2}} +\tag{29}\\ + &= \frac{1}{Z} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2}} \prod_j^N (1 + e^{b_j + \sum_i^M \frac{x_i w_{ij}}{\sigma^2}}). +\tag{30}\\ +\tag{31} +\end{align} +$$ +

 
+

+ + +
+

Choose the cost function

+Now we don't necessarily have training data (unless we generate it by using some other method). However, what we do have is the variational principle which allows us to obtain the ground state wave function by minimizing the expectation value of the energy of a trial wavefunction (corresponding to the untrained NQS). Similarly to the traditional variational Monte Carlo method then, it is the local energy we wish to minimize. The gradient to use for the stochastic gradient descent procedure is +

 
+$$ +\begin{align} + G_i = \frac{\partial \langle E_L \rangle}{\partial \theta_i} + = 2(\langle E_L \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle - \langle E_L \rangle \langle \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle ), +\tag{32} +\end{align} +$$ +

 
+ +where the local energy is given by +

 
+$$ +\begin{align} + E_L = \frac{1}{\Psi} \hat{\mathbf{H}} \Psi. +\tag{33} +\end{align} +$$ +

 
+

+ + +
+

Running the codes

+
+ +

+You can find the codes for the simple two-electron case at the Github repository https://github.com/mhjensenseminars/MachineLearningTalk/tree/master/doc/Programs/MLcpp/src. Python codes to come, only c++ as of now. + +

+The trial wave function is based on the product of a Slater determinant with Gaussian orbitals, a simple Jastrow factor \( \exp{(r_{ij})} \) and the reduced Boltzmann machines. + +

+The Broyden-Fletcher-Goldfarb-Shanno algorithm was used to perform the minimization. We used \( 14 \) hidden nodes in the calculations below. + + +

+
+ + +
+

Energy as function of iterations, \( N=2 \) electrons

+
+ +

+



+
+
+ + +
+

Energy as function of iterations, \( N=6 \) electrons

+
+ +

+



+
+
+ + +
+

Conclusions and where do we stand

+
+ +
    +

  • A simple extension of the work of G. Carleo and M. Troyer, Science 355, Issue 6325, pp. 602-606 (2017) gives excellent results for two-electron systems as well as good agreement with standard VMC calculations for \( N=6 \) and \( N=12 \) electrons.
  • +

  • Minimization problem can be tricky.
  • +

  • Anti-symmetry dealt with multiplying the trail wave function with an optimized Slater determinant.
  • +

  • To come: Analysis of wave function from ML and compare with diffusion and Variational Monte Carlo calculations as well as the analytical results of Taut for the two-electron case.
  • +

  • Extend to more fermions. How do we deal with the antisymmetry of the multi-fermion wave function? + +
      +

    1. Here we used standard Hartree-Fock theory to define an optimal Slater determinant. Takes care of the antisymmetry. What about constructing an anti-symmetrized network function?
    2. +

    3. Use thereafter ML to determine the correlated part of the wafe function (including a standard Jastrow factor).
    4. +

    5. Test this for multi-fermion systems and compare with other many-body methods.
    6. +
    +

  • Can we use ML to find out which correlations are relevant and thereby diminish the dimensionality problem in say CC or SRG theories?
  • +
+
+
+ + + +
+
+ + + + + + + + + + + + diff --git a/doc/pub/BM/html/BM-solarized.html b/doc/pub/BM/html/BM-solarized.html new file mode 100644 index 000000000..cacbfbcfb --- /dev/null +++ b/doc/pub/BM/html/BM-solarized.html @@ -0,0 +1,1527 @@ + + + + + + + +Solving quantum mechanical problems with Machine Learning and Boltzmann machines + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Solving quantum mechanical problems with Machine Learning and Boltzmann machines

+ +

+ + +

+Morten Hjorth-Jensen +
+ +

+ + +

Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University and Department of Physics, University of Oslo, Norway
+
+

+

Jul 26, 2018

+
+

+









+ +

What is this talk about?

+
+ +

+The main aim is to give you a short and pedestrian introduction to how we can use Machine Learning methods +to solve quantum mechanical many-body problems. And why this could be of interest. + +

+The hope is that after this talk you have gotten the basic ideas to get you started. Peeping into https://github.com/mhjensenseminars/MachineLearningTalk, you'll find a Jupyter notebook, slides, codes etc that will allow you to reproduce the simulations discussed here, and perhaps run your own very first calculations. + +

+Furthermore, since we will also talk about Monte Carlo simulations, the exciting idea of Monte Carlo optimization and Machine Learning can be used to mesh strategies for reducing the curse of dimensionality. + + +

+ + +

+









+ +

Why?

+ +

+How can we avoid the dimensionality curse? Many possibilities + +

    +
  1. smarter basis functions
  2. +
  3. resummation of specific correlations
  4. +
  5. stochastic sampling of high-lying states (stochastic FCI, CC and soon SRG)
  6. +
  7. many more
  8. +
+ +Machine Learning and Quantum Computing hold also great promise in tackling the +ever increasing dimensionalities. Here we will focus on Machine Learning. + +

+









+ +

Overview

+
+ +

+ +

+
+ + +

+









+ +

What are the Machine Learning calculations here based on?

+ +

+This work is inspired by the idea of representing the wave function with +a restricted Boltzmann machine (RBM), presented recently by G. Carleo and M. Troyer, Science 355, Issue 6325, pp. 602-606 (2017). They +named such a wave function/network a neural network quantum state (NQS). In their article they apply it to the quantum mechanical +spin lattice systems of the Ising model and Heisenberg model, with +encouraging results. + +

+Thanks to Vilde Flugsrud and Alfred Alocias Mariadason for many discussions and interpretations of the above paper. + +

+









+ +

A new world

+
+ +

+Machine learning (ML) is an extremely rich field, in spite of its young age. The +increases we have seen during the last three decades in computational +capabilities have been followed by developments of methods and +techniques for analyzing and handling large date sets, relying heavily +on statistics, computer science and mathematics. The field is rather +new and developing rapidly. + +

+Popular software packages written in Python for ML are + +

+ +These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +
+ + +

+









+ +

Lots of room for creativity

+
+ +

+Not all the +algorithms and methods can be given a rigorous mathematical +justification, opening up thereby for experimenting +and trial and error and thereby exciting new developments. +

+ + +

+

+ +

+A solid command of linear algebra, multivariate theory, +probability theory, statistical data analysis, +understanding errors and Monte Carlo methods is important in order to understand many of the +various algorithms and methods. +

+ + +

+

+Job market, a personal statement. +

+A familiarity with ML is almost becoming a prerequisite for many of the most exciting employment +opportunities. Add quantum computing and there you are. +

+ + +

+ + +

Some members of the ML family

+ +

+

+ +

+ +

    +
  1. Linear regression and its variants, in essence polynomial regression
  2. +
  3. Decision tree algorithms, from simpler to more complex ones like random forests
  4. +
  5. Nearest neighbors models
  6. +
  7. Bayesian statistics and regression
  8. +
  9. Support vector machines and finally various variants of
  10. +
  11. Artifical neural networks and deep learning
  12. +
  13. ....
  14. +
+
+ + +

+









+ +

What are the basic ingredients?

+
+ +

+Almost every problem in ML and data science starts with the same ingredients: + +

+ +We seek to minimize the function \( \mathcal{C} (\mathbf{x}, f(\mathbf{\alpha})) \) by finding the parameter values which minimize \( \mathcal{C} \). This leads to various minimization algorithms. +
+ + +

+









+ +

What is Machine Learning?

+
+ +

+Machine learning is the science of giving computers the ability to +learn without being explicitly programmed. The idea is that there +exist generic algorithms which can be used to find patterns in a broad +class of data sets without having to write code specifically for each +problem. The algorithm will build its own logic based on the data. + +

+Machine learning is a subfield of computer science, and is closely +related to computational statistics. It evolved from the study of +pattern recognition in artificial intelligence (AI) research, and has +made contributions to AI tasks like computer vision, natural language +processing and speech recognition. It has also, especially in later +years, found applications in a wide variety of other areas, including +bioinformatics, economy, physics, finance and marketing. + +

+You will notice however that many of the basic ideas discussed do come from Physics! +

+ + +

+









+ +

Types of Machine Learning

+ +

+

+ +

+The approaches to machine learning are many, but are often split into two main categories. +In supervised learning we know the answer to a problem, +and let the computer deduce the logic behind it. On the other hand, unsupervised learning +is a method for finding patterns and relationship in data sets without any prior knowledge of the system. +Some authours also operate with a third category, namely reinforcement learning. This is a paradigm +of learning inspired by behavioural psychology, where learning is achieved by trial-and-error, +solely from rewards and punishment. + +

+Another way to categorize machine learning tasks is to consider the desired output of a system. +Some of the most common tasks are: + +

+
+ + +

+









+ +

References

+
+ +

+ +

+
+ + +

+









+ +

Another interesting article

+ +

+Here we will use so-called reduced Boltzmann Machines to simulate quantum many-body problems. For Monte Carlo aficionados, there is a very close similarity with what are called shadow wave functions, see the work of Pederiva and Kalos and collaborators, Phys Rev. E 90, 053304 (2014). + +

+









+ +

Just for fun illustration of scikit-learn: Hudson bay data

+
+ +

+Most mammalian predators rely on a variety of prey, which complicates mathematical modeling; however, a few predators have become highly specialized and seek almost exclusively a single prey species. An example of this simplified predator-prey interaction is seen in Canadian northern forests, where the populations of the lynx and the snowshoe hare are intertwined in a life and death struggle. + +

+One reason that this particular system has been so extensively studied is that the Hudson Bay company kept careful records of all furs from the early 1800s into the 1900s. The records for the furs collected by the Hudson Bay company showed distinct oscillations (approximately 12 year periods), suggesting that these species caused almost periodic fluctuations of each other's populations. The table here shows data from 1900 to 1920. + + +

+ + +

+









+ +

Hares and lynx in Hudson bay from 1900 to 1920

+ +

+



+ +

+









+ +

Linear regression in Python

+
+ +

+

+ + +

import numpy as np
+import matplotlib.pyplot as plt
+from IPython.display import display
+import sklearn
+from sklearn.linear_model import LinearRegression
+from sklearn.tree import DecisionTreeRegressor
+
+
+data = np.loadtxt('src/Hudson_Bay.csv', delimiter=',', skiprows=1)
+x = data[:,0]
+y = data[:,1]
+line = np.linspace(1900,1920,1000,endpoint=False).reshape(-1,1)
+reg = DecisionTreeRegressor(min_samples_split=3).fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, reg.predict(line), label="decision tree")
+regline = LinearRegression().fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, regline.predict(line), label= "Linear Regression")
+plt.plot(x, y, label= "Linear Regression")
+plt.show()
+
+ +
+ + +

+









+ +

Artificial neurons

+
+ +

+ +

+The field of artificial neural networks has a long history of +development, and is closely connected with the advancement of computer +science and computers in general. A model of artificial neurons was +first developed by McCulloch and Pitts in 1943 to study signal +processing in the brain and has later been refined by others. The +general idea is to mimic neural networks in the human brain, which is +composed of billions of neurons that communicate with each other by +sending electrical signals. Each neuron accumulates its incoming +signals, which must exceed an activation threshold to yield an +output. If the threshold is not overcome, the neuron remains inactive, +i.e. has zero output. + +

+This behaviour has inspired a simple mathematical model for an artificial neuron. + +$$ + y = f\left(\sum_{i=1}^n w_ix_i\right) = f(u) +$$ + +Here, the output \( y \) of the neuron is the value of its activation function, which have as input +a weighted sum of signals \( x_i, \dots ,x_n \) received by \( n \) other neurons. +

+ + +

+









+ +

A simple perceptron model

+ +

+



+ +

+









+ +

Neural network types

+
+ +

+An artificial neural network (NN), is a computational model that consists of layers of connected neurons, or nodes. +It is supposed to mimic a biological nervous system by letting each neuron interact with other neurons +by sending signals in the form of mathematical functions between layers. +A wide variety of different NNs have +been developed, but most of them consist of an input layer, an output layer and eventual layers in-between, called +hidden layers. All layers can contain an arbitrary number of nodes, and each connection between two nodes +is associated with a weight variable. + +

+



+
+ + +

+









+ +

The system: two electrons in a harmonic oscillator trap in two dimensions

+ +

+The Hamiltonian of the quantum dot is given by +$$ \hat{H} = \hat{H}_0 + \hat{V}, +$$ + +where \( \hat{H}_0 \) is the many-body HO Hamiltonian, and \( \hat{V} \) is the +inter-electron Coulomb interactions. In dimensionless units, +$$ \hat{V}= \sum_{i < j}^N \frac{1}{r_{ij}}, +$$ + +with \( r_{ij}=\sqrt{\mathbf{r}_i^2 - \mathbf{r}_j^2} \). + +

+This leads to the separable Hamiltonian, with the relative motion part given by (\( r_{ij}=r \)) +$$ +\hat{H}_r=-\nabla^2_r + \frac{1}{4}\omega^2r^2+ \frac{1}{r}, +$$ + +plus a standard Harmonic Oscillator problem for the center-of-mass motion. +This system has analytical solutions in two and three dimensions (M. Taut 1993 and 1994). + +

+









+ +

Quantum Monte Carlo Motivation

+
+ +

+Given a hamiltonian \( H \) and a trial wave function \( \Psi_T \), the variational principle states that the expectation value of \( \langle H \rangle \), defined through +$$ + \langle E \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})H(\boldsymbol{R})\Psi_T(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})\Psi_T(\boldsymbol{R})}, +$$ + +is an upper bound to the ground state energy \( E_0 \) of the hamiltonian \( H \), that is +$$ + E_0 \le \langle H \rangle . +$$ + +In general, the integrals involved in the calculation of various expectation values are multi-dimensional ones. Traditional integration methods such as the Gauss-Legendre will not be adequate for say the computation of the energy of a many-body system. +

+ + +

+









+ +

Quantum Monte Carlo Motivation

+
+Basic steps. +

+Choose a trial wave function +\( \psi_T(\boldsymbol{R}) \). +$$ + P(\boldsymbol{R},\boldsymbol{\alpha})= \frac{\left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2}{\int \left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2d\boldsymbol{R}}. +$$ + +This is our model, or likelihood/probability distribution function (PDF). It depends on some variational parameters \( \boldsymbol{\alpha} \). +The approximation to the expectation value of the Hamiltonian is now +$$ + \langle E[\boldsymbol{\alpha}] \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})H(\boldsymbol{R})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})}. +$$ +

+ + +

+









+ +

Quantum Monte Carlo Motivation

+
+Define a new quantity. +

+$$ + E_L(\boldsymbol{R},\boldsymbol{\alpha})=\frac{1}{\psi_T(\boldsymbol{R},\boldsymbol{\alpha})}H\psi_T(\boldsymbol{R},\boldsymbol{\alpha}), +$$ + +called the local energy, which, together with our trial PDF yields +$$ + E[\boldsymbol{\alpha}]=\int P(\boldsymbol{R})E_L(\boldsymbol{R},\boldsymbol{\alpha}) d\boldsymbol{R}\approx \frac{1}{N}\sum_{i=1}^NE_L(\boldsymbol{R_i},\boldsymbol{\alpha}) +$$ + +with \( N \) being the number of Monte Carlo samples. +

+ + +

+









+ +

Quantum Monte Carlo

+
+ +

+The Algorithm for performing a variational Monte Carlo calculations runs thus as this + +

+ +Observe that the jumping in space is governed by the variable step. This is often called brute-force sampling. +Need importance sampling to get more relevant sampling. +
+ + +

+









+ +

The trial wave function

+
+ +

+We want to perform a Variational Monte Carlo calculation of the ground state of two electrons in a quantum dot well with different oscillator energies, assuming total spin \( S=0 \). +Our trial wave function has the following form +$$ +\begin{equation} + \psi_{T}(\boldsymbol{r}_1,\boldsymbol{r}_2) = + C\exp{\left(-\alpha_1\omega(r_1^2+r_2^2)/2\right)} + \exp{\left(\frac{r_{12}}{(1+\alpha_2 r_{12})}\right)}, +\label{eq:trial} +\end{equation} +$$ + +where the $\alpha$s represent our variational parameters, two in this case. + +

+Why does the trial function look like this? How did we get there? This will be our main motivation for switching to +Machine Learning. + + +

+ + +

+









+ +

The correlation part of the wave function

+ +

+To find an ansatz for the correlated part of the wave function, it is useful to rewrite the two-particle +local energy in terms of the relative and center-of-mass motion. +Let us denote the distance between the two electrons as +\( r_{12} \). We omit the center-of-mass motion since we are only interested in the case when +\( r_{12} \rightarrow 0 \). The contribution from the center-of-mass (CoM) variable \( {\bf R}_{\mathrm{CoM}} \) +gives only a finite contribution. +We focus only on the terms that are relevant for \( r_{12} \) and for three dimensions. The relevant local energy becomes then +$$ +\lim_{r_{12} \rightarrow 0}E_L(R)= + \frac{1}{{\cal R}_T(r_{12})}\left(2\frac{d^2}{dr_{ij}^2}+\frac{4}{r_{ij}}\frac{d}{dr_{ij}}+ +\frac{2}{r_{ij}}-\frac{l(l+1)}{r_{ij}^2}+2E +\right){\cal R}_T(r_{12}) = 0. +$$ + +Set \( l=0 \) and we have the so-called cusp condition +$$ +\frac{d {\cal R}_T(r_{12})}{dr_{12}} = -\frac{1}{2(l+1)} +{\cal R}_T(r_{12})\qquad r_{12}\to 0 +$$ + +

+









+ +

Resulting ansatz

+The above results in +$$ +{\cal R}_T \propto \exp{(r_{ij}/2)}, +$$ + +for anti-parallel spins and +$$ +{\cal R}_T \propto \exp{(r_{ij}/4)}, +$$ + +for anti-parallel spins. +This is the so-called cusp condition for the relative motion, resulting in a minimal requirement +for the correlation part of the wave fuction. +For general systems containing more than say two electrons, we have this +condition for each electron pair \( ij \). + +

+









+ +

The VMC code

+ +

+ + +

# Importing various packages
+from math import exp, sqrt
+from random import random, seed
+import numpy as np
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import sys
+
+#Trial wave function for quantum dots in two dims
+def WaveFunction(r,alpha,beta):
+    r1 = r[0,0]**2 + r[0,1]**2
+    r2 = r[1,0]**2 + r[1,1]**2
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = r12/(1+beta*r12)
+    return exp(-0.5*alpha*(r1+r2)+deno)
+
+#Local energy  for quantum dots in two dims, using analytical local energy
+def LocalEnergy(r,alpha,beta):
+    
+    r1 = (r[0,0]**2 + r[0,1]**2)
+    r2 = (r[1,0]**2 + r[1,1]**2)
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = 1.0/(1+beta*r12)
+    deno2 = deno*deno
+    return 0.5*(1-alpha*alpha)*(r1 + r2) +2.0*alpha + 1.0/r12+deno2*(alpha*r12-deno2+2*beta*deno-1.0/r12)
+
+# The Monte Carlo sampling with the Metropolis algo
+def MonteCarloSampling():
+
+    NumberMCcycles= 100000
+    StepSize = 1.0
+    # positions
+    PositionOld = np.zeros((NumberParticles,Dimension), np.double)
+    PositionNew = np.zeros((NumberParticles,Dimension), np.double)
+    # seed for rng generator
+    seed()
+    # start variational parameter
+    alpha = 0.9
+    for ia in range(MaxVariations):
+        alpha += .025
+        AlphaValues[ia] = alpha
+        beta = 0.2 
+        for jb in range(MaxVariations):
+            beta += .01
+            BetaValues[jb] = beta
+            energy = energy2 = 0.0
+            DeltaE = 0.0
+            #Initial position
+            for i in range(NumberParticles):
+                for j in range(Dimension):
+                    PositionOld[i,j] = StepSize * (random() - .5)
+            wfold = WaveFunction(PositionOld,alpha,beta)
+
+            #Loop over MC MCcycles
+            for MCcycle in range(NumberMCcycles):
+                #Trial position
+                for i in range(NumberParticles):
+                    for j in range(Dimension):
+                        PositionNew[i,j] = PositionOld[i,j] + StepSize * (random() - .5)
+                wfnew = WaveFunction(PositionNew,alpha,beta)
+
+                #Metropolis test to see whether we accept the move
+                if random() < wfnew**2 / wfold**2:
+                   PositionOld = PositionNew.copy()
+                   wfold = wfnew
+                   DeltaE = LocalEnergy(PositionOld,alpha,beta)
+                energy += DeltaE
+                energy2 += DeltaE**2
+
+            #We calculate mean, variance and error ...
+            energy /= NumberMCcycles
+            energy2 /= NumberMCcycles
+            variance = energy2 - energy**2
+            error = sqrt(variance/NumberMCcycles)
+            Energies[ia,jb] = energy    
+    return Energies, AlphaValues, BetaValues
+
+
+#Here starts the main program with variable declarations
+NumberParticles = 2
+Dimension = 2
+MaxVariations = 10
+Energies = np.zeros((MaxVariations,MaxVariations))
+AlphaValues = np.zeros(MaxVariations)
+BetaValues = np.zeros(MaxVariations)
+(Energies, AlphaValues, BetaValues) = MonteCarloSampling()
+
+# Prepare for plots
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+# Plot the surface.
+X, Y = np.meshgrid(AlphaValues, BetaValues)
+surf = ax.plot_surface(X, Y, Energies,cmap=cm.coolwarm,linewidth=0, antialiased=False)
+# Customize the z axis.
+zmin = np.matrix(Energies).min()
+zmax = np.matrix(Energies).max()
+ax.set_zlim(zmin, zmax)
+ax.set_xlabel(r'$\alpha$')
+ax.set_ylabel(r'$\beta$')
+ax.set_zlabel(r'$\langle E \rangle$')
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+plt.show()
+
+

+









+ +

Technical aspect, improvements and how to define the cost function

+
+ +

+ +

+The above procedure is not the smartest one. Looping over all variational parameters becomes expensive. +Also, we don't use importance sampling and optimizations of the standard deviation (blocking, bootstrap, jackknife). +Such codes are included in the above Github address. + +

+We can also be smarter and use minimization methods to find the optimal variational parameters with fewer Monte Carlo cycles and then +fire up our heavy artillery. + +

+One way to achieve this is to minimize the energy as function of the variational parameters. + + +

+ + +

+









+ +

Energy derivatives

+
+ +

+To find the derivatives of the local energy expectation value as function of the variational parameters, we can use the chain rule and the hermiticity of the Hamiltonian. + +

+Let us define +$$ +\bar{E}_{\alpha_i}=\frac{d\langle E_L\rangle}{d\alpha_i}. +$$ + +as the derivative of the energy with respect to the variational parameter \( \alpha_i \) +We define also the derivative of the trial function (skipping the subindex \( T \)) as +$$ +\bar{\Psi}_{i}=\frac{d\Psi}{d\alpha_i}. +$$ +

+ + +

+









+ +

Derivatives of the local energy

+
+ +

+The elements of the gradient of the local energy are then (using the chain rule and the hermiticity of the Hamiltonian) +$$ +\bar{E}_{i}= 2\left( \langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L \rangle\right). +$$ + +From a computational point of view it means that you need to compute the expectation values of +$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle, +$$ + +and +$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L\rangle +$$ + +These integrals are evaluted using MC intergration (with all its possible error sources). +We can then use methods like stochastic gradient or other minimization methods to find the optimal variational parameters (I don't discuss this topic here, but these methods are very important in ML). +

+ + +

+









+ +

How do we define our cost function?

+
+ +

+We have a model, our likelihood function. + +

+How should we define the cost function? + + +

+ + +

+









+ +

Meet the variance and its derivatives

+
+Why the variance? +

+Suppose the trial function (our model) is the exact wave function. The action of the hamiltionan +on the wave function +$$ + H\Psi = \mathrm{constant}\times \Psi, +$$ + +The integral which defines various +expectation values involving moments of the hamiltonian becomes then +$$ + \langle E^n \rangle = \langle H^n \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})H^n(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}= +\mathrm{constant}\times\frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}=\mathrm{constant}. +$$ + +This gives an important information: If I want the variance, the exact wave function leads to zero variance! +The variance is defined as +$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2. +$$ + +Variation is then performed by minimizing both the energy and the variance. + + +

+ + +

+









+ +

The variance defines the cost function

+
+ +

+We can then take the derivatives of +$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2, +$$ + +with respect to the variational parameters. The derivatives of the variance can then be used to defined the +so-called Hessian matrix, which in turn allows us to use minimization methods like Newton's method or +standard gradient methods. + +

+This leads to however a more complicated expression, with obvious errors when evaluating integrals by Monte Carlo integration. Less used, see however Filippi and Umrigar. The expression becomes complicated +$$ +\bar{E}_{ij} = 2\left[ \langle (\frac{\bar{\Psi}_{ij}}{\Psi}+\frac{\bar{\Psi}_{j}}{\Psi}\frac{\bar{\Psi}_{i}}{\Psi})(E_L-\langle E\rangle)\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\bar{E}_j-\langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\bar{E}_i\right] +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L{_j}\rangle +\langle \frac{\bar{\Psi}_{j}}{\Psi}E_L{_i}\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L{_j}\rangle \langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\langle E_L{_i}\rangle. +$$ + +

+Evaluating the cost function means having to evaluate the above second derivative of the energy. + + +

+ + +

+









+ +

Boltzmann Machines

+ +

+Why use a generative model rather than the more well known discriminative deep neural networks (DNN)? + +

+ +









+ +

Some similarities and differences from DNNs

+ +
    +
  1. Both use gradient-descent based learning procedures for minimizing cost functions
  2. +
  3. Energy based models don't use backpropagation and automatic differentiation for computing gradients, instead turning to Markov Chain Monte Carlo methods.
  4. +
  5. DNNs often have several hidden layers. A restricted Boltzmann machine has only one hidden layer, however several RBMs can be stacked to make up Deep Belief Networks, of which they constitute the building blocks.
  6. +
+ +History: The RBM was developed by amongst others Geoffrey Hinton, called by some the "Godfather of Deep Learning", working with the University of Toronto and Google. + +

+









+ +

The structure of the RBM network

+ +

+



+ +

+









+ +

The network

+ +

+The network layers: + +

    +
  1. A function \( \mathbf{x} \) that represents the visible layer, a vector of \( M \) elements (nodes). This layer represents both what the RBM might be given as training input, and what we want it to be able to reconstruct. This might for example be the pixels of an image, the spin values of the Ising model, or coefficients representing speech.
  2. +
  3. The function \( \mathbf{h} \) represents the hidden, or latent, layer. A vector of \( N \) elements (nodes). Also called "feature detectors".
  4. +
+ +









+ +

Goals

+ +

+The goal of the hidden layer is to increase the model's expressive power. We encode complex interactions between visible variables by introducing additional, hidden variables that interact with visible degrees of freedom in a simple manner, yet still reproduce the complex correlations between visible degrees in the data once marginalized over (integrated out). + +

+Examples of this trick being employed in physics: + +

    +
  1. The Hubbard-Stratonovich transformation
  2. +
  3. The introduction of ghost fields in gauge theory
  4. +
  5. Shadow wave functions in Quantum Monte Carlo simulations
  6. +
+ +The network parameters, to be optimized/learned: + +
    +
  1. \( \mathbf{a} \) represents the visible bias, a vector of same length as \( \mathbf{x} \).
  2. +
  3. \( \mathbf{b} \) represents the hidden bias, a vector of same lenght as \( \mathbf{h} \).
  4. +
  5. \( W \) represents the interaction weights, a matrix of size \( M\times N \).
  6. +
+ +









+ +

Joint distribution and the Energy function

+The restricted Boltzmann machine is described by a Bolztmann distribution +$$ +\begin{align} + P_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}, +\label{_auto1} +\end{align} +$$ + +where \( Z \) is the normalization constant or partition function, defined as +$$ +\begin{align} + Z = \int \int e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})} d\mathbf{x} d\mathbf{h}. +\label{_auto2} +\end{align} +$$ + +It is common to ignore \( T_0 \) by setting it to one. + +

+









+ +

Network Elements

+ +

+The function \( E(\mathbf{x},\mathbf{h}) \) gives the energy of a +configuration (pair of vectors) \( (\mathbf{x}, \mathbf{h}) \). The lower +the energy of a configuration, the higher the probability of it. This +function also depends on the parameters \( \mathbf{a} \), \( \mathbf{b} \) and +\( W \). Thus, when we adjust them during the learning procedure, we are +adjusting the energy function to best fit our problem. + +

+









+ +

Defining different types of RBMs

+There are different variants of RBMs, and the differences lie in the types of visible and hidden units we choose as well as in the implementation of the energy function \( E(\mathbf{x},\mathbf{h}) \). + +

+

+Binary-Binary RBM: +

+ +

+RBMs were first developed using binary units in both the visible and hidden layer. The corresponding energy function is defined as follows: +$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = - \sum_i^M x_i a_i- \sum_j^N b_j h_j - \sum_{i,j}^{M,N} x_i w_{ij} h_j, +\label{_auto3} +\end{align} +$$ + +where the binary values taken on by the nodes are most commonly 0 and 1. +

+ +
+Gaussian-Binary RBM: +

+ +

+Another varient is the RBM where the visible units are Gaussian while the hidden units remain binary: +$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = \sum_i^M \frac{(x_i - a_i)^2}{2\sigma_i^2} - \sum_j^N b_j h_j - \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma_i^2}. +\label{_auto4} +\end{align} +$$ +

+ + +

+









+ +

More about RBMs

+ +
    +
  1. Useful when we model continuous data (i.e., we wish \( \mathbf{x} \) to be continuous)
  2. +
  3. Requires a smaller learning rate, since there's no upper bound to the value a component might take in the reconstruction
  4. +
+ +Other types of units include: + +
    +
  1. Softmax and multinomial units
  2. +
  3. Gaussian visible and hidden units
  4. +
  5. Binomial units
  6. +
  7. Rectified linear units
  8. +
+ +









+ +

Sampling: Metropolis sampling

+In order to sample from the RBM probability distribution it is common to use Markov Chain Monte Carlo (MCMC) algorithms such as Metropolis-Hastings or Gibbs sampling. + +

+Metropolis sampling starts by suggesting a new configuration \( \boldsymbol{x}^{k+1} \). In the brute force method this is done by some random change of the visible units. The new configuration is then accepted with the acceptance probability +$$ +\begin{align} + A(\boldsymbol{x}^k \rightarrow \boldsymbol{x}^{k+1}) = \text{min} (1, \frac{P(\boldsymbol{x}^{k+1})}{P(\boldsymbol{x}^k)}), +\label{_auto5} +\end{align} +$$ + +where we need the marginalized probability +$$ +\begin{align} + P(\boldsymbol{x}) &= \sum_\mathbf{h} P_{rbm}(\mathbf{x}, \mathbf{h}) +\label{_auto6}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\label{_auto7} +\end{align} +$$ + +

+









+ +

Sampling: Gibbs sampling

+ +

+In this method we sample from the joint probability \( P_{rbm} (\mathbf{x}, \mathbf{h}) \) by way of a two step sampling process. We alternately update the visible and hidden units. +New samples are generated according to the conditional probabilities \( P(x_i|\mathbf{h}) \) and \( P(h_j|\mathbf{x}) \) respectively and accepted with the probability of \( 1 \). While the the visible nodes are dependent on the hidden nodes and vice versa, the nodes are independent of other nodes within the same layer. This is due to there being no intra layer interactions in the restricted Boltzmann machine. + +

+The conditional probabilities are often referred to as the activitation functions in the neural networks context due to their role in determining the node outputs. For the binary-binary RBM they are +$$ +\begin{align} + P(h_j = 1 | \boldsymbol{x}) &= \frac{1}{1 + e^{-b_j - \sum_i x_i w_{ij}}} +\label{_auto8}\\ + P(x_i = 1 | \boldsymbol{h}) &= \frac{1}{1 + e^{-a_j - \sum_j h_j w_{ij}}}, +\label{_auto9} +\end{align} +$$ + +where we recognize the logistic sigmoid function \( \sigma (x) = 1/(1+exp(-x)) \). + +

+









+ +

Gaussian RBM

+For the Gaussian-Binary RBM the conditional probabilities are +$$ +\begin{align} + P(x_i|\mathbf{h}) &= \mathcal{N}(x_i; a_i+ \sum_j h_j w_{ij}, \sigma^2) +\label{_auto10}\\ + P(h_j=1|\mathbf{x}) &= \frac{1}{1+e^{-b_j-\frac{1}{\sigma^2} \sum_i x_i w_{ij}}}, +\label{_auto11} +\end{align} +$$ + +while the visible units now follow a normal distribution, we see the hidden units again follow the logistic sigmoid function. + +

+









+ +

Cost function

+ +

+When working with a training dataset, the most common training approach is maximizing the log-likelihood of the training data. The log likelihood characterizes the log-probability of generating the observed data using our generative model. Using this method our cost function is chosen as the negative log-likelihood. The learning then consists of trying to find parameters that maximize the probability of the dataset, and is known as Maximum Likelihood Estimation (MLE). +Denoting the parameters as \( \boldsymbol{\theta} = a_1,...,a_M,b_1,...,b_N,w_{11},...,w_{MN} \), the log-likelihood is given by +$$ +\begin{align} + \mathcal{L}(\{ \theta_i \}) &= \langle \text{log} P_\theta(\boldsymbol{x}) \rangle_{data} +\label{_auto12}\\ + &= - \langle E(\boldsymbol{x}; \{ \theta_i\}) \rangle_{data} - \text{log} Z(\{ \theta_i\}), +\label{_auto13} +\end{align} +$$ + +where we used that the normalization constant does not depend on the data, \( \langle \text{log} Z(\{ \theta_i\}) \rangle = \text{log} Z(\{ \theta_i\}) \) +Our cost function is the negative log-likelihood, \( \mathcal{C}(\{ \theta_i \}) = - \mathcal{L}(\{ \theta_i \}) \) + +

+









+ +

Optimization / Training

+The training procedure of choice often is Stochastic Gradient Descent (SGD). It consists of a series of iterations where we update the parameters according to the equation +$$ +\begin{align} + \boldsymbol{\theta}_{k+1} = \boldsymbol{\theta}_k - \eta \nabla \mathcal{C} (\boldsymbol{\theta}_k) +\label{_auto14} +\end{align} +$$ + +at each \( k \)-th iteration. There are a range of variants of the algorithm which aim at making the learning rate \( \eta \) more adaptive so the method might be more efficient while remaining stable. + +

+We now need the gradient of the cost function in order to minimize it. We find that +$$ +\begin{align} + \frac{\partial \mathcal{C}(\{ \theta_i\})}{\partial \theta_i} + &= \langle \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i} \rangle_{data} + + \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i} +\label{_auto15}\\ + &= \langle O_i(\boldsymbol{x}) \rangle_{data} - \langle O_i(\boldsymbol{x}) \rangle_{model}, +\label{_auto16} +\end{align} +$$ + +where in order to simplify notation we defined the "operator" +$$ +\begin{align} + O_i(\boldsymbol{x}) = \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i}, +\label{_auto17} +\end{align} +$$ + +and used the statistical mechanics relationship between expectation values and the log-partition function: +$$ +\begin{align} + \langle O_i(\boldsymbol{x}) \rangle_{model} = \text{Tr} P_\theta(\boldsymbol{x})O_i(\boldsymbol{x}) = - \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i}. +\label{_auto18} +\end{align} +$$ + +

+ + +

More on RBMs

+ +

+The data-dependent term in the gradient is known as the positive phase of the gradient, while the model-dependent term is known as the negative phase of the gradient. The aim of the training is to lower the energy of configurations that are near observed data points (increasing their probability), and raising the energy of configurations that are far from observed data points (decreasing their probability). + +

+The gradient of the negative log-likelihood cost function of a Binary-Binary RBM is then +$$ +\begin{align} + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial w_{ij}} =& \langle x_i h_j \rangle_{data} - \langle x_i h_j \rangle_{model} +\label{_auto19}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial a_{ij}} =& \langle x_i \rangle_{data} - \langle x_i \rangle_{model} +\label{_auto20}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial b_{ij}} =& \langle h_i \rangle_{data} - \langle h_i \rangle_{model}. +\label{_auto21}\\ +\label{_auto22} +\end{align} +$$ + +To get the expecation values with respect to the data, we set the visible units to each of the observed samples in the training data, then update the hidden units according to the conditional probability found before. We then average over all samples in the training data to calculate expectation values with respect to the data. + +

+









+ +

Which sampling to use

+ +

+To get the expectation values with respect to the model, we use Gibbs sampling. We can either initialize the \( \boldsymbol{x} \) randomly or with a training sample. While we ideally want a large number of Gibbs iterations \( n\rightarrow n \), one might decide to truncate it earlier for efficiency. Doing this while having intialized \( \boldsymbol{x} \) with a training data vector is referred to as contrastive divergence (CD), because one is then closer to approximating the gradient of this function than the negative log-likelihood. The contrastive divergence function is the difference between two Kullback-Leibler divergences (also called relative entropy), which measure how one probability distribution diverges from a second, expected probability distribution (in this case the estimated one from the ground truth one). + +

+









+ +

RBMs for the quantum many body problem

+ +

+The idea of applying RBMs to quantum many body problems was presented by G. Carleo and M. Troyer, working with ETH Zurich and Microsoft Research. + +

+Some of their motivation included + +

+ +









+ +

Choose the right RBM

+ +

+Carleo and Troyer applied the RBM to the quantum mechanical spin lattice systems of the Ising model and Heisenberg model, with encouraging results. Our goal is to test the method on systems of moving particles. For the spin lattice systems it was natural to use a binary-binary RBM, with the nodes taking values of 1 and -1. For moving particles, on the other hand, we want the visible nodes to be continuous, representing position coordinates. Thus, we start by choosing a Gaussian-binary RBM, where the visible nodes are continuous and hidden nodes take on values of 0 or 1. If eventually we would like the hidden nodes to be continuous as well the rectified linear units seem like the most relevant choice. + +

+









+ +

Representing the wave function

+The wavefunction should be a probability amplitude depending on \( \boldsymbol{x} \). The RBM model is given by the joint distribution of \( \boldsymbol{x} \) and \( \boldsymbol{h} \) +$$ +\begin{align} + F_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}. +\label{_auto23} +\end{align} +$$ + +To find the marginal distribution of \( \boldsymbol{x} \) we set: +$$ +\begin{align} + F_{rbm}(\mathbf{x}) &= \sum_\mathbf{h} F_{rbm}(\mathbf{x}, \mathbf{h}) +\label{_auto24}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\label{_auto25} +\end{align} +$$ + +Now this is what we use to represent the wave function, calling it a neural-network quantum state (NQS) +$$ +\begin{align} + \Psi (\mathbf{X}) &= F_{rbm}(\mathbf{x}) +\label{_auto26}\\ + &= \frac{1}{Z}\sum_{\boldsymbol{h}} e^{-E(\mathbf{x}, \mathbf{h})} +\label{_auto27}\\ + &= \frac{1}{Z} \sum_{\{h_j\}} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2} + \sum_j^N b_j h_j + \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma^2}} +\label{_auto28}\\ + &= \frac{1}{Z} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2}} \prod_j^N (1 + e^{b_j + \sum_i^M \frac{x_i w_{ij}}{\sigma^2}}). +\label{_auto29}\\ +\label{_auto30} +\end{align} +$$ + +

+









+ +

Choose the cost function

+Now we don't necessarily have training data (unless we generate it by using some other method). However, what we do have is the variational principle which allows us to obtain the ground state wave function by minimizing the expectation value of the energy of a trial wavefunction (corresponding to the untrained NQS). Similarly to the traditional variational Monte Carlo method then, it is the local energy we wish to minimize. The gradient to use for the stochastic gradient descent procedure is +$$ +\begin{align} + G_i = \frac{\partial \langle E_L \rangle}{\partial \theta_i} + = 2(\langle E_L \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle - \langle E_L \rangle \langle \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle ), +\label{_auto31} +\end{align} +$$ + +where the local energy is given by +$$ +\begin{align} + E_L = \frac{1}{\Psi} \hat{\mathbf{H}} \Psi. +\label{_auto32} +\end{align} +$$ + +

+









+ +

Running the codes

+
+ +

+You can find the codes for the simple two-electron case at the Github repository https://github.com/mhjensenseminars/MachineLearningTalk/tree/master/doc/Programs/MLcpp/src. Python codes to come, only c++ as of now. + +

+The trial wave function is based on the product of a Slater determinant with Gaussian orbitals, a simple Jastrow factor \( \exp{(r_{ij})} \) and the reduced Boltzmann machines. + +

+The Broyden-Fletcher-Goldfarb-Shanno algorithm was used to perform the minimization. We used \( 14 \) hidden nodes in the calculations below. + + +

+ + +

+









+ +

Energy as function of iterations, \( N=2 \) electrons

+
+ +

+



+
+ + +

+









+ +

Energy as function of iterations, \( N=6 \) electrons

+
+ +

+



+
+ + +

+









+ +

Conclusions and where do we stand

+
+ +

+ +

+
+ + +

+ + + + +

+ © 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+ + + + + + diff --git a/doc/pub/BM/html/BM.html b/doc/pub/BM/html/BM.html new file mode 100644 index 000000000..42ad4c72f --- /dev/null +++ b/doc/pub/BM/html/BM.html @@ -0,0 +1,1532 @@ + + + + + + + +Solving quantum mechanical problems with Machine Learning and Boltzmann machines + + + + + + + + + + + + + + + + + + + + + + + +

Solving quantum mechanical problems with Machine Learning and Boltzmann machines

+ +

+ + +

+Morten Hjorth-Jensen +
+ +

+ + +

Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University and Department of Physics, University of Oslo, Norway
+
+

+

Jul 26, 2018

+
+

+









+ +

What is this talk about?

+
+ +

+The main aim is to give you a short and pedestrian introduction to how we can use Machine Learning methods +to solve quantum mechanical many-body problems. And why this could be of interest. + +

+The hope is that after this talk you have gotten the basic ideas to get you started. Peeping into https://github.com/mhjensenseminars/MachineLearningTalk, you'll find a Jupyter notebook, slides, codes etc that will allow you to reproduce the simulations discussed here, and perhaps run your own very first calculations. + +

+Furthermore, since we will also talk about Monte Carlo simulations, the exciting idea of Monte Carlo optimization and Machine Learning can be used to mesh strategies for reducing the curse of dimensionality. + + +

+ + +

+









+ +

Why?

+ +

+How can we avoid the dimensionality curse? Many possibilities + +

    +
  1. smarter basis functions
  2. +
  3. resummation of specific correlations
  4. +
  5. stochastic sampling of high-lying states (stochastic FCI, CC and soon SRG)
  6. +
  7. many more
  8. +
+ +Machine Learning and Quantum Computing hold also great promise in tackling the +ever increasing dimensionalities. Here we will focus on Machine Learning. + +

+









+ +

Overview

+
+ +

+ +

+
+ + +

+









+ +

What are the Machine Learning calculations here based on?

+ +

+This work is inspired by the idea of representing the wave function with +a restricted Boltzmann machine (RBM), presented recently by G. Carleo and M. Troyer, Science 355, Issue 6325, pp. 602-606 (2017). They +named such a wave function/network a neural network quantum state (NQS). In their article they apply it to the quantum mechanical +spin lattice systems of the Ising model and Heisenberg model, with +encouraging results. + +

+Thanks to Vilde Flugsrud and Alfred Alocias Mariadason for many discussions and interpretations of the above paper. + +

+









+ +

A new world

+
+ +

+Machine learning (ML) is an extremely rich field, in spite of its young age. The +increases we have seen during the last three decades in computational +capabilities have been followed by developments of methods and +techniques for analyzing and handling large date sets, relying heavily +on statistics, computer science and mathematics. The field is rather +new and developing rapidly. + +

+Popular software packages written in Python for ML are + +

+ +These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +
+ + +

+









+ +

Lots of room for creativity

+
+ +

+Not all the +algorithms and methods can be given a rigorous mathematical +justification, opening up thereby for experimenting +and trial and error and thereby exciting new developments. +

+ + +

+

+ +

+A solid command of linear algebra, multivariate theory, +probability theory, statistical data analysis, +understanding errors and Monte Carlo methods is important in order to understand many of the +various algorithms and methods. +

+ + +

+

+Job market, a personal statement. +

+A familiarity with ML is almost becoming a prerequisite for many of the most exciting employment +opportunities. Add quantum computing and there you are. +

+ + +

+ + +

Some members of the ML family

+ +

+

+ +

+ +

    +
  1. Linear regression and its variants, in essence polynomial regression
  2. +
  3. Decision tree algorithms, from simpler to more complex ones like random forests
  4. +
  5. Nearest neighbors models
  6. +
  7. Bayesian statistics and regression
  8. +
  9. Support vector machines and finally various variants of
  10. +
  11. Artifical neural networks and deep learning
  12. +
  13. ....
  14. +
+
+ + +

+









+ +

What are the basic ingredients?

+
+ +

+Almost every problem in ML and data science starts with the same ingredients: + +

+ +We seek to minimize the function \( \mathcal{C} (\mathbf{x}, f(\mathbf{\alpha})) \) by finding the parameter values which minimize \( \mathcal{C} \). This leads to various minimization algorithms. +
+ + +

+









+ +

What is Machine Learning?

+
+ +

+Machine learning is the science of giving computers the ability to +learn without being explicitly programmed. The idea is that there +exist generic algorithms which can be used to find patterns in a broad +class of data sets without having to write code specifically for each +problem. The algorithm will build its own logic based on the data. + +

+Machine learning is a subfield of computer science, and is closely +related to computational statistics. It evolved from the study of +pattern recognition in artificial intelligence (AI) research, and has +made contributions to AI tasks like computer vision, natural language +processing and speech recognition. It has also, especially in later +years, found applications in a wide variety of other areas, including +bioinformatics, economy, physics, finance and marketing. + +

+You will notice however that many of the basic ideas discussed do come from Physics! +

+ + +

+









+ +

Types of Machine Learning

+ +

+

+ +

+The approaches to machine learning are many, but are often split into two main categories. +In supervised learning we know the answer to a problem, +and let the computer deduce the logic behind it. On the other hand, unsupervised learning +is a method for finding patterns and relationship in data sets without any prior knowledge of the system. +Some authours also operate with a third category, namely reinforcement learning. This is a paradigm +of learning inspired by behavioural psychology, where learning is achieved by trial-and-error, +solely from rewards and punishment. + +

+Another way to categorize machine learning tasks is to consider the desired output of a system. +Some of the most common tasks are: + +

+
+ + +

+









+ +

References

+
+ +

+ +

+
+ + +

+









+ +

Another interesting article

+ +

+Here we will use so-called reduced Boltzmann Machines to simulate quantum many-body problems. For Monte Carlo aficionados, there is a very close similarity with what are called shadow wave functions, see the work of Pederiva and Kalos and collaborators, Phys Rev. E 90, 053304 (2014). + +

+









+ +

Just for fun illustration of scikit-learn: Hudson bay data

+
+ +

+Most mammalian predators rely on a variety of prey, which complicates mathematical modeling; however, a few predators have become highly specialized and seek almost exclusively a single prey species. An example of this simplified predator-prey interaction is seen in Canadian northern forests, where the populations of the lynx and the snowshoe hare are intertwined in a life and death struggle. + +

+One reason that this particular system has been so extensively studied is that the Hudson Bay company kept careful records of all furs from the early 1800s into the 1900s. The records for the furs collected by the Hudson Bay company showed distinct oscillations (approximately 12 year periods), suggesting that these species caused almost periodic fluctuations of each other's populations. The table here shows data from 1900 to 1920. + + +

+ + +

+









+ +

Hares and lynx in Hudson bay from 1900 to 1920

+ +

+



+ +

+









+ +

Linear regression in Python

+
+ +

+

+ + +

import numpy as np
+import matplotlib.pyplot as plt
+from IPython.display import display
+import sklearn
+from sklearn.linear_model import LinearRegression
+from sklearn.tree import DecisionTreeRegressor
+
+
+data = np.loadtxt('src/Hudson_Bay.csv', delimiter=',', skiprows=1)
+x = data[:,0]
+y = data[:,1]
+line = np.linspace(1900,1920,1000,endpoint=False).reshape(-1,1)
+reg = DecisionTreeRegressor(min_samples_split=3).fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, reg.predict(line), label="decision tree")
+regline = LinearRegression().fit(x.reshape(-1,1),y.reshape(-1,1))
+plt.plot(line, regline.predict(line), label= "Linear Regression")
+plt.plot(x, y, label= "Linear Regression")
+plt.show()
+
+ +
+ + +

+









+ +

Artificial neurons

+
+ +

+ +

+The field of artificial neural networks has a long history of +development, and is closely connected with the advancement of computer +science and computers in general. A model of artificial neurons was +first developed by McCulloch and Pitts in 1943 to study signal +processing in the brain and has later been refined by others. The +general idea is to mimic neural networks in the human brain, which is +composed of billions of neurons that communicate with each other by +sending electrical signals. Each neuron accumulates its incoming +signals, which must exceed an activation threshold to yield an +output. If the threshold is not overcome, the neuron remains inactive, +i.e. has zero output. + +

+This behaviour has inspired a simple mathematical model for an artificial neuron. + +$$ + y = f\left(\sum_{i=1}^n w_ix_i\right) = f(u) +$$ + +Here, the output \( y \) of the neuron is the value of its activation function, which have as input +a weighted sum of signals \( x_i, \dots ,x_n \) received by \( n \) other neurons. +

+ + +

+









+ +

A simple perceptron model

+ +

+



+ +

+









+ +

Neural network types

+
+ +

+An artificial neural network (NN), is a computational model that consists of layers of connected neurons, or nodes. +It is supposed to mimic a biological nervous system by letting each neuron interact with other neurons +by sending signals in the form of mathematical functions between layers. +A wide variety of different NNs have +been developed, but most of them consist of an input layer, an output layer and eventual layers in-between, called +hidden layers. All layers can contain an arbitrary number of nodes, and each connection between two nodes +is associated with a weight variable. + +

+



+
+ + +

+









+ +

The system: two electrons in a harmonic oscillator trap in two dimensions

+ +

+The Hamiltonian of the quantum dot is given by +$$ \hat{H} = \hat{H}_0 + \hat{V}, +$$ + +where \( \hat{H}_0 \) is the many-body HO Hamiltonian, and \( \hat{V} \) is the +inter-electron Coulomb interactions. In dimensionless units, +$$ \hat{V}= \sum_{i < j}^N \frac{1}{r_{ij}}, +$$ + +with \( r_{ij}=\sqrt{\mathbf{r}_i^2 - \mathbf{r}_j^2} \). + +

+This leads to the separable Hamiltonian, with the relative motion part given by (\( r_{ij}=r \)) +$$ +\hat{H}_r=-\nabla^2_r + \frac{1}{4}\omega^2r^2+ \frac{1}{r}, +$$ + +plus a standard Harmonic Oscillator problem for the center-of-mass motion. +This system has analytical solutions in two and three dimensions (M. Taut 1993 and 1994). + +

+









+ +

Quantum Monte Carlo Motivation

+
+ +

+Given a hamiltonian \( H \) and a trial wave function \( \Psi_T \), the variational principle states that the expectation value of \( \langle H \rangle \), defined through +$$ + \langle E \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})H(\boldsymbol{R})\Psi_T(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R})\Psi_T(\boldsymbol{R})}, +$$ + +is an upper bound to the ground state energy \( E_0 \) of the hamiltonian \( H \), that is +$$ + E_0 \le \langle H \rangle . +$$ + +In general, the integrals involved in the calculation of various expectation values are multi-dimensional ones. Traditional integration methods such as the Gauss-Legendre will not be adequate for say the computation of the energy of a many-body system. +

+ + +

+









+ +

Quantum Monte Carlo Motivation

+
+Basic steps. +

+Choose a trial wave function +\( \psi_T(\boldsymbol{R}) \). +$$ + P(\boldsymbol{R},\boldsymbol{\alpha})= \frac{\left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2}{\int \left|\psi_T(\boldsymbol{R},\boldsymbol{\alpha})\right|^2d\boldsymbol{R}}. +$$ + +This is our model, or likelihood/probability distribution function (PDF). It depends on some variational parameters \( \boldsymbol{\alpha} \). +The approximation to the expectation value of the Hamiltonian is now +$$ + \langle E[\boldsymbol{\alpha}] \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})H(\boldsymbol{R})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})} + {\int d\boldsymbol{R}\Psi^{\ast}_T(\boldsymbol{R},\boldsymbol{\alpha})\Psi_T(\boldsymbol{R},\boldsymbol{\alpha})}. +$$ +

+ + +

+









+ +

Quantum Monte Carlo Motivation

+
+Define a new quantity. +

+$$ + E_L(\boldsymbol{R},\boldsymbol{\alpha})=\frac{1}{\psi_T(\boldsymbol{R},\boldsymbol{\alpha})}H\psi_T(\boldsymbol{R},\boldsymbol{\alpha}), +$$ + +called the local energy, which, together with our trial PDF yields +$$ + E[\boldsymbol{\alpha}]=\int P(\boldsymbol{R})E_L(\boldsymbol{R},\boldsymbol{\alpha}) d\boldsymbol{R}\approx \frac{1}{N}\sum_{i=1}^NE_L(\boldsymbol{R_i},\boldsymbol{\alpha}) +$$ + +with \( N \) being the number of Monte Carlo samples. +

+ + +

+









+ +

Quantum Monte Carlo

+
+ +

+The Algorithm for performing a variational Monte Carlo calculations runs thus as this + +

+ +Observe that the jumping in space is governed by the variable step. This is often called brute-force sampling. +Need importance sampling to get more relevant sampling. +
+ + +

+









+ +

The trial wave function

+
+ +

+We want to perform a Variational Monte Carlo calculation of the ground state of two electrons in a quantum dot well with different oscillator energies, assuming total spin \( S=0 \). +Our trial wave function has the following form +$$ +\begin{equation} + \psi_{T}(\boldsymbol{r}_1,\boldsymbol{r}_2) = + C\exp{\left(-\alpha_1\omega(r_1^2+r_2^2)/2\right)} + \exp{\left(\frac{r_{12}}{(1+\alpha_2 r_{12})}\right)}, +\label{eq:trial} +\end{equation} +$$ + +where the $\alpha$s represent our variational parameters, two in this case. + +

+Why does the trial function look like this? How did we get there? This will be our main motivation for switching to +Machine Learning. + + +

+ + +

+









+ +

The correlation part of the wave function

+ +

+To find an ansatz for the correlated part of the wave function, it is useful to rewrite the two-particle +local energy in terms of the relative and center-of-mass motion. +Let us denote the distance between the two electrons as +\( r_{12} \). We omit the center-of-mass motion since we are only interested in the case when +\( r_{12} \rightarrow 0 \). The contribution from the center-of-mass (CoM) variable \( {\bf R}_{\mathrm{CoM}} \) +gives only a finite contribution. +We focus only on the terms that are relevant for \( r_{12} \) and for three dimensions. The relevant local energy becomes then +$$ +\lim_{r_{12} \rightarrow 0}E_L(R)= + \frac{1}{{\cal R}_T(r_{12})}\left(2\frac{d^2}{dr_{ij}^2}+\frac{4}{r_{ij}}\frac{d}{dr_{ij}}+ +\frac{2}{r_{ij}}-\frac{l(l+1)}{r_{ij}^2}+2E +\right){\cal R}_T(r_{12}) = 0. +$$ + +Set \( l=0 \) and we have the so-called cusp condition +$$ +\frac{d {\cal R}_T(r_{12})}{dr_{12}} = -\frac{1}{2(l+1)} +{\cal R}_T(r_{12})\qquad r_{12}\to 0 +$$ + +

+









+ +

Resulting ansatz

+The above results in +$$ +{\cal R}_T \propto \exp{(r_{ij}/2)}, +$$ + +for anti-parallel spins and +$$ +{\cal R}_T \propto \exp{(r_{ij}/4)}, +$$ + +for anti-parallel spins. +This is the so-called cusp condition for the relative motion, resulting in a minimal requirement +for the correlation part of the wave fuction. +For general systems containing more than say two electrons, we have this +condition for each electron pair \( ij \). + +

+









+ +

The VMC code

+ +

+ + +

# Importing various packages
+from math import exp, sqrt
+from random import random, seed
+import numpy as np
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import sys
+
+#Trial wave function for quantum dots in two dims
+def WaveFunction(r,alpha,beta):
+    r1 = r[0,0]**2 + r[0,1]**2
+    r2 = r[1,0]**2 + r[1,1]**2
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = r12/(1+beta*r12)
+    return exp(-0.5*alpha*(r1+r2)+deno)
+
+#Local energy  for quantum dots in two dims, using analytical local energy
+def LocalEnergy(r,alpha,beta):
+    
+    r1 = (r[0,0]**2 + r[0,1]**2)
+    r2 = (r[1,0]**2 + r[1,1]**2)
+    r12 = sqrt((r[0,0]-r[1,0])**2 + (r[0,1]-r[1,1])**2)
+    deno = 1.0/(1+beta*r12)
+    deno2 = deno*deno
+    return 0.5*(1-alpha*alpha)*(r1 + r2) +2.0*alpha + 1.0/r12+deno2*(alpha*r12-deno2+2*beta*deno-1.0/r12)
+
+# The Monte Carlo sampling with the Metropolis algo
+def MonteCarloSampling():
+
+    NumberMCcycles= 100000
+    StepSize = 1.0
+    # positions
+    PositionOld = np.zeros((NumberParticles,Dimension), np.double)
+    PositionNew = np.zeros((NumberParticles,Dimension), np.double)
+    # seed for rng generator
+    seed()
+    # start variational parameter
+    alpha = 0.9
+    for ia in range(MaxVariations):
+        alpha += .025
+        AlphaValues[ia] = alpha
+        beta = 0.2 
+        for jb in range(MaxVariations):
+            beta += .01
+            BetaValues[jb] = beta
+            energy = energy2 = 0.0
+            DeltaE = 0.0
+            #Initial position
+            for i in range(NumberParticles):
+                for j in range(Dimension):
+                    PositionOld[i,j] = StepSize * (random() - .5)
+            wfold = WaveFunction(PositionOld,alpha,beta)
+
+            #Loop over MC MCcycles
+            for MCcycle in range(NumberMCcycles):
+                #Trial position
+                for i in range(NumberParticles):
+                    for j in range(Dimension):
+                        PositionNew[i,j] = PositionOld[i,j] + StepSize * (random() - .5)
+                wfnew = WaveFunction(PositionNew,alpha,beta)
+
+                #Metropolis test to see whether we accept the move
+                if random() < wfnew**2 / wfold**2:
+                   PositionOld = PositionNew.copy()
+                   wfold = wfnew
+                   DeltaE = LocalEnergy(PositionOld,alpha,beta)
+                energy += DeltaE
+                energy2 += DeltaE**2
+
+            #We calculate mean, variance and error ...
+            energy /= NumberMCcycles
+            energy2 /= NumberMCcycles
+            variance = energy2 - energy**2
+            error = sqrt(variance/NumberMCcycles)
+            Energies[ia,jb] = energy    
+    return Energies, AlphaValues, BetaValues
+
+
+#Here starts the main program with variable declarations
+NumberParticles = 2
+Dimension = 2
+MaxVariations = 10
+Energies = np.zeros((MaxVariations,MaxVariations))
+AlphaValues = np.zeros(MaxVariations)
+BetaValues = np.zeros(MaxVariations)
+(Energies, AlphaValues, BetaValues) = MonteCarloSampling()
+
+# Prepare for plots
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+# Plot the surface.
+X, Y = np.meshgrid(AlphaValues, BetaValues)
+surf = ax.plot_surface(X, Y, Energies,cmap=cm.coolwarm,linewidth=0, antialiased=False)
+# Customize the z axis.
+zmin = np.matrix(Energies).min()
+zmax = np.matrix(Energies).max()
+ax.set_zlim(zmin, zmax)
+ax.set_xlabel(r'$\alpha$')
+ax.set_ylabel(r'$\beta$')
+ax.set_zlabel(r'$\langle E \rangle$')
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+plt.show()
+
+

+









+ +

Technical aspect, improvements and how to define the cost function

+
+ +

+ +

+The above procedure is not the smartest one. Looping over all variational parameters becomes expensive. +Also, we don't use importance sampling and optimizations of the standard deviation (blocking, bootstrap, jackknife). +Such codes are included in the above Github address. + +

+We can also be smarter and use minimization methods to find the optimal variational parameters with fewer Monte Carlo cycles and then +fire up our heavy artillery. + +

+One way to achieve this is to minimize the energy as function of the variational parameters. + + +

+ + +

+









+ +

Energy derivatives

+
+ +

+To find the derivatives of the local energy expectation value as function of the variational parameters, we can use the chain rule and the hermiticity of the Hamiltonian. + +

+Let us define +$$ +\bar{E}_{\alpha_i}=\frac{d\langle E_L\rangle}{d\alpha_i}. +$$ + +as the derivative of the energy with respect to the variational parameter \( \alpha_i \) +We define also the derivative of the trial function (skipping the subindex \( T \)) as +$$ +\bar{\Psi}_{i}=\frac{d\Psi}{d\alpha_i}. +$$ +

+ + +

+









+ +

Derivatives of the local energy

+
+ +

+The elements of the gradient of the local energy are then (using the chain rule and the hermiticity of the Hamiltonian) +$$ +\bar{E}_{i}= 2\left( \langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L \rangle\right). +$$ + +From a computational point of view it means that you need to compute the expectation values of +$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L\rangle, +$$ + +and +$$ +\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L\rangle +$$ + +These integrals are evaluted using MC intergration (with all its possible error sources). +We can then use methods like stochastic gradient or other minimization methods to find the optimal variational parameters (I don't discuss this topic here, but these methods are very important in ML). +

+ + +

+









+ +

How do we define our cost function?

+
+ +

+We have a model, our likelihood function. + +

+How should we define the cost function? + + +

+ + +

+









+ +

Meet the variance and its derivatives

+
+Why the variance? +

+Suppose the trial function (our model) is the exact wave function. The action of the hamiltionan +on the wave function +$$ + H\Psi = \mathrm{constant}\times \Psi, +$$ + +The integral which defines various +expectation values involving moments of the hamiltonian becomes then +$$ + \langle E^n \rangle = \langle H^n \rangle = + \frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})H^n(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}= +\mathrm{constant}\times\frac{\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})} + {\int d\boldsymbol{R}\Psi^{\ast}(\boldsymbol{R})\Psi(\boldsymbol{R})}=\mathrm{constant}. +$$ + +This gives an important information: If I want the variance, the exact wave function leads to zero variance! +The variance is defined as +$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2. +$$ + +Variation is then performed by minimizing both the energy and the variance. + + +

+ + +

+









+ +

The variance defines the cost function

+
+ +

+We can then take the derivatives of +$$ +\sigma_E = \langle E^2\rangle - \langle E\rangle^2, +$$ + +with respect to the variational parameters. The derivatives of the variance can then be used to defined the +so-called Hessian matrix, which in turn allows us to use minimization methods like Newton's method or +standard gradient methods. + +

+This leads to however a more complicated expression, with obvious errors when evaluating integrals by Monte Carlo integration. Less used, see however Filippi and Umrigar. The expression becomes complicated +$$ +\bar{E}_{ij} = 2\left[ \langle (\frac{\bar{\Psi}_{ij}}{\Psi}+\frac{\bar{\Psi}_{j}}{\Psi}\frac{\bar{\Psi}_{i}}{\Psi})(E_L-\langle E\rangle)\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\bar{E}_j-\langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\bar{E}_i\right] +\langle \frac{\bar{\Psi}_{i}}{\Psi}E_L{_j}\rangle +\langle \frac{\bar{\Psi}_{j}}{\Psi}E_L{_i}\rangle -\langle \frac{\bar{\Psi}_{i}}{\Psi}\rangle\langle E_L{_j}\rangle \langle \frac{\bar{\Psi}_{j}}{\Psi}\rangle\langle E_L{_i}\rangle. +$$ + +

+Evaluating the cost function means having to evaluate the above second derivative of the energy. + + +

+ + +

+









+ +

Boltzmann Machines

+ +

+Why use a generative model rather than the more well known discriminative deep neural networks (DNN)? + +

+ +









+ +

Some similarities and differences from DNNs

+ +
    +
  1. Both use gradient-descent based learning procedures for minimizing cost functions
  2. +
  3. Energy based models don't use backpropagation and automatic differentiation for computing gradients, instead turning to Markov Chain Monte Carlo methods.
  4. +
  5. DNNs often have several hidden layers. A restricted Boltzmann machine has only one hidden layer, however several RBMs can be stacked to make up Deep Belief Networks, of which they constitute the building blocks.
  6. +
+ +History: The RBM was developed by amongst others Geoffrey Hinton, called by some the "Godfather of Deep Learning", working with the University of Toronto and Google. + +

+









+ +

The structure of the RBM network

+ +

+



+ +

+









+ +

The network

+ +

+The network layers: + +

    +
  1. A function \( \mathbf{x} \) that represents the visible layer, a vector of \( M \) elements (nodes). This layer represents both what the RBM might be given as training input, and what we want it to be able to reconstruct. This might for example be the pixels of an image, the spin values of the Ising model, or coefficients representing speech.
  2. +
  3. The function \( \mathbf{h} \) represents the hidden, or latent, layer. A vector of \( N \) elements (nodes). Also called "feature detectors".
  4. +
+ +









+ +

Goals

+ +

+The goal of the hidden layer is to increase the model's expressive power. We encode complex interactions between visible variables by introducing additional, hidden variables that interact with visible degrees of freedom in a simple manner, yet still reproduce the complex correlations between visible degrees in the data once marginalized over (integrated out). + +

+Examples of this trick being employed in physics: + +

    +
  1. The Hubbard-Stratonovich transformation
  2. +
  3. The introduction of ghost fields in gauge theory
  4. +
  5. Shadow wave functions in Quantum Monte Carlo simulations
  6. +
+ +The network parameters, to be optimized/learned: + +
    +
  1. \( \mathbf{a} \) represents the visible bias, a vector of same length as \( \mathbf{x} \).
  2. +
  3. \( \mathbf{b} \) represents the hidden bias, a vector of same lenght as \( \mathbf{h} \).
  4. +
  5. \( W \) represents the interaction weights, a matrix of size \( M\times N \).
  6. +
+ +









+ +

Joint distribution and the Energy function

+The restricted Boltzmann machine is described by a Bolztmann distribution +$$ +\begin{align} + P_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}, +\label{_auto1} +\end{align} +$$ + +where \( Z \) is the normalization constant or partition function, defined as +$$ +\begin{align} + Z = \int \int e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})} d\mathbf{x} d\mathbf{h}. +\label{_auto2} +\end{align} +$$ + +It is common to ignore \( T_0 \) by setting it to one. + +

+









+ +

Network Elements

+ +

+The function \( E(\mathbf{x},\mathbf{h}) \) gives the energy of a +configuration (pair of vectors) \( (\mathbf{x}, \mathbf{h}) \). The lower +the energy of a configuration, the higher the probability of it. This +function also depends on the parameters \( \mathbf{a} \), \( \mathbf{b} \) and +\( W \). Thus, when we adjust them during the learning procedure, we are +adjusting the energy function to best fit our problem. + +

+









+ +

Defining different types of RBMs

+There are different variants of RBMs, and the differences lie in the types of visible and hidden units we choose as well as in the implementation of the energy function \( E(\mathbf{x},\mathbf{h}) \). + +

+

+Binary-Binary RBM: +

+ +

+RBMs were first developed using binary units in both the visible and hidden layer. The corresponding energy function is defined as follows: +$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = - \sum_i^M x_i a_i- \sum_j^N b_j h_j - \sum_{i,j}^{M,N} x_i w_{ij} h_j, +\label{_auto3} +\end{align} +$$ + +where the binary values taken on by the nodes are most commonly 0 and 1. +

+ +
+Gaussian-Binary RBM: +

+ +

+Another varient is the RBM where the visible units are Gaussian while the hidden units remain binary: +$$ +\begin{align} + E(\mathbf{x}, \mathbf{h}) = \sum_i^M \frac{(x_i - a_i)^2}{2\sigma_i^2} - \sum_j^N b_j h_j - \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma_i^2}. +\label{_auto4} +\end{align} +$$ +

+ + +

+









+ +

More about RBMs

+ +
    +
  1. Useful when we model continuous data (i.e., we wish \( \mathbf{x} \) to be continuous)
  2. +
  3. Requires a smaller learning rate, since there's no upper bound to the value a component might take in the reconstruction
  4. +
+ +Other types of units include: + +
    +
  1. Softmax and multinomial units
  2. +
  3. Gaussian visible and hidden units
  4. +
  5. Binomial units
  6. +
  7. Rectified linear units
  8. +
+ +









+ +

Sampling: Metropolis sampling

+In order to sample from the RBM probability distribution it is common to use Markov Chain Monte Carlo (MCMC) algorithms such as Metropolis-Hastings or Gibbs sampling. + +

+Metropolis sampling starts by suggesting a new configuration \( \boldsymbol{x}^{k+1} \). In the brute force method this is done by some random change of the visible units. The new configuration is then accepted with the acceptance probability +$$ +\begin{align} + A(\boldsymbol{x}^k \rightarrow \boldsymbol{x}^{k+1}) = \text{min} (1, \frac{P(\boldsymbol{x}^{k+1})}{P(\boldsymbol{x}^k)}), +\label{_auto5} +\end{align} +$$ + +where we need the marginalized probability +$$ +\begin{align} + P(\boldsymbol{x}) &= \sum_\mathbf{h} P_{rbm}(\mathbf{x}, \mathbf{h}) +\label{_auto6}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\label{_auto7} +\end{align} +$$ + +

+









+ +

Sampling: Gibbs sampling

+ +

+In this method we sample from the joint probability \( P_{rbm} (\mathbf{x}, \mathbf{h}) \) by way of a two step sampling process. We alternately update the visible and hidden units. +New samples are generated according to the conditional probabilities \( P(x_i|\mathbf{h}) \) and \( P(h_j|\mathbf{x}) \) respectively and accepted with the probability of \( 1 \). While the the visible nodes are dependent on the hidden nodes and vice versa, the nodes are independent of other nodes within the same layer. This is due to there being no intra layer interactions in the restricted Boltzmann machine. + +

+The conditional probabilities are often referred to as the activitation functions in the neural networks context due to their role in determining the node outputs. For the binary-binary RBM they are +$$ +\begin{align} + P(h_j = 1 | \boldsymbol{x}) &= \frac{1}{1 + e^{-b_j - \sum_i x_i w_{ij}}} +\label{_auto8}\\ + P(x_i = 1 | \boldsymbol{h}) &= \frac{1}{1 + e^{-a_j - \sum_j h_j w_{ij}}}, +\label{_auto9} +\end{align} +$$ + +where we recognize the logistic sigmoid function \( \sigma (x) = 1/(1+exp(-x)) \). + +

+









+ +

Gaussian RBM

+For the Gaussian-Binary RBM the conditional probabilities are +$$ +\begin{align} + P(x_i|\mathbf{h}) &= \mathcal{N}(x_i; a_i+ \sum_j h_j w_{ij}, \sigma^2) +\label{_auto10}\\ + P(h_j=1|\mathbf{x}) &= \frac{1}{1+e^{-b_j-\frac{1}{\sigma^2} \sum_i x_i w_{ij}}}, +\label{_auto11} +\end{align} +$$ + +while the visible units now follow a normal distribution, we see the hidden units again follow the logistic sigmoid function. + +

+









+ +

Cost function

+ +

+When working with a training dataset, the most common training approach is maximizing the log-likelihood of the training data. The log likelihood characterizes the log-probability of generating the observed data using our generative model. Using this method our cost function is chosen as the negative log-likelihood. The learning then consists of trying to find parameters that maximize the probability of the dataset, and is known as Maximum Likelihood Estimation (MLE). +Denoting the parameters as \( \boldsymbol{\theta} = a_1,...,a_M,b_1,...,b_N,w_{11},...,w_{MN} \), the log-likelihood is given by +$$ +\begin{align} + \mathcal{L}(\{ \theta_i \}) &= \langle \text{log} P_\theta(\boldsymbol{x}) \rangle_{data} +\label{_auto12}\\ + &= - \langle E(\boldsymbol{x}; \{ \theta_i\}) \rangle_{data} - \text{log} Z(\{ \theta_i\}), +\label{_auto13} +\end{align} +$$ + +where we used that the normalization constant does not depend on the data, \( \langle \text{log} Z(\{ \theta_i\}) \rangle = \text{log} Z(\{ \theta_i\}) \) +Our cost function is the negative log-likelihood, \( \mathcal{C}(\{ \theta_i \}) = - \mathcal{L}(\{ \theta_i \}) \) + +

+









+ +

Optimization / Training

+The training procedure of choice often is Stochastic Gradient Descent (SGD). It consists of a series of iterations where we update the parameters according to the equation +$$ +\begin{align} + \boldsymbol{\theta}_{k+1} = \boldsymbol{\theta}_k - \eta \nabla \mathcal{C} (\boldsymbol{\theta}_k) +\label{_auto14} +\end{align} +$$ + +at each \( k \)-th iteration. There are a range of variants of the algorithm which aim at making the learning rate \( \eta \) more adaptive so the method might be more efficient while remaining stable. + +

+We now need the gradient of the cost function in order to minimize it. We find that +$$ +\begin{align} + \frac{\partial \mathcal{C}(\{ \theta_i\})}{\partial \theta_i} + &= \langle \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i} \rangle_{data} + + \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i} +\label{_auto15}\\ + &= \langle O_i(\boldsymbol{x}) \rangle_{data} - \langle O_i(\boldsymbol{x}) \rangle_{model}, +\label{_auto16} +\end{align} +$$ + +where in order to simplify notation we defined the "operator" +$$ +\begin{align} + O_i(\boldsymbol{x}) = \frac{\partial E(\boldsymbol{x}; \theta_i)}{\partial \theta_i}, +\label{_auto17} +\end{align} +$$ + +and used the statistical mechanics relationship between expectation values and the log-partition function: +$$ +\begin{align} + \langle O_i(\boldsymbol{x}) \rangle_{model} = \text{Tr} P_\theta(\boldsymbol{x})O_i(\boldsymbol{x}) = - \frac{\partial \text{log} Z(\{ \theta_i\})}{\partial \theta_i}. +\label{_auto18} +\end{align} +$$ + +

+ + +

More on RBMs

+ +

+The data-dependent term in the gradient is known as the positive phase of the gradient, while the model-dependent term is known as the negative phase of the gradient. The aim of the training is to lower the energy of configurations that are near observed data points (increasing their probability), and raising the energy of configurations that are far from observed data points (decreasing their probability). + +

+The gradient of the negative log-likelihood cost function of a Binary-Binary RBM is then +$$ +\begin{align} + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial w_{ij}} =& \langle x_i h_j \rangle_{data} - \langle x_i h_j \rangle_{model} +\label{_auto19}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial a_{ij}} =& \langle x_i \rangle_{data} - \langle x_i \rangle_{model} +\label{_auto20}\\ + \frac{\partial \mathcal{C} (w_{ij}, a_i, b_j)}{\partial b_{ij}} =& \langle h_i \rangle_{data} - \langle h_i \rangle_{model}. +\label{_auto21}\\ +\label{_auto22} +\end{align} +$$ + +To get the expecation values with respect to the data, we set the visible units to each of the observed samples in the training data, then update the hidden units according to the conditional probability found before. We then average over all samples in the training data to calculate expectation values with respect to the data. + +

+









+ +

Which sampling to use

+ +

+To get the expectation values with respect to the model, we use Gibbs sampling. We can either initialize the \( \boldsymbol{x} \) randomly or with a training sample. While we ideally want a large number of Gibbs iterations \( n\rightarrow n \), one might decide to truncate it earlier for efficiency. Doing this while having intialized \( \boldsymbol{x} \) with a training data vector is referred to as contrastive divergence (CD), because one is then closer to approximating the gradient of this function than the negative log-likelihood. The contrastive divergence function is the difference between two Kullback-Leibler divergences (also called relative entropy), which measure how one probability distribution diverges from a second, expected probability distribution (in this case the estimated one from the ground truth one). + +

+









+ +

RBMs for the quantum many body problem

+ +

+The idea of applying RBMs to quantum many body problems was presented by G. Carleo and M. Troyer, working with ETH Zurich and Microsoft Research. + +

+Some of their motivation included + +

+ +









+ +

Choose the right RBM

+ +

+Carleo and Troyer applied the RBM to the quantum mechanical spin lattice systems of the Ising model and Heisenberg model, with encouraging results. Our goal is to test the method on systems of moving particles. For the spin lattice systems it was natural to use a binary-binary RBM, with the nodes taking values of 1 and -1. For moving particles, on the other hand, we want the visible nodes to be continuous, representing position coordinates. Thus, we start by choosing a Gaussian-binary RBM, where the visible nodes are continuous and hidden nodes take on values of 0 or 1. If eventually we would like the hidden nodes to be continuous as well the rectified linear units seem like the most relevant choice. + +

+









+ +

Representing the wave function

+The wavefunction should be a probability amplitude depending on \( \boldsymbol{x} \). The RBM model is given by the joint distribution of \( \boldsymbol{x} \) and \( \boldsymbol{h} \) +$$ +\begin{align} + F_{rbm}(\mathbf{x},\mathbf{h}) = \frac{1}{Z} e^{-\frac{1}{T_0}E(\mathbf{x},\mathbf{h})}. +\label{_auto23} +\end{align} +$$ + +To find the marginal distribution of \( \boldsymbol{x} \) we set: +$$ +\begin{align} + F_{rbm}(\mathbf{x}) &= \sum_\mathbf{h} F_{rbm}(\mathbf{x}, \mathbf{h}) +\label{_auto24}\\ + &= \frac{1}{Z}\sum_\mathbf{h} e^{-E(\mathbf{x}, \mathbf{h})}. +\label{_auto25} +\end{align} +$$ + +Now this is what we use to represent the wave function, calling it a neural-network quantum state (NQS) +$$ +\begin{align} + \Psi (\mathbf{X}) &= F_{rbm}(\mathbf{x}) +\label{_auto26}\\ + &= \frac{1}{Z}\sum_{\boldsymbol{h}} e^{-E(\mathbf{x}, \mathbf{h})} +\label{_auto27}\\ + &= \frac{1}{Z} \sum_{\{h_j\}} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2} + \sum_j^N b_j h_j + \sum_{i,j}^{M,N} \frac{x_i w_{ij} h_j}{\sigma^2}} +\label{_auto28}\\ + &= \frac{1}{Z} e^{-\sum_i^M \frac{(x_i - a_i)^2}{2\sigma^2}} \prod_j^N (1 + e^{b_j + \sum_i^M \frac{x_i w_{ij}}{\sigma^2}}). +\label{_auto29}\\ +\label{_auto30} +\end{align} +$$ + +

+









+ +

Choose the cost function

+Now we don't necessarily have training data (unless we generate it by using some other method). However, what we do have is the variational principle which allows us to obtain the ground state wave function by minimizing the expectation value of the energy of a trial wavefunction (corresponding to the untrained NQS). Similarly to the traditional variational Monte Carlo method then, it is the local energy we wish to minimize. The gradient to use for the stochastic gradient descent procedure is +$$ +\begin{align} + G_i = \frac{\partial \langle E_L \rangle}{\partial \theta_i} + = 2(\langle E_L \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle - \langle E_L \rangle \langle \frac{1}{\Psi}\frac{\partial \Psi}{\partial \theta_i} \rangle ), +\label{_auto31} +\end{align} +$$ + +where the local energy is given by +$$ +\begin{align} + E_L = \frac{1}{\Psi} \hat{\mathbf{H}} \Psi. +\label{_auto32} +\end{align} +$$ + +

+









+ +

Running the codes

+
+ +

+You can find the codes for the simple two-electron case at the Github repository https://github.com/mhjensenseminars/MachineLearningTalk/tree/master/doc/Programs/MLcpp/src. Python codes to come, only c++ as of now. + +

+The trial wave function is based on the product of a Slater determinant with Gaussian orbitals, a simple Jastrow factor \( \exp{(r_{ij})} \) and the reduced Boltzmann machines. + +

+The Broyden-Fletcher-Goldfarb-Shanno algorithm was used to perform the minimization. We used \( 14 \) hidden nodes in the calculations below. + + +

+ + +

+









+ +

Energy as function of iterations, \( N=2 \) electrons

+
+ +

+



+
+ + +

+









+ +

Energy as function of iterations, \( N=6 \) electrons

+
+ +

+



+
+ + +

+









+ +

Conclusions and where do we stand

+
+ +

+ +

+
+ + +

+ + + + +

+ © 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
+ + + + + + diff --git a/doc/pub/BM/html/figures/Hudson_Bay_data.pdf b/doc/pub/BM/html/figures/Hudson_Bay_data.pdf new file mode 100644 index 000000000..6a81e9928 Binary files /dev/null and b/doc/pub/BM/html/figures/Hudson_Bay_data.pdf differ diff --git a/doc/pub/BM/html/figures/Hudson_Bay_data.png b/doc/pub/BM/html/figures/Hudson_Bay_data.png new file mode 100644 index 000000000..7c6a56222 Binary files /dev/null and b/doc/pub/BM/html/figures/Hudson_Bay_data.png differ diff --git a/doc/pub/BM/html/figures/MLrbm.pdf b/doc/pub/BM/html/figures/MLrbm.pdf new file mode 100644 index 000000000..d6c37aa6e Binary files /dev/null and b/doc/pub/BM/html/figures/MLrbm.pdf differ diff --git a/doc/pub/BM/html/figures/MLrbm.png b/doc/pub/BM/html/figures/MLrbm.png new file mode 100644 index 000000000..430be4118 Binary files /dev/null and b/doc/pub/BM/html/figures/MLrbm.png differ diff --git a/doc/pub/BM/html/figures/RBM.pdf b/doc/pub/BM/html/figures/RBM.pdf new file mode 100644 index 000000000..50bb768e1 --- /dev/null +++ b/doc/pub/BM/html/figures/RBM.pdf @@ -0,0 +1,1623 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[22 0 R]>>/Type/Catalog>> endobj 47 0 obj <>stream + + + + + application/pdf + + + RBM + + + + + Adobe Illustrator CS3 + 2018-02-16T10:55:58-05:00 + 2018-02-16T10:55:58-05:00 + 2018-02-16T10:55:58-05:00 + + + + 256 + 76 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgATAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXiN2n5tKdMcz30t tJeagGghhuUmih/xBahPrMvqusitZmQw0jTjFy+0tTiq+xvPzF/xDNqtzFqUMtxa6da6xcR2PI2o Se+eaKyT0WW4WNmiHPi54uWrtsVQGhaj+cmleV49PtLOW1TT9DUWFs9rPJM8qWCMCB9Vkj9ZbslO ElwtVH90T8RVZnqV951ttFvRcvf3TaZ5ksEiuoLZ/rFxpQltJrhxFaRgyoBJKjcE3VSDU1wKkmt+ efzBt9R1PUrOC/h8u2ME2ov9ds/SPo2U0ErRKJbW39MXFq0oUNM8leojZSpVQ7eZPzvW3vZTCfUG myXdnCtrJKzySWizoqelaNCZYrl/S4vcAsq/3ZPxEq9ltIZYbWKKadrmWNFWS4kCK0jAULsIwiAn /JAGBVXFXYq7FXyZd/8AORP5iy68mpwzwwWsey6UIw1uUJBo5P7xiafaDA+FM6UdmYhGuve4/iF9 ReWtVfWPLulas8YhfUbO3u2iB5BDPEshUE0rTlTOeyw4ZmPcabwbCV/mT5qu/KnknUtftIY7i5sx F6UUteBaWZIatxINB6laA5ZpcIyZBE9USNB4L+Xn56+fZ/OtjZancpqFnrN7BbSwyIqCH15Fi5Ql AvHjXoag/M1zc6ns/EMZIFGIao5Db6fznm95X+fP5l695M0/TLfRVjS51b6wDeSLzaEQen/dofhL N6vVqgU6eGx7O0scpJl0prnKmO/kP+bnmrzBrR8ua46XqrbyTw37DjOPTKji/H4XHxdaV9zl/aOi hCPHHbyRCZOz3bNO2vnj87Pzl85aT5uu/LeizJp1vp5gZrqNQ80rSQpNRi4ZVUc6UA37mhpm80Gh xygJy3tpnMg09E/JP8wtW86+W7m61WKJLyxnFu00IKrKOCsGKGvFt96bewzB1+mjimBHkWcJWHoe YLN2KsZ/MnVtQ0nyVqV5ps722p0ihsJo0SVxcTzJDEBG6yK9XkA48d+2+Ko7yvr8Ws2MziC5t57K d7K7ivBEJhNCByJ9B5Ijy5A/C1Pl0xVifnrzP5gjOuPpF++nW/lpbMz+lFDNJcz3TKzRMJkl4xpC y/YAYs3UAfEVZf5d8wwa3bXMsdtPZy2dzJZ3NtciMSJLFQn+6eVCCrAghj1wKhbrVNRsPOFlZTSi bTNZilW2QqA8FzbIJCAwHxJLHyPxbqy+B2VT/FXYq7FXYq7FXYq7FXYq7FUNqOmWGpWxtb+BLm2L I7QyCqFo2DryXoQGUGh2xVE4q7FXYq7FXYq+ZvPv5WeWtH87BtOsLm50GJFkv7GOfgRKQ8rRxyMr sEEKhzXelfiA3G0j2rkEa2vva/DFvcPJfm/ylqFha6ZpTGya1iS3h0u5BjmRIkAVFDE8+K0+yx98 1siSSTzLYjfO9r5fu/K99a6/G02lzKqywIWEkj81MSR8CGMhlC8QOpyWLJKEhKPMIIt8/wD5feUv LmgeZV1rzBY3TWNtdRtp0olEi2rmRvq8lwsaI0is0TBXXbkpqu4zOzdpZJx4aAvmwEAH0xbXVtdW 8dzbSpPbyqGimjYMjKehVhUEZrWx5F+eL+WPMNmmkx2smpa3Y+q0FzbycEtdlMwZjVHY8UBSmxpU qSK5Om1M8RuPVjKILf5EeTPK+jpNcGOX/FcavHdmdtliEhjb0FWilOcfFyakMKeFbNVrZ5djtFEY gPUdZ17R9FtvrOp3SW0ZqEDVLuQKkIi1Zz7KMwmb52/May0bzv5mXVrHTLjT4Kr+k9UZqtLDFFzM vobqvC3i5LRtxxrSozP02vniHDziwlAF7x5J8j+X/J+kfo7RUcRSN6s88jl5JZKAc2Oy9B0UAZj5 9RLLK5MgKZBlCXYqlnmHQYtbso7Z7mezeCeK6gubb0jIksLckYCaOaI0PZkOKsA8xaL5g0y7n8ve UmupJbzQ71VlN0I3W+uZw31+Z2eNmlryHNAWDMo2XcFU3vvI2o62srz3M2lW2t29sNbto3ha6jns 94XSRkuYSWFElXpsOLdeSqB1DQdZ8va3aQ6PqF9qc2sy6ldXMNxNbQD1pYI41k/dpaqUibi1AGcC pUHfFU28paD5kmTQL/zL+6utF08Wsdu0guJpLt41iuLqeUFlJYRngAx2YljU0UKzPFXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FWCzQPceX9V8wRJ6lxFqkupQDqXisGFqVHtLbQMB/rYVSzXvKGi2 0kczMsOh3hQ2Opqqutm7nkkUytRXtGJ/dk7xMaKy1BChJY9a120jXVr+UNZ2UU03l+0vmleC5YIR 9YtrlgzmSi1hhuAzcW2beoVThb3y7psujWOrp9SibT20fWbTUB6dY0j9WOblUpIgdHXmjEAv1ril Ipf0vpizraXFzp2jXXI6eJFeJ9X+NeMFEBe2uHWqiRVV5R8RWtTihNIbnQ7C0t7bUwmlarc39sl9 YygRra2dq7XUcMPaSJjBQyIT6jtvuQuKqOq394dWuxYh9Gd5/wBJaHd3EDteyPcII5oba0G7rLJG WcS0py5cehCq2x00390Vv4jL5slkMA0i7c3Bh4UZru9kIAlhUMHSOMLEdgAW3CrL9P8AL+nx+YF0 oA3Fvp+myNeSSbvNPqctHllbu7LbPXwDeFMUpp5LuJm0KOzuGL3elu+n3LHqzWzcEc/8ZI+L/TgV PcVdirsVdirsVdirsVdirsVdirsVdirzrzW3nxvzEs7bRri9tNFu4rGG7u4YVmhiFNSeZl9ZJYUf kluGbjX7IPUDFWKWOufnKmlXl5Kl8NQvJdPlljntnEdrbyacGma2SKzu35fXFMbxiORlFKqOXqYV RWs+Zvzgs7e9uY7e8uL2KT/Q7W2s/wDQpBBZ2srqK2c90wmmnmVeXpD4Kc0YUKqYyXPnu8Gg3U95 q9vci+lTX7CC0CW8Jks5vSiiYWwea39cIvq83C8uRZSAVVSfTtf/ADjTybFJ6V+fMMWmym5sprLk kfp2h+qzRSyQlp7qWYL6sTSNQk/CtN1WT6BrH5gf4n0+z1QXVxp4m1C1mK2ggBjt7idLe8uZWg9F lliSLikUsbVPIK6H4Qr0bFXYq7FUFreorpmjX2otuLO3lnp4+mhan00xVT8vaZ+jvL+n6dJ8T29t HFMTvycIA5P+s1ScVYjo8FzrET+Unr+hdDme11Ofl/vRFG5NtaKR29Hh63/A9zhVAebriTRrW18o 3sTanp2pXVuNKUMrTtBDMkj2bhyKkcQiSMacW3IIqVUD5r8r+YLXy7cXutzfX9Ptomls7Bp2J06R W5xMZH4/WwKBGL/EBXhXFCCtLbzR5xie90ZGn8vwCRNLGqzM0kMtFBmgkRhK0yMG9My/ZH7VSQFU LazXGqea00i/juLjzbaxzrFdXVwLcxyO8bwzL6bMkYhjVqxw8uRP7S1IVT3V21byZqll5g14yavI krQzazGQgeCaMgW5tyeMBWUKylfhbfkQcUski8tau0a+ZYrhG81Sj1SA9bV7dgCtjtt6QX7Ljfn8 femKoryRfpqsutavwaKW4vfq7W0lPUhFrCkRikAJowk9Q/TgVXt/9x/nW5h6Qa3bLcx+H1m0pFL9 LQvF/wACcVZDirsVeYat5787aZcX0dzcaVEljr1lpkrPaT1+oagkZiuF/wBL+Jw0vE9vhY9qYqzL SNV1V9Q1Aag8Uti18bPSDa2s4YLHFzkNzJzmQUkV4+ZCLVfFwuKo3X9f0vQNKm1XVJHisLehmlji lnKhiFBKQrI9Knc02xVLtU822CabqrWdytrfWKiKNtQgmih+tTRerBGBL9X9UtyX4Y3rvTY4qs8i +ddP80aRbyxyqdTS0tLjUrdY5YlRruL1FMfqj442KsFZWYbHeoxVkmKuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxVIfOP76xs9N76nfW1uR4xo/1iYfTDA+KrvMGqXZni0TSWA1a9Us09AwtbcGj3DDx/ ZjU9W9gcVYob220LzD+ivLDQCO4tha3t5cljb29za85jLLJsJpmid2deQaqgsRhVLn06z1zX0tNI iGtS/VJZNR1zUCyxO87COGWIoAzJGElEaw0UHowIJxQsttMi1LzGNI806j+kYdMd2bU7hikNz9XR W+rRxmkMbxhq3BBZmApWnKirei6Vf6nqWqweVboaPBFI8w1NQ4+t212WeBBAQo4o4kVJ/tBQOFR0 VXaTpPlfU7fWtJ1aGLR74TlrIljIENhHxkuIriQL6xWcytJy+Kh+PFUPpema75itrqO4mFybe3dL HR715lcQXMQRb+2uJBzPMhvTEquVHwl1JOKpl5f8wJY6Wl1pkq21xDE76p5YvCYozJb1Fy1g5BC8 XRqqlU8QhrilEeV0MWj22raHV9ctol/xHo7AxSXDSEyuCj8aSK7sYZKUcbVodlU88w6jZ3WhWHmi wf1ItLnS9L0IYQbw3asDuCsTvVT0Zd8CsqBBAINQdwRirsVYX5r/ACzs/MWr3d7PeNBBe6e1lPbI lSZ1WZLe6D8hRoUupaCm5I3+HFUs8wWmr6Dd+Sbe2n1C7eG4vDrF5axXP1eUzW0jSTXccHOBQ95I jr6v2d6GgY4qpeU9a8w+ZY7PS/MFpeyaXqmgRwahNLZmGJ78qwvH5+mgVWV1Cfsv1QFRXFWtS8r+ Yre68taBHqN5PcTR6jLquvJDcC1ll+qiCFbyCGVYyDyUorv/ALr2IqcKodvL3mXyMbXU11dL6Gb9 C6RcW9pp0gmNpp5cOyr6t27s8cshZUTl047jcKzDyHqmvahpt4dct7i3vYr67VFuIRDS3ad2tlQh VWThAUBcV37luWKslxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVhfnXzHZaRrlhcXRBXT7a4uYoSwX nczcYIF5HZRw9Ysx+yoJwqxjR9Q1/X/rMWjRSzLeSc9W1irWoncfCIkmILQ28Q+FVjDSkdfTJLFQ nms+SFtfLwvLtxey6OY7220yJBFYRrbuJJY47f4ubPGHXnIWap7YpQOo+cLePVNVXTpz9e1SaGzs 5YF9WRLS2iFZIoxXnI00sqxL0JBY/CrUUJrD5COr6TFaaypsdPt1rpukwOGMMlDS4uJd/WnqxJH2 K1ryrXFKHOvy6V5osm1vjDfJBLY38qjjHcQAGa1u4x2HON0Za/Cz06EHFVDRNKj82aPZaXeR10a2 /wBL1eQVDT6hcMZ3gjcUZVheUmRlNeXw/wA2KovX9O13TEhuGle8SwJbTtaVC91bCnxRXsaCtxbu NnZBy/a41HLFWPrrGl69ZaxojQxs2q3dnLDbtxlEUl3KsN2YnGzKvAzq69Q9R7KGUax5L1SN47rS Lx5prUEWn1h6XUK/yRXZDl08Y7hXVvEYpYr/AIwfRtUnh12ye0GoApq9myenFchhwNzAgLqs1DSR VdkkH2WL0GKGe+QtRW88tW8frC4ksS1k86kMJBAeMctR19WLhJ/ssCWQ4q7FXEBgQRUHYg9KYqp2 1tb2tvFbW0SQW0CLHDDGoRERBxVVVaBVUCgAxVUxVTntba4CC4iSYROssYkUNxkQ1V1r0ZT0OKqm KuxV2KuxV2KseT8wfJ0kmmImpITrECXOnHhLxeGRWdWZuPGOqxuaOQfhPgcVQ97+Z3km0ktlOqQy w3M0UH1yN0NtH68VxLHI85ZY+B+pSrVWNGFDiqOt/Ofl6W+vrN7uO2exuYbP1J5I445pri3juYxA xb4+STr71xVFf4h0QNqSveRxDSHSLUnlPpJC0kSTLyd+K7xyqag038cVcPMvlwxGUarZmIFQZBcR cavGZl35U+KJS4/yd+mKr7XX9Cu5YYbTUbW4muYhcW8cU0btJCSQJECsSyVU/ENtsVR2KuxVIPPn meTyz5VvdYhgFzdRenDaW7Hir3FxKsEIY9l9SQcvbFXmvnfyb5k0yJPPfmS8tPMx0qNW1bSDbNbw /VVcs4tmWQ8jFzZlEqty7+GFXstsIBbxfV1VYOC+kqDioSnw0G1BTArFPPWu69FqGjeWvL5hg1XX muCb+6QyxW1raKjTyCKo9R/3qqik033xVivlbyzP+XfnHTbG5eDVbDzGZLW21MxGK6trqKJp/SI5 yKYpUjb7NPiG+2FXrOBXmHm/S9R/MHzRfeWbeaHTtK8t+g17qDRGa5ku7qITJFD8UYSNYmVnNTUk Cm2Kpv8Al5e6rp9/qXknVRBJcaFFbzWV9bIYkuLS6MgRpIyz8JVeJg++/XFWcYq8W0Dyjrvm28P5 haLd2egNNJKdBtEtjMrwq7xie6JkC8pt3oibbb8t8KvR/IPmi48yeXI768gW11KCaey1K2jJZEur WVoZeBO/EsnJa9jgVZ+Y97pun+S9Uv8AUNPj1SK2i5RWUoBV5mIjiFT9n43HxDpirA7Tyx56/Lfy vd6/a6la3sVty1HWtAWB0hMKLWYW1w8ksqvHGvwlqhqb4VeuWlzFdWsN1CaxTossZO1VcBh+BwKp apqlhpVhNqGoTC3tLcBpZWBNKkKAAoLMWYgAAVJ2GKpDN+ZPlJPL1xrkd2ZLeBp4Ut3jkguJbm2Q vJbxwzrFI0o4kFeO1DXoaKrYfPmnWS3dnrrums6ZDDcapb2dnezRxpdycIBEyxP6+7cKx1qVY0Wh CqonU/NAstes7USW9xYTTpp96I3BuLS8mQy2/qqCfglWgAIDVZTuDsqyHFXYq7FXYq7FXYq84/5U xpwMxN6J1k1CW8jhuYBLEto9tdQpYEB0ZoUfUJH+1Uj4duuKqcX5PX0c1tdnX/Wv7aS1ljkubZp4 62i36InGW4aRowup8VDyMwEYqzE1xVCD8g9NQwiPU3kgiWOH6vKLhUeBbSztJEc2tzaSMzfUAwq3 AcqFGoMVZHfeR9fk1HzDPp+uRWVr5gkguHT6o73EMtvBDAOE63MY4MtvvSMOKni6mhxVg8P5GNca odMnvbtdMsbYyHUPjjE+oSXc1xDJH++ec+hBcvDI3qAsCPiqDQqzzyd+XsHlvUn1BbhZZZbJLOVE WfiZBd3N3LMHubi7mrK938QaQ7itd6AKy/FXYqlfmjy7YeZNAvNEvi6214gUyRnjJG6sHjkQ9mjd VZfcYqw+68geedbgTRvNHmaC98uI6G5itbP6vdXqRsGEdzL6joqkqOfpqOXTbFXogAAoNgMVY35y 8oTa6dPvtOv20rXtHkeXTNQVBKo9VeMsUsRKh4pVADCoOwIOKpfo3kzzHP5htPMHm/VoNRu9NSRd KsbGBre1geVeEk55vK8krIeIqaKK064qzTFWG675N8wJ5hn8x+UtVh07Ub6KOHVLS9ga4tLn0QRD IQjxOkiKSvIHcdsVRnk/yfc6Nc6jquq6gdW8wau0Zvr30xDGscClYYIIgW4Rx8j3JJNScVZNirz6 LyH530U3On+U/MdvY6BdSyTQ217Zm6msTMxkkFq4ljVl5sSqyKaYqyryn5ZsfLWg22j2bySxwc2k uJjylmmlcySyyHuzuxY4qr+YdCsNf0S90bUFY2d9E0UvA8XFejKezKaMPfFWFXH5f+fdWsBoHmHz TFeeW/hW6MFmYdQu4VI/czzeq0ahgKOyJVt+lcVehxxxxRrHGoSNAFRRsAAKAAYqk3mvy9da3bWK W14tlNY3sN8jyQ/WEYw1orR84+7clPLZgDv0xVgDfl9q318eVH1C9azbS9SuZNWWOdLaa/vr0TRN Ogd7dpYW5v2JDClAMKsv/wAN6jq+p6Pr2oH9GXltGYdW0xOM8dx6UyzQcZQRxEc8fqIeNSrFWAPQ KkPljS/MWr29mL+C7trSPWrrVrj9ISTNLGkM8i2VpCJyZOPERylvsAfCu5PEq9JwK7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FX//2Q== + + + + + + uuid:B356723E9A14E81188E88C6EC4CB6E13 + uuid:5da937a6-fc9b-4248-a315-698c69e6ff3a + + uuid:B256723E9A14E81188E88C6EC4CB6E13 + uuid:B156723E9A14E81188E88C6EC4CB6E13 + + + + Print + + + 1 + False + False + + 460.000000 + 180.000000 + Points + + + + + MyriadPro-Regular + Myriad Pro + Regular + Open Type + Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032 + False + MyriadPro-Regular.otf + + + TimesNewRomanPS-ItalicMT + Times New Roman + Italic + Open Type + Version 5.05 + False + Times New Roman Italic.ttf + + + TimesNewRomanPSMT + Times New Roman + Regular + Open Type + Version 5.05 + False + Times New Roman.ttf + + + Symbol + Symbol + Regular + TrueType + 11.1d1e1 + False + Symbol.ttf + + + + + + Cyan + Magenta + Black + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMYK Red + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMYK Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Green + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMYK Blue + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMYK Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 Y=90 K=10 + CMYK + PROCESS + 14.999998 + 100.000000 + 90.000000 + 10.000002 + + + C=0 M=90 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 35.000004 + 85.000000 + 0.000000 + + + C=5 M=0 Y=90 K=0 + CMYK + PROCESS + 5.000001 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 Y=100 K=0 + CMYK + PROCESS + 19.999998 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 Y=100 K=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 Y=100 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 Y=100 K=10 + CMYK + PROCESS + 85.000000 + 10.000002 + 100.000000 + 10.000002 + + + C=90 M=30 Y=95 K=30 + CMYK + PROCESS + 90.000000 + 30.000002 + 95.000000 + 30.000002 + + + C=75 M=0 Y=75 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 Y=45 K=0 + CMYK + PROCESS + 80.000000 + 10.000002 + 45.000000 + 0.000000 + + + C=70 M=15 Y=0 K=0 + CMYK + PROCESS + 70.000000 + 14.999998 + 0.000000 + 0.000000 + + + C=85 M=50 Y=0 K=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 Y=5 K=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000001 + 0.000000 + + + C=100 M=100 Y=25 K=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 Y=0 K=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 Y=0 K=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 Y=35 K=10 + CMYK + PROCESS + 35.000004 + 100.000000 + 35.000004 + 10.000002 + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000002 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 19.999998 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 39.999996 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 39.999996 + 45.000000 + 50.000000 + 5.000001 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000004 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000000 + 60.000004 + 65.000000 + 39.999996 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 39.999996 + 65.000000 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000002 + 50.000000 + 75.000000 + 10.000002 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000004 + 60.000004 + 80.000000 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 39.999996 + 65.000000 + 90.000000 + 35.000004 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 39.999996 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Print Color Group + 1 + + + + C=0 M=30 Y=70 K=0 + CMYK + PROCESS + 0.000000 + 30.000002 + 70.000000 + 0.000000 + + + C=5 M=70 Y=90 K=0 + CMYK + PROCESS + 5.000001 + 70.000000 + 90.000000 + 0.000000 + + + C=5 M=90 Y=75 K=0 + CMYK + PROCESS + 5.000001 + 90.000000 + 75.000000 + 0.000000 + + + C=30 M=0 Y=95 K=0 + CMYK + PROCESS + 30.000002 + 0.000000 + 95.000000 + 0.000000 + + + C=60 M=5 Y=95 K=0 + CMYK + PROCESS + 60.000004 + 5.000001 + 95.000000 + 0.000000 + + + C=30 M=0 Y=10 K=0 + CMYK + PROCESS + 30.000002 + 0.000000 + 10.000002 + 0.000000 + + + C=60 M=10 Y=5 K=0 + CMYK + PROCESS + 60.000004 + 10.000002 + 5.000001 + 0.000000 + + + C=80 M=5 Y=10 K=0 + CMYK + PROCESS + 80.000000 + 5.000001 + 10.000002 + 0.000000 + + + + + + Grayscale + 1 + + + + K=100 + GRAY + PROCESS + 255 + + + K=90 + GRAY + PROCESS + 229 + + + K=80 + GRAY + PROCESS + 203 + + + K=70 + GRAY + PROCESS + 178 + + + K=60 + GRAY + PROCESS + 152 + + + K=50 + GRAY + PROCESS + 127 + + + K=40 + GRAY + PROCESS + 101 + + + K=30 + GRAY + PROCESS + 76 + + + K=20 + GRAY + PROCESS + 50 + + + K=10 + GRAY + PROCESS + 25 + + + K=5 + GRAY + PROCESS + 12 + + + + + + + + + Adobe PDF library 8.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 2 0 obj <> endobj 22 0 obj <> endobj 23 0 obj [/View/Design] endobj 24 0 obj <>>> endobj 21 0 obj [22 0 R] endobj 5 0 obj <>/ArtBox[8.69482 21.6172 456.34 158.043]/MediaBox[0.0 0.0 460.0 180.0]/Thumb 46 0 R/TrimBox[0.0 0.0 460.0 180.0]/Resources<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page/LastModified(D:20180216105558-05'00')>> endobj 37 0 obj <>stream +HVn0+(p_8Aנ"4خ8.ECRekUԈ`â3~i?a**(-nTKsEAiHnOEAVs|s.dd>stream +8;Yhp_%?bm#ip8bpdkAMOg@0PcqbY3 +0=YAsHN9fb@po~> endstream endobj 25 0 obj <> endobj 28 0 obj <> endobj 30 0 obj <> endobj 26 0 obj <> endobj 32 0 obj <> endobj 33 0 obj [34 0 R] endobj 43 0 obj <>stream +H\j0 ~ +Cq]C`Mv,8(!o? L`-ݴז|v`簰Eq%8oN&*-p +s.xTϦ;qBJP@]Ax3ةus|7 h,UUHPH +w]^]<]7NPvaC~o endstream endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 42 0 obj <>stream +HV TAv eEf|QQE"EEQQ+*1"iRi<#xlRI[k9=솠'm{g DxfW$زג" v|f^K_TkV =qfbvt[#඙x,^Z{~90xyk԰axNުu;*4.]t"/m]k7LeiyYe Vt"~Wʬׁ@8|u03ſ:ZH]Ѱ|9G"RhkcZA$^`עP.6?hD3>Gגe}W@s+|OsDќS4iv+9Es^<9h)iN*ScE_Bx`B)Qd͍ E\'UUTeJ{Ϲv)2~ WPnT#*x>No_C~2V +`Sb6P4NgpbKD?WEY DxRK,R MdoWɢpօodow;W[7SmOz{zZߥ2u><ѹ@E@;б6+:h.Bs>1گ9,]v[{p򻆻%kg2)Go,g;*\ǹ5Џw:F",xT!Ld!;ma)!Н&|RL4+Qp*oBCCU Ìs|pKAjM)+ ӹ9V' 2]o=\ƄR1tJtWp5;WY/%l%OZFJ(9US@jsMDNEP$>$6jPB0fщa}v %ԩo`QDי<毎 +Red&Lpk)p%9։mB=Û +%\:sdH. c! X(9C΃Wg[xzX:Hzp%haԓˢWXz:ޛNܴ޾ȱ|-#W%SESMt0,VT<`u6.hf-vYE +5:hCͳPl*` Cm|֦ + +ߔCbę\fRM$L6HL8Sh4MP'0웚`HT~Q +FQ[bTb܌$%nUI@h33bIYVKAL6/yYZ }d2ణRX-d!e!W@&l'mE&-d1HgkN4ۚMb]}Hiݰd @9/A%[j. /^ĺMP,AqM(QQJ~ H8B*YB_f?Ve n*VTuVtmnAV7>xV[lj-_C1P4^n"?DjjF#GOQ0Eյvu꽣齭F>iF{F3AQQz1~2~WqUz%i$|x0P|GJ0 1Fټ;> HC2X CQ#ebuLgDqS;L[Ās=ܻ;H>mfi>2ST.XX@ Sln=zi欲2D5Ĺmo:^3k21ol4)XX`wdaiϝ̚SU_Zc--[~=ab{tԒ _wyƓw? /Nt(-w`]ߔ7(]n{ELIC-4t]C=XLrdIHI$$BtQ棕]M>Pw;x+-])8Ev峐bq~RoN*(n l26m)}]'> + (+X8I~"GB ȃ[r D+P)ȃP&@QdW( ʳa ][\!3U~ +&*0 BVG6߃T$=4$7 6{✡Yń1O +j$ǩ~XOc=//=LȾbuW%{|6{|,\Rd!`śxͻr+t<p|F YL,>+O 0>m={y"gң@Bs,"e>3&`}uqI_|sB19E89@-H98!0g3)e]> ({B}fzH1'8 p,8A' TS8gb)i,`9XqVB|a?q .ep5k\ ?؄͸[؊_6"n/&|Qa5܌ La'B-LA3ve|+܅$>On܃{ږU543T۶ŭmGLkd@3fy:pV2sjMc+0IUZVM괣)J\M$Tc֩鴪ԫ*<eV=Аce +u1iMz"j&s%ObzGUKxr\3)]Mg:y4ËffzB6qX#K2~8Fbne+%@rSTRIBbq9+ŌLG )rj\KVڲԩFViۃN&t^QUQ?tδvA1D٫HA" +UDT@d}&vo j\5\1u) (+ƅ?09ns޻6$L+N]%pV-~cvk@Za:alBY$[U%[J5xf7фW e&AQVK[4B2[nEˍD236=1i#Ûm-7zs v4# ͦ8V_-=9V?51HS|٠$*0'j +˚|&`.ixQVקJG:+8ql.[⍹lf +^}N5 f1I;nfr j9OLeڐR)d1]LZi4["v[3HIoU(\MhH3ls=!đ9ĐץdU*7S],%"m -;cs +?P͡Tվna2Of$ FWMvlöRY*S -̳T~^RVvTf쎋eg &e-a?Ro/n"]@Տԭ^ۓׁA\In<>RC$!&"$ '#%!&"$?ߓߑߒZ5Klx!_P|OGKCME)Xhh9_ޠףZ^*_||?O9Y||||‘dr_-uC~<P@.y G%?K plj1Q>"kŨAmAN\ìGxяvvYMmH۽lsy/y[&wQ;86ZzmԴ?8iۥ 11plַr[(LޤyDFZn gYzcnd鵢kXgK&bLd+e|d;x1 k9uq[G(^} +lZb"jѷU[^LvZjhɐ+u}SԡeR-,_ [-pؒ~ŐfYJHl /"ȅBj '#s&ggzrfχ ?|O|YKNlR>j52pG2QZ7$YprY S 0QI[._*8bWVηQemڶoWYBEd,$rX!ܣ{d߭> endobj 39 0 obj <>stream +H|R}TUaYiw<;c@ +Yd~TGbowMbDS@az Pt?*DA"XVbt3bNhSi&# j}*g2R:C:f-ҬޒpK ±` İeV b%EV`; + ^Y^@6A/ zyov;pɾ!+]qbK̓@H'pW*D>CRLC$! 95 N-K= Џz.ujFЬ Qm٥ +2!>}ʼn*N QvUnC+Vmݜ:J^tyd[nW4^chogSU5 +mJ9 ۋT))L?^=|,FAzcN8)&Զ$A+n|@n%bN\cD`Q&1Q _hZ]Gu}֫s^Agżֵ6\>eD&ܥyCڇk z{o 7u{ePCA(~BmAoy-# \Z Sk4! EXXp?z鈪LHy(n,QwarPEٗ~\蟗~9Nm^x``-Ue5#:`Q(h:>A/SmX&M;LXK7UyP%Q}YprR Ws+H:dȬ7k?t=f>"iy)s:]0uҿ9wR%T}_2 ˢXt m +zuF@PQ5ŒFI~z?sepLA#崙Hf 0C`bYa)5Ǿb},mIA>3Q]aIJjʪU=g}TWU,wPAuiĽ,MP ſD6^IrO\ !٩t^"o"Vh8A᧪o$hؘUk3k&2%3=uk7K;}t%ߡZE|U*c]cA+t#a`d[P>בS욘WkeUb> rl.❻Tys +rwG՗wj癡n ~0B@' 7n__5E v4ǧ)?(lvTI*Pl;^PP%-,{哞ϋ? > endstream endobj 31 0 obj <> endobj 41 0 obj <>stream +H{TU}省;<""A$j*(X1&iQ[Vk(( YڬDc|5(/]ѥF.7c%Ī1_$jkm>s&]}䏻o͜3sPㆎ=pFx{43eeԞB +/}Xw`p ufbIrgL,s@Z< 21;+c);_l݉NTnW4}ۡS@JZ =6@I*eL/lZAqyYoUeg N+sv{ + +R#r\<0cǛ/U6D, )CArpmK>3j1ox-FcQQ[~*,|k#2}>yhcóS L i"Z%Js F X*@# $y)r^JVA2%Owі%=}` <i3f«Dn) ``T@+7#cHk*SoTz_|?)_fVoQܪP>`}^*)Cˬ}ʗ[(oUQ?V:A!.S)@џ(_fQo}|uTEH6;?"Rf:dNh25IguJ9\j.9MN9\D.*"4˚MsM&rMDnj"4zMAJa##ۚM&&ҠSD5􎹯|w3ft躛 7nFw܌}fDFh kکnn!=_D6 Z{ΰ~ մFgt6gaƋͻ[~WU~'Tꈫ>uQW}};2uU'BE(Dd1XbN6dvN%#@,aܞNꌫκU\U󮺠=:2:ZgVJcX-ev-[JkmMl+3?C w mvQn^_ݵ)]OfoS)gl91VkO_zu Ulfk>>6 oݫ-l>V7"p(E|0W=]5\)E{ղAZ4T} =s:Gi3a38 {`/|_yoR\% +KVc܅ j3X*U.6O+|6|!/Koy1_W|-=_7ͼ]|7+~8?k~_.o#L)Li>3Œ2Xov2]fL1Sͧ~s 32yy{wH&M,COFh+L2Y}e9X#(.qr̖e.ބ+GlCk v5]i0 8` +8gsps!|ƅ%BV/W +Õq-f׃7hq3D>A|OR>g(9 +|_`W#_vew.u|~@R?GnW@(EUIHD"uE( +)Hh!b2A1)Ȥ8 z |SOBRoPrI6$5$ Jl̦U!Dԡ*Oh)U4ٰab܍;UqTiwB\t+W-W.˅ʥ2'c/djekl;e1UeUW^(*uA8H01seeeWk5P5j[NRw˪C}PrMk &ZsRkk)m̪X+YXmV5:úКfr@[ jkoh6(/|UOze^KC&z }У8=QO7L~\/7V6`0!TMy<֞vmbo +z^'d@V^~`Caa7q2#H-XP)93BrU"X$" X$dsjvTrF,zK}@(iJEJn Zplf-%r UYr ,ᦽ[X)=YXv]rk^m=Rr-UMi*t\x-KiEQ>nwej>vIV%]P7V=^=| + sK{ s.p.fn۰|w%~Fiy +4(7 y!yEiI$jW,kofnUhW?kjj +vvpwp6s:;::mΚNtS4KAJ$JB]JtʠLʢlʡ\jE g1Suԉ:S>uԍSH=K &mkE~ԟ +h A4 +PFõniQ,=Gi q4&DDyz2Jh:͠i&D/+*͢4ށUޅ5֙S>ll!lhz*T{jڦ'jjxu&/z\|#Ьcْ|70?I~U~Rc(rxP UvSzBFժ:UBPP8bb{Î<a}Pɽ8d/+8'<\M-q +ŵ fin)K܃_8GO4\Dh&"!)h!"I"]dV"[䊶f+u4EtRt=DOK}D_Ob(P!b&b3JT_p+gX1Q :AD:1N';$;)Nq;NO3)t91yg3M]Ա1. +ʮQmma&۶n`veG uvSTy=O=!UJ uRRՏIU?s+w:`>
֗گZoX,fK RgJCP>煼Ȯe=aS(ְlkW8ڧ:t NI:Y):Ut3@=HօHgl=Du fb.T_=kW}Uߩ}p~p18P'$p . +:܀p n; p/q?'Ddq} qƁj4#:c{ZxORFZF+ѵZUds5u5t9[:[8p6vlp:NtsxwE^Î}]vȱұ#qL.q)9=wo߲5kq>_ɿQu4}֚eS@#kqh49mTevw{&Fj_Zy1_\>> y'}b*s[_}+l6-wWu9JM!n8X k`B&xa$TDp}Xk1<' Q8 3t +ǡcpNI8w;3܃Y3~Lh/~a A0.Q0FX 8! a7&b*4-8q.(DBF\) 5Zq.x+p%՘kp-7&܌[p+n\q]-zci܍{}ˀcY{,q:{q`"VŸ be `<ϥ|!_JG$Qyt.UIw!=DKo#}2P`"Ce 2RFh#ce 2QI#e|#SeJLkں=:[ tC!2Sd̖92WI$|IPRom6C09<,ZBBIEb%J+VU~**c]TUQUR +Rʦj +QX*PpUUUSUjJo4Utf{ܖ"-R ݵR[)m.7kug<ͷW㵼9s$Gq4oȱ7x;wx?|>$䓫rMcy"qSVF)\P^GT +S*JŨ8TJS*K5ԈSjJͨ9ԊZSjK=uԉ:SJݨ;ԋzSK? 4O`BCi 4FhCci4O><Wȿ%/|57&|=_!?)?A)~/7{Hl"Ml'ld6M_B@6M |4]cw6 |Hdt6H$HdHHTHi}` #~Bd? Ȇȁȅȃȇ((6̈́"(b((R(2(r(/9*b@P QUQ Q5Q QuQ  !1)9Z%Z5ڠ-ڡ=:#: tFtE7tGD/FE?i4fLEiͥy4_^ZHh1- + WZ[z$k%LIDz(G33L0431",^~a&DhcbV5QsҜ悹d掹o1MyF9^zk BDA>',_>gB c#>sȍ!Bn /W~O=OW?P?O¼:/܋{^mb^mzۼozw;zǼ w;zt@x{ﱔ8DDBB"c)hK$b*viZ(N-E% Z?Os>_{}5)2L9mΘslΙ_L)3漹`. +Si.*Sm.+檹fWsfn掹+32恓;Ns99bs)Q겺:92_?[ta!c ( zuF/˝:UC0T9(hǨl3{61ߩԫsN^:X8ȒnX!=d,.pppn6snp#Mt[(7mqcX7&)`禺wooo:v8;{}N_V?\uDUqU*T'IUT:.BUKѕbTCtnFgxՎ-$;^1ҎO?hs!1{Av&db[VlK? ]e ]%.3_GhzJZ1:Vq⎽k7ݢ.~͘tt:D$}U_qЃO)zHK:I$Y*%`M*<xyTډ {±9nJ[r6@V7%9 +0`(BXE ^4THD{zb +w߉X]/G&I +bx%#Hw>D4F."0+Q8=$-!Q42o"cD{ħ6Id{e^~4XJۑx1B]1y-Hi{ :T:>(FƑl# +=Cn7?᳟c7{@ D*` mgH lٯ7@7)Wyhadkw$pL0M mp,֣Qʸ}iEٯ{C^%B0 dlz<`4OfM/m} N3J۱(,Ig d/+d)aJLk|S#4a \yv9ȕBZsF|{MR-Wvq6{rq +WJi̺we9N>#{5P͈Hpثb.TuN]b`l@;':V?* tOՁ*o7mt Ycn&>c&!\oˌo,ăhZ7-}2H%b |Y eCo1rnSI|'{SKrEn)&p޵gώt dxnryjFVźS/|"Q&Ę.foE li'p~ wȩõ/}վ~??Ɵ/{©V9O/_ۧuXOK$z^OqrSYYDo2Df:qxlQU V%Ҭd|5ؓYdu\V9y? ev*D)W Pƪ^<21̴Ƹj`WK.2Pm)ǥi^Qd4u)VE:\+8CHB5$uS꽾^*qoX> +X"i=&'%z'F<ۨX3kňRĪX~N 1P-m>jF-QSPfK++{'i7k=|;I 60zE4l4dBe'НX0g'*j/3LG'"[x]Ho#JmG,eQcs gQw+;'ɲel|,[RtJlײƶ'N\82Ο&LJ?&!Li@p8)( C3 0 _h tf! K;ٮ 3n~o=Q{ߡmtL/"ģ"4o{iOvr7ԟpy܄94S>'/5gze$}DFZsB xPդ_"ڐQ" D RfrH~h4R$rIk(C#0Dz)+4 l!XB~R@T,dOl{[s$8l #me,e>^,OȒ HL~}7.Fr&1! [ႊ/n IFE}\a;ȴ[B&j&# `W,/R6 "FƬcM +&c` +Z'E߈9!#D•z_7*Lo-"HyDmcTP@N "O!oDxZMPhT % 8Pa =G}e|8nԭ/9sN:UBcW7Qy42J `a%+ÞPKc"<5uq{W^;~uldp`OXz~/||>|!no1v; 7ܤX(R)h?_'𘻣hoA:WJا?_oJD0|]CX~>kߋdc0,j 8_m$ܢ"x3(O鴰.<8PDhñ4)TvU{Ibyyaۡ7[?@t=lΦ ,"L;Ul $:]O4Ӕj>fcls=ǝO;NNg.3Br1<2˾_T37 u' %zWT~`}|*::HBwO88{#H{=zW"_!tjyoCD0kDYHċ,,vM ) +-rY{`(8՚p*hVUŧ-H尧wޒ_b`b)]Z۵e]9fmfknhx C{yN R}PP8)/ЗX'Лu9FcFgwfRhܘ6Mjǵ[[;8S&vj`vr_qKS>MUaO"ސtkF2VjjYַ1vE%v =MMs$"=4=*1˵D'6U0^~t/D{[yV-ѣMqj,!D5Y<&sL:O!?Ȫ2W*o> L38;a=l$lfL4kY7H6o0,,n9yCtB?R-tN>M2.Dfkw;=#}L)cfSmek,u6,DlUYk3>2M}A!-f䌖㙵>0//jBWpƇp,D"fe5)=bMM[%9-b$%1. rPWh3\ >)slcW>'AvHKxZwEA|Fҿa\@g G=Ӟfڗ%ҬK3o)q@|7ЋsPzE-+ԞQNcADWGyHVd\fEWSk7A?r';?BlzgJNJv׵3L 9M|L,W۷PuRyTp5J~YlzJXpL8Qxq|:]xL.zx.Z)*]jlED¡oz@mQ 06;}g ?TXS k-rTX'O_Kd 'G9"$Y}h#<ǀf_q}ԣq>Oć[J`+`OۀG}{ +8LXy»t_&{ā! ׇɵXs\C&q5z{1mG87q{yD" yޠ9n.ҵ +c{k#ocL/} +5 + b?#]h㜧}q]?lŜU.½F~"\%]0[eRIM׼&?`-acr// +Y\ZQ@ƅ'cYM q_]W? bCPbcLH!HB@ +cf h[:2UjKPa>:6CJm)N)lgݟMB̹>ݳ眅=is\a ̏ݹH{9|xn-#ў)lS k;ȶyl,Eyn{m֡# #>|?uԏH h;Dp*g{؟}??2M4gww%X5ׄ̑ʹFwlq`i +X2Ѷ_ Ao3?d Sn5'|>BaYAwztlQF}⨟ dbphBx{bx~ ;m-iiw H}J_*QwDYҾׄ]@9\>-;g)ƥvi0${1X_Z}C۫-iۨ~{ 8 +0Λc*5T ϝr3j^I8,R'$h&,TnB h??Oۊ|"Wd=$V Km2nGsBѠX͞KJqHc} d_P2e>{%\4?ǽF_ڏS6qs)M1/EyNKfSRR0F*qV5ݙTB9^:4 R[~9bTe5#@;l35(Xx4U@?ngdf0< -JxVamԏ \}_~qo0c7Z~cbl7%#<"2ߋlX7 r;l%Ruhx 緕{Kc~G>|F}Xo!m1sl@;4BehB~4H. *iSs/R_\^3 ՗57?džh] rNպFd;яy8ROA(j'pw{k9[@稥TDYKm%jM쇸׊.~ u+ jZQGd@N`ض`}gη Yv lcyG By\0W+ێ( kNޡUvZiFvxCD^aο;iH~D+q\:sJΣ9?snֲ_8)9w9xGރU&nD}s@*:>s/1(q NA{@6 y4[;nb.4F^CL- +eU !w3v,)k]he ʩU݌v)wl=.[y)thm3w=r'ljGUQnC/L7Z'Z(e~`'9 _tVWm(T٬N ӝ=vg>S(i0Ϝ5=IDΕ9X9`r$=^F9ej/)~$ |X2ݧmb1*.M < ϣd7៳P}9שXUW .Xw=$26ѭnIM:r˟Gi=.IF`چ!YKQixok2eVQ%u*K:N 7;P0^1|2߱7wBYf~7-Q_k ~cNDcyWۨ`AWrZU#bV>?}{v)Ո }uars)Y ne|pB +.`7[oPI5r^?@}xM\'Èo!=Csś'MN\8pnUTWGT8%Q&8=YҽKrA&!]MASqblNtOFxc|rAϸ u%S6F@?5 kO۠$|c +C8/FN16˲,6a} YAN_WztUcGWf٠> +ؠzt6ϾlP?ouKOC>SEti?o/ܰ|$_>} +T^-Bu6JKAi!"2(l2/A錐vdaL2cf$q`6d6a1@}[r|~s=os=ZpG Qw4]$k!y|_Չ ׂyZ+UuV}tR7t>اyaf]UjgaU|QBzw%V!V@>Ð.36cK{Q.*^"*Er_#J` 4LytC.C۔soӍ;RKě;8o^T8=6c옳ZMu.|xY9o.g^_H`*vNq~l,(e*Kb*r>Y8kPn6^r}C9lȲވ@ebsYR6jtMguL5i +I>3zm7&(z{;OXG[=&{{?wTCӺ gg t1·aM#^0+'[ǎz/{yWu`XpU˳U=$l֣Ӡo\bny}|ކMz~la';CYѩne vbS~syqH-ZUi`R-]_ٔnξJtnoyEo֠ckSo22 S:k wН@.#53tj'&(j58J納|6')W8K!c-i#0皦Dc4/{Gڽxz{L[5wy&kx|9&pswX'buZI[ h$D`|s,x9 +܏X{}U:ž1 nؒ Aa^>/e*B ޶klo;}1S}V&+`t$Sc;  kT8? nnOC[)Q&{8NG`hۜ-{AeΞ0I( -XT8}]ƺL3 +pn򠋜XS.zཙx +g%XKs"ȿ2x@{v@H3!; [aU¢/l5Y`eLha_?3cem)AgΧqSYX~U3 i?${(cԂ-H~ewm=ݵTý'4F(ƻQ1ڹLb~VLzcE3B ڻ5]mRd",ԙ#ODc̗u,ݣ5hcdx}y]i챗!GڽT+HYNVp" +W3_v} +~i|ˡV_O1P =uw(>z^C݂Wr݂+@ڀxL;Jg[hޟ$nE` +Z-R7ľ[ُXɱk. 4n=$ XYKN퇳QIָ}[hEfApy%uzY?n1#%l1A\~ױgR 84Y@# p99uvQ>}޷8k*ybNupњ b;҄z*>=uRk~ݹJHh/w=ro:FLI6My6[Ly|nabQ1[Ad2Rn[Ja3Y78!'vߋqrpQ72p^nhwɋ*6&:󞧛Y˰znO`sa?{/o9ʿÍI݅tFr6tz5l}y\~(*/%UxOQN#89 `0 `0 `0 `0 `0 `0 Q *y +Ȧt+ OC~˾EbߦZ}F2MVBJr Zk]~lp-&kߦݧ}7Vƣ,q۬x/i?A=BgPMdNl +39+/_f2xG's|5Ws|5wce*_͡*_͡*_!w?+#e;w$)uG[ʌOLa/g_"\K_~"6DX~V./R Ōx t?̓LMoRɩAj|R O/z-@\R`JE<_,E4!)Մ9h/I¬Ei+CzE4#(o D >ͲBSײ2cXb2S2摠fώ+%R EXMuyݞQ#nA4 I*% ?𭈝69vn섊qn}OoN=dS9*6N9>ӏC7;:y`P ΙjG!w -;PT͒ꮜ*ST&R^u\T9W*K5@2Hv XjJ-Dj˥z*ՕzrR ,nDMrUͥtU﷑rӌ;QotkZwLw^Wo=of UfEYF!9v܏񘀉 x1<ɘ'0ObӘg,f`&fa6XK ˱+2^*װ:zlFl›x o؂xlv.Ƨ ^~Aa|5#83~ 7 TrćcdINS| ,sù|8 /E%\e\\ɗ +Wq5UƵ\s7r[|]nn{|ps?Gp'wq7?g_prK~ů w?G8m9 +I_Ķ&6'Ķm۶m۶m۶m;~EUKk[{GgWwO/!8Ȉ舁؈ Iɐ)i/2"2# "#r"r?A^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4 - +m ] = }111C1 1#1 +1c111 1S1 ӃY9yXEX%XeXXUX5XuA#؀؄؂Į# >!1 )9\%\\5\ -=<#<<3< +;|'||7|/e0g )!aQ1qF Iɘ)i阞֒Y٘9;1yXXEvSY"h8XeXXXXUXX5XXuXX ؘؐMؔ؜-ؚؒmؖ؞ؙؑ]ؕ؝=ؓ؛}ؗ؟88C88#88c8888S88388s88 K˸+k븞[۸;{xxGxx'xxgxxxxWxx7xxwxxO/o_?W\AdPHRhQXSxEPDERdEQTEStPLRlQ\?JDJ$JdJJTJ4JtJ WIEYMٕC9K() + +JJʨʩ**jjꨮꩾZZڨک::zzhihiFhFihi&h&ihifhfihihihiVhVihi6h6ihivhvihi鰎討NN..鲮誮nn鱞詞^^>>鳾諾~~诃9iȎ⨎ᘎ؎㸎 ЉIɜ)ҩi3:3;:;s:s?q^s~pAraqQsqpIriqYsyWpEWreWqUWsupMrmq]s}7pC7rc7qS7sspKrkq[s{wpGwrgwqWwswpOroq_s@`PpHhXxODOdOTOtLl\|/B/b/R/rJjZzoFofoVovNn^~AaQqIiYy_E_e_U_uMm]}?C?c?S?sKk[{GgWwOo m6m۶moٶm۶m?Cp@HBh@FXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ + +JJ ʢʣ** +jj ZZ ڢڣ:: zzcbcbcF"A񘀉ɘ阁٘XXXXXXXX؀؄؂؆؁؅؃؇88888888󸀋˸븁۸xxxxxxxx`  P 0I p H(hX8xLDL$LdLLTL4LtL L,l\<| `AbaaQcq`IbiaYcyV`EVbeVaUVcu`Mbma]c}6`C6bc6aS6cs`Kbka[c{v`GvbgvaWvcw`Oboa_c@`PpH28c8888S88388s88 K˸+k븞[۸;{xxGxx'xxgxxxxWxx7xxwxxO/o_?LB!JF%YaNAIEQMC1KGqO@ HDILɕB)JFiNAIEYMٕC9KGyOU@*B*"*b**R*2*r* +J*jZ:zjFj&jfjjVj6jvjN.n^>~A!a@iFkjk&j&kjkfjfkjkjkjkVjVkjk6j6kjkvjvkj눎꘎NN..늮ꚮnn뉞Ꙟ^^>>닾꛾~~ꟃ9C8C9e;9#8#989c8c9898989S8S989383989s8s989 8]ȅ]E]]%]ʥ]e]]]ɕ]U]]5]˵]u] ȍM-ʭmɝ]=˽}==ȃ=C==# hXxODOdOTOtLl\|/B/b/R/rJjZzoFofoVovNn^~AaQqIiYy_E_e_U_uMm]}?C?c?S?sKk[{GgWwOo\u|Yǁ6 7ܡw%)IqHK ŭ6Y  ++{?;vNVt@GtBtF*.;+;z'za'FE? ]+v` P pHhX B +A I)ijPC=fb0s00 KX&, +*:͈#-H" +i8pdClD6a3`O셽~@qa8GHq q8'Dq +Ni8gLqy8B\q .eWJ\q u7F܄q nmwN܅q}A<cxOI< sx/E +^kxoM{xC| >g_K| w?G ~oO;XN 3+XIvܑ]ٍك=ً;7/?p w ]srsGrGs rwbUxNDNdNTNtXZ`9ٜù\\\¥l26q9Wp%Wq5p-qlf la)Z\VLӡ 70,p#۸{r/}/< Cx(G(|O)>g,|/%W*_|o-w.#~O)?_+~o-?'_+/U:HG$eR.>K@:KT +"EvtCzJ/IzK+ ]dWM*d2JF+KPB*'J 2Q&d"SeLH̐:2Kd̑2OY(d,(ˤI +Y)d.Pp`&RBE; +GK u[tk!piAv^ÚU%B!|?֜57~@M03Fut`NG:NE +sx!omj.|n͗>; +UN' bUX&s%Ѱf +ʗkZNW(*ZkT+U-Thf[2F”3L%L;oLβ9+6F,$l.fD]anFڳJg̜f6lJV!SYbJcmsS:,p՜3+l>U æ=e3\憂ѰM'nRn!gw϶bp2k69_*2 j5kCz>4NsaWiJ>#U:>ьjVkj͘f:344Z?Z?Z?Z?Z?Z?~vn)nQ浟ϥ+Dk-m{oTw|2bV Gnǭl6+,gcs[/Zz.eMal +L{O8rOfR?m9ь{KU +c WQbi#^l"j)[lsmc5:TשfXT3eM?kX7pHSpf[nj6)o7-;a *KWՠTU Z.WUfk2km8 +'uRZ04.-seR\]U"Z"R%JɵFō6FuިTFтhSmmeXڴ+3:E, rP%nWkoW[Bm*)aY3gzƭ0 $v'd !%aF_hh@ۻ3;8WfCyHQ/)]|-ѳoTgմ'}v{;M =YbnɯVir|KWwSq:fOb:OǛ2r3CK14^ {hz?/Inn_}IO ᬝΪ~9w> 'ٌ8t_}'sO~? sO_ $wv2}/]:σ4gA| ~sdeOoϖc}4)~ +~/[_ |/p#7p9 $p#7p#aM>׮]h@hBkA[C{t@b}qg\=Wϸ z3o??;Rw_כ+7ͼ^&yc>m |fNPA#n'pP_/B}P_/K +'Z{t@'~7ebH=~O=E})џO?F4Z AW_|:||UUR*3Ԯl_1Ϊu f]R)śRWétQ5x=f݇}^H b uZx(959W蒞;7 +55CPc39Ѧ&VI`2LϗTu X:KJKPn\(CJP*tD4,]~'uh.h>{:Y(xD;uRu,ce>3qJG^*sNeΩK^*R*w*,R*R*R.KҺ..R.EbѺX.KسYa,ȳp^-Cf +56`;Nh;qN։:WtVQq}cklckt6M޺yjΦt6MgvvMg'XPt ا `0505x>tbyrBѦG3333xBe+^t```111x}}}gҧC0鬝xm鬪UbWUXU*vUŮbWU쪊]UaUŮUª)ZSXPlb7 aq.ő8?1e:kMG1#̈?fT?fYWAN#QH4%*jFe2D Q(C!e222222222222222222222*eTʨQ)RFJ2*eTʨQ+VFZ2jeʨQ+QFF2e4h(QFSni5 +FQQQ222222222222N}N}N}N}|sx{s~\~_~ߒvkvkvy}u<}<^/mvmvOÇ*Gɟfw~8}=.]IRc;5Sc;5Sc;5Sc;5Sc;5Sc;5Sc;5Sc;5}Fm/O]Շp[1mvmvmvmvmvmvu5{7l֨C=PA#r}6m[-~ o[-~ ow;~w;~{=~{=~??G#o7:逎Y}ԡ Mh(|_'mͬa:jZ^n?,O7c빽TƣMhnn<6yG|;!ji\v_ki_vsxkxu{w^|~v}vw=^_<|ݾ15O]FGۿFW_ G7ћVVzkzG|T(w0jlmzk[Φw6lݎ o {#?UwKz<@0]dEoO%\ zآX<$KlꮅT;Vq1t1}asQEu76MMMݝMWwWwWfRIW6Wu_}UfQE+cgj/m\ܨ:5"P7dx]7=gҳuægۥg=.=K'K'7:]:ɍkkflښM[њM[ik6mƑ7mͦٴ5Ѵ5fl\S]!\`\`a6l׆ڰ)ĮصvbvbNډNډ];k'v:k'vĮ3Yݳgu:/)ԵSSrZNrZN]˩k9uʩk9u-)ԵӠpZ8I?tҿ⮓~P_Ckh} A} 55Z_CkP_Ckh} 1 %00WuΧO*C?Ud+x董G%zQN>+W<_仒J+仒䵒J^+yep3 n7fp3g3 ~_/ ~_/ >b0,b0,b0,b0,Va >Lc04Lc04Lc04Lc>c0<c0<c0<1`y 1`y 1`ylx^`y 1`y 1`al3llllo8|cC e0PC e0PC e0PC ex```759%5'Y ˝%5[}k]Czǿ[cb<|AsKk9ĺg``kn%_Bn%+!^ o k]`kl}Bby_cgR}vv v X]]݈uy ޯr!^ b̻:3v ;[c%.w``kl#b3mork!3v u9%5gb;vv v wK]T/ K*o>_})SɧO%J>|*TQɣG%JsVpqq N<;w9NNN~:uӟM799NOOOO;w?_s\ɀ       v,KQ1 Ö- +V=fa&6=Ϻ QU#r#a+GX9šѼ4BJ7Nzҋ}ѻq;nǵP;nǵ3Q;nΩvNsS\;AvPTjU;A=pk{'/y| w~ݿ[gZBWZFi=Eh:3?3?3?3_ ~/_ ~// / / / ++++_+~ůW_+~ůWoooo~o 7~o 7[onzvۭ[o^몟$?I~$I'O$?I~$I'O$?I~$I'O$?I~$Ivov<~&M7o~;~''{➸'{➸'{^{^{^{^xxx88/ |/ }p_///q'q'q'q'rtoint}Zon)RN:.~/~29yT2Oл鼵UCTyќ/ ^Z/woi=E#or7δЅҍ6EŏPC! 0PC! 0ӳN=E0PC! 0P8[G!pQG![8RK!,RK!,RK!,RK!,RK!,RK!,RK!,RK!,RK!,R8[O!<SO!<[80TS!L0TS!L[UU8o!lV[!lV[!lVak}֙ zmv}0mfou~/~|o2MqO36sLLL ]J+h;7si1B-aZq6Fm1+;p}+LZdxJItI z.hqE7XtE7XnnF v[qz]ǣ.2 +nSTJ7m-VǦM:6hjw_fZ4ƏV+Əƫt W11Zhux2ݧU>^>Z?S<=շ1Sh}lcqSX}~V?S9f13l)c31z3㹆E̋ڷY7oFkۨa/z[mcu;WocuTWoկT?<>ՏhT_wS*Q7׏T?ޛ6oT?ޥgn]jOG}i؛iMnvs_Ӱ4a7 iMnCc 7O;;;;~w;~w;''''_(QjE.rtu4?;{{k~6F㬆YK;qw- }h_yvnOGQCr NuպtW+;xeFj˞I) ^FqnXݰa%`ikyVƈ%[kj^-===Q 'X&mv xWk/ɘ.*[櫨QEǫhCH@/&/Yk [kl/\h5ʚ ׸W Hl֛dkp+ǭKյ>W ȣ,.' pp 2 3ΐ6 aČx1-W>gisG-҂Gn枆ZFg[n͊v^딏NN<;IM/bf0Y:+3O+̯uk9YRx*}K+OKK Z{-Z[-h($9e+^m*bHQ_$?.ٯG/qpvUHK0=/Ef_pu?WQ%Qrb_(ffg".?fhf_f,N?Fwyd-;mG~@t z:IB} ? Aʝ"u.ǍfiC߃Mבˬ/5!7!#O,#kAR^SJZ_̇c_dju-bשFe:nj"K&D4bZ@r*)4~w3tM\8ulNΉr?C}WokBl VW ѤwBz,_:>M~],;N_­L_wh_anȈb|+2nR\y~s>GA6Q(r:=j*iwڜ82ˋz5),{mmQS_Ng+=(F:q,6ㆳ+)J@Pdo60*6 +:5 x$aDc$7v>1Uc9e@HcvB4 #HHKrFiZ0lX4U^ z6 lwe\Hڅ L)%r +Ta?d'szՄdDNI|>}"$UC@W/Sݚ/<>y(S.b'b!oi.-t/fqM%^m}FhwqK7wpwkH}Q[iDzr)\s0ٰI䚌?I+.rEI}Rn4&,c(5C*HSAЦM\A4E"*\nm?@?@ "]:tpsusqps*{.p^rL!z+act}~gYVAj +9QIuː=دg~*Qm05uD##c'E[iGvbrf^PXMTΘ͹X̹苡 +j,>eM<~2End4 I#mOKv9NUP-cЯ|,w`J˱4c(c[tg{Jm$sm؇Z+  rkMfZr>C'"e%.8-wd%8vC%kð Jn3d?  endstream endobj 29 0 obj <> endobj 40 0 obj <>stream +H XWǫ_% 3ㅠ( #D.adDT4qn(1jbL-E'|Z8Ҳ%8nqQqv?X-W~"Z2+S\9'xziM UX>wI{|Q8hst){vIbޜI%Х(t*$>Ќ9 %< rB0R ! + ]Yj>L! KЮ$3_>ҭWGKf>6{@!V"0Rq +R&>D@b0O@h}] -t tz 6ٔf]ML tt#!Μa΀ )8;AbhcaLa!>Pa'pWx$HET+I.3 ]a#}I_2[/}ltY5pT0['z6HיHߢwtG u?gAɬGf;KbAˬGޞ7;f^+=dr2#NߘVj|u.t.TйPNJ:Ju"K'B5"Ԥfщ:jщЖ~:t"4@'B["+`lFDhNZu"4X'BDh[ щЧCC9'ڊ +c|K8iljD:0"9NH$'ҙD8 p\[P ‰tDb8nH,'ҝDzp"=9xN$yIDD$s2يI|p>}9~sLie2syssDnDs"N$ʉ cDs"#8tNd$'2`DFs"c88NyNd<#2ȉdr"Y|Ldيp2LNwsA[[`*nw%y!0ڜ{%Z͓ +60Ur +6*d~\ pyB pO(]aTddrLn#4#SLPhUE +\9WTtRFE3f6*cT4Ϩ¨%FE +QB~iCH$kK?V;~?Z\qZX!I(ԺY -"Pd괡ꬡ1E7+<` zC50%@awk03O-D\AfD:o uP uP uP3E*w@{r 3\ѮC{=֒O|a%7YL*T这lRM$aw"MҺ2z>w=^Jb/va_eju[dY60qdS)zNZfb~i](eSwS9C쵐C$`u4UTP+qBֱUTfUKJD"6d>;a}(S(GtqS]؇=x"p_>j6럟 Z[CMf~ZY۴ y*&+vGxl׾CNt=GI;O~ |vsS 6|DQnj 3`Rܼ)Ei%Kg̜U6{ s_,W.ݫ_%/}co|kYUλ7mǭ;vӇ޻o寇||'ǎ8yp)Kd + +BL2l4X!iRJ[9l^ua?=dON318y[ ISS* JU&(eM;[ebOO//ovr8dGG'@G#=p +*Q-QC5RU"B].Tom^uZTϨkDg3řv: őYQ5ƸƤލ}Ӛ›Nƒj1B*seA<+ޓ|4Nқ6@.E[SU [2mdE(\&/ɷ +(%ZQRTK}ď tG'Z $vBjwjV[|hK-EQE}IHvjľ{jbD":~wzN3s{}WktYN"FRs`.EtYk;]]n]eK#. lVCKˬ6Ys)ߓ=hrNU3)Dvl~B$-Ira3̨n`׳}vǮm״kv}OB@^1a*!>kv>H09qL Qv l!q!qk₅[/=ndWf27tv9Hr؎;1h9ccQsnM٬p w sY,L777+MV~TaO$]`|8'm _7Ⲹ$b |+BWUCDexh^ CpZ# Ic8a Ƌb$"bib?PCOhY&!. X `5 Z.^/`3l ~v.-25 >P + +EHP Ʊa8GCI]RP@YpJdW⎸ UO8 g,p.oP*x%p" +*C +L޹p]^܇`Cxq#1<'$x9<L)d2^;^xo--Se:Љ`c&>>h#1>dLTLç Li8g ę̝ly300_c!A@1&Q~*`BT\b܄[p!էԐQcjBM5ԊZSjK=unzj[?$X?:+КiYV5ǚkͳ[ }D unԝzPOܤf6FDi mm+mvnC{iE~:@QtP\tHܤM1t1:N'$t9qK'n?<]]X^sSI7&ݢu R25Ft{AwԝGnXw2$!& UdFH5J67FUOj&Ijij +PXJw=tOK?џ:U~?ӟ/nGUTگ(uPRUQGQuLZR  Op*q:gSx![VLg%X'^+:7)qkY9\eؕݬvg;= Df  [/h+ʮeͳ;^h'e][H^} ܑd+Ò(G4I y %I#'%ERqpi۳|ȗ2_,p.% Ws +Eyr;sYW+y5_iZmLVϬAYaY"&lʕ5|-Y0Y!Yz?J4)?~gjq2%%e yNr9Os-zs=MS9ݝT՛X\GI?xޤ8﫣oscwE?Q3ԗ#qN/zS*H0TS *I4!Wr#w O"o!_*K~TSHTjK=uԉ:SJݨ; + +ԋzSK? 4Jh84FSKhOh*}Jh:͠4fKh>-(ZHh1- +ZIh5H(45MMW3L5KVs\5Ow&(P-RT-S +RRVSQmR*FmV[VMmW;NKV{TOqfʳ:.꒺8sUuM]W7MuKVwT*E42P=Rz9sii*C +ՠ:ԀP jC >4Ch +͠9 +ZCh =t :C +ݠ;  zC ? 0 +`80 +FC މ7)܃8C8{r/}/< Cx('$|%(bE$\/.G>%R@ +J!),ERBJJ))-eU]OS>?g9}^_%}Y_џod}WuNi:]g~/T?uR_Kg 2hc 19LN8Lny߸<k)h +¦)j⦄)iJҦbiva?0͸i13LyST4 0bzzbYrX+`EJX`UձZX`]6F`SlͱV`[lvN`Wݱa0`(^`_qA8PqQ80Xg?x8#q|.©OT1S`V}D5i4Ae@Q41Rc"B 5RI4QSO73h瞙sg㱼7&~S rmKۭUhVUi{ZOۯӚF;>>ii/fVCZ]];.Y!>ُ'' ☨E8!NShggQ]G>C}q)ȺMZչd +/e2χG$u \4le;|ƓUi ]ui4 r/A@b-)͓[o+ ԡm}g|Vw.uRyHy:,Vk:XX^q_|69x^@R._)Xclxu)I35TG,Yȥ\*vJ+;V+ڑK1`4H[t.;ȫx3!KR=:J!:,[̷ʀv]aM2l,x vtH-Kh#9z~ϣ,meoir58a98pR_/D~ܴFBn7hvYQ +;TЇ1|Z;?0Rաj.-W_Zcgnn?Vv7gZd-޶[ +6 |i"'!\LzimY;Cs}qó7:ݧVNivq;x zBb/2)Q!K$8%Ϥk#9YqOK4QH0}xd#Qۉ_t"&DTDT314Wybi"hMoRw^b J[jxI=(ZyAE{ebkD!MU3)ԗonV/Vm5d%1S\ +J*c2DJ ?\ve;i3/WJ 6^p"Wx:۪"q\]Y#)qhHLdݢȠﬕJi²6)m:uT)yʤMۺ[4KaM"{œC"#:"I2GX6AI#kfʅ3(^E@)lJl*sPM1ݗB~Xȥ b)+_؜1ɣG1<)a C =p@Sۧw=ݻuҹShǐiv[H2=1(c„8y=:?=e+SrLy2JGѨXe4CYn_J3ruV`o;`tV]f˓UK5RRe`L13ƼJv$s`" nF_SFfܮNgn\ɩ3&̎1% J5mm9~mT 鞘3yܦ)%_rwNuzmOu^*|+[[c~#C~U*oO<o] +O9`5SK 9֫+yH{<&.2CkVtyҾGr,#9/1(0:$qP$O"$,Ñʜ 71T7t{S uϹq|7/;o$qNJnJ%$kEEv. >sdG m.GJܟfr^#'y͂{ io[ۋۇil/og=Rg@=5mg"._ˍŭ}t9Q崮J\L>KרW5A)HC+~ڗJ'rnbi=K;J:g'\&U,x)57tjG|FU鎃paj1 S {)L-]߄ !ER R¹:1T8eU +B#:.30zR2^^0ZRUJ120idfUg~qkm^imF-0gQv  qѓ3.f.amD(H)sQ~!tR~>48|*}Nx@p?|6AժgE-*]pee| KY.V J[}#'w ?{/C6'!I|Fg{+rI …¢xaM+uaD܅a$Lz: hQTEmGI'1hoo5FE#F6;*j5F)OF|vlpQOel~}Ƕ}|Gʭږ<=rz9F.%Ouv +o֫UѼ~n|_W!w(Fjp +~c961׍7YH +B,RhX*)Ab=,vp]HK*9*ggXn*?TJ >¾R,f7HUB:lOOrhNM缜y*U9+^ROTf6?Oo&Ӓͯ)_\g(~7#໐=$;I*!tdBQcH'y( )AJ$^:fAu}?;/V rp꾋6.K g:չK;9+b}o܋O1ľOj vJQ3hEe`>v91cfy:}Okߌqv! (=} B16AjTs3{ [[ صSqM<`h({Ӏ5&yPk xP_c&vaJka|utwaIav٭e.:蟇y%k|Y9 Snv [CkRi_Px€}ȐB~ _㵰Dah5u3%r#*`ttj@AӋlsyLY.Y[yYo> PgC3)]0ϐQsقJYSq,O-Ŝnw:2:TXSGSF/筆 N nGZآǍd]1Ὤsq:IbB`>?2n||Ḃ ӰN!w5p=YhoQAnћF.?5=hp p|j }ιbK DTH CJ)E1 RA,PJQ@26($tlVN[T(RpW9p(7k}c}ַ}|; xX$^ [|g@|KƘgN@!!gߋĬ}VbKbƷ^l4ˍ/9%< J>[Qw'ii%4HbV֌MD珼OnmOS"j.7߉ V/~%@2Ūé4XޱUB%tg u÷AΘ>ZZ ƪ3;Zumi묱.7H +V[o`i똭:zArD[W kFe(Z#n.V9J;џlW4kܦr$T9xh&Y?^pozvZrhr4._@9v5>q(>_4ӨG0.Vr?oZ[q‘sxCA_f?Vp-w~ + x,N.Qi棁4>BtrU5=T:.>|ߒ&hc5̠w(oa*8砯 ER{5,^%9QMD?BՏK8ú [OKxڧ ObZ|,>To~g"Uq VA%W{q"w+U=G02;j|:7N!9h>)'l2^v_L3Xs=r[ +qάa?*JTy[pw]d}$7DC;$stZ edeMR[-RɋV{ej>OD#R +]C>pi.y~2'hD< x~pqci^h#^'RϠ@>שgY (ڭ{ݴ Ïwz_QZH iTIuOio@-Z4 SOatP +.R%ѯizX}hkjTjJ!/"qy} f"ͻ_or矜[0Hq7^ל R:oKt<[D{.Kxx +.ߍV[L!ߏ'̻gnvk5|;7rVq,{ho}k؉m +Xt5K@)d6x[Xs49Ϸn~^n>>Zp5' ¥g¥g"/#SR4Wj5;R5[pu/Os 1kJ +cU==h-Rkͨ[no,'ڹZg9qC}ZSXəfG\c8k9AU W;!v:dMFbb@$%Pry,pKs qkxiXS;s]V[p__}bu&uy{xPT+@4}dbʁSJcQ _1#5,uv ez rFܝ?PSx uJM{ȑ3Zw9"1vjb?iAN>s9JDJ|em>B\dk +̇)1Cac|# :(vuq\#.Hefd͈1F/_€R- EeF|zrLh[Z 0~ eÚa̲F +sv b~A?:~h܍QROqu;N7/;g߂7AMx$?j : +zOx+̀"Ww7 wd/*x_CWf? lCyAsӠ#y-W#݀Ȝbw?=_z;9XЍKs3;b9~;8? pЖ\0Qց/<x.[Ԏ7;hXֳ UR&o:Ph=W.Z[1>^rC,c=4[爎]BZ7)|El*OMä9Y,tEfŸPDԟ/r˫/\|3X^9]ϹW)F:f]io56|z'Z2ӽ3[rgwtoOkyw9؁o1tm@=0D|ֹMSW3q; y DϖVd-9~;A{)VsG[K_׶*׍ٚb=m\3u-B~v̈́5w= ktyB׶s1Ƌ/+~pM;j<o02/$C}=P%*t|wņZLwi+gȽ@#''Q1v%}ϸhpo/t >4t5!t> +Tus]qD.M^MoOChPߓ6}漡 Q5 '?ae'͝G 3[s.( ypJ +3EFȱܐ6J+ kBf7 s'rnf OS >{M^>*|O:_w=;Gy{ـ ҁn2,ZT8&`8CLٶdҬ[i߯x:YjT-a@o5uD':8[M}~ ߣ|CG7f0u=)Iezn7^Bn|aoXT'[v;P+rY8A34p/X we]S*wAT˘ k92h+g-z[Ý,Π,jIXy`=z@oeTxuOρ?oC8/^^PD^rgCsN_i?QG /sYV*{/`# @ @ @ @ @"\#lH"=\<=\¯C7Q~[t<1)J;40ܥhK4aο:kο:3O1Fr #OO?=2p#˅GyFERVSS w)38~jO?un8 +OOazR嫄#/8i#NZw᭹|s|mmn[p63h8N1':y8)NW4|4|4D3Q7̀,Kv8R PN/`e'Oe7i2c$|QS!l!J(SoΔR!PCbʿލԍժݛFIMcg7Fef:Pz퓢5S6ڛbyK +Pߕ$կiZ"ux*6^KBr ]$BLbORܯb)ݹ&Li{r<Ԭ)ïzZ˧!F*2@ ,Cd 2BF(-cd'(dL2M2Sfd̕yP>cD>ϐB]bRY*d|++dղF)elD*ͲE6.;dݲGr@!9,GH#'䤜Q蜜 rQ.e"W_˯7BZCz-wܓ@_< ȈLȌ,ȊlȎȉ\xyQ +Uk(xo$J!QeQQ&*2*:j&j6.>-4D#4F4E34G D+FE;Gw=`Cp@8z"&z!ND 7<‡>A_ĢcbcbcFbFc b]11 1S1 131 `6`.a>`!>GS|a1K| b[JjwXuX ؈ [ ۱; {~>888'pp .. +W[O=<_O(I!LLLôL¬Wyd>2 Rg!f,X%d_,R eiaYcyV`EJ*jZ:z| ولMٌق-ينmَفo#;3ve7vgF;4Ξ^Qtb4{Mcؗ¡ñ|}NDNdNTNtΐٜY9s9 !?3~/_+~o˸rWrWs ZznF~M-m]=#q?'!1<_O4ѠQӴ-RKhitZz-QˤeֲhYlZv-?ŗmֲm۶m-kqi-۶mݞ{~ALBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@Noȍ<ȋ|ȏ( +OFE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+FE;GtD'tFtE7tGD/FE?  0 (8L$LL4L ,ż_XEX%XeXXkǫkה7`#6a3:_{ކ؁؅؃؇88888888󸀋˸븁۸xxxxxxxx ÈaQ1׸1>0!110)19S0%S150-1=30#3130+1;s0'sZZna^c~`ϭЯfe1g d)fe9gVd%VfVe5Vg d-fe=g6d#6f6e36g d+fe;gvd'vfve7vgd/fe? 0(8N$NN4N ,<\\\¥\\k븞p7r7s Vm]=}>닾꛾~:C:aZvu8wGt$GvGu4Gw t,vu>>>>>>>˾⫾᛾۾㻾~~~~~~~~A d*@@  A b)D тA f+ A a?&;*J~2{ *$--Êp0 }MBF( NL'p]s_>hS46h3g,耎 APsg؋W؇[|~OW_ &,`!=$"6e36g Cy !>̅\\¥\|1>'$Wp%*>g,j>5|/%W*_|o-w[.#n6n.~O)?^~/%>;~#7?'G`5Q +W%ZtБ:JGtNЉ:I'Z֩:M ә:Kg:|+buRP!uU7u׹:OTe*WUR=KGJ.R?]Kt.!aBWj,U+lըVQ4BurTJjRJ+4J5Fc5N5AWi5VzMdM Q7fݢ[uvݡiS5Cwifnݣٚ{5W~=5Oia-"--2-#zTq='B+Vi=gVy zQ/eZW^zSomڠڤڢwPiivhvic}Os}/iF6ʂɘ1<PaE6hL*|~@ Pǀaq~K+YIFoiunV(M&v,a+{#y&>TmTvQe븨r7< +"L[}㸋*~OgwE)]mw3[ +{LAX֓m\]E({}Ч̰Ӫ<v*y,'<X阓랎[+[ƚg;'Rvڑ=:X(JoNJ&|M噊F3a$1*FՉLTF7?NET&,p&7Gfc cö'ȦwvFqmr2LG}>ÀaKw2lhf?`b/+l {kh6.t2g^v՞m,"1>4ϦͰ-sܤw&MV2ΤɨF;+u\>~sK͵k+,k۶Yʸ9 F4ѸZHZWq~}IEct!88{OVNz?zy^Uv'6Ic6i{KXڳ.ޔYAe[}߭oOۻ,'TT6UuvMz"ʪ*o7XU[ l}RvrJ-P g?-Jy\LiODDiWdߓ*eߧWLtD.ZY??]u;6=yxƤͬgwǻzmf7)۴JW}ݗ'>i&5r*ZC=ڢЈI +W +\+p2W +\+= +_೵VjW +_+|W +_W+ +~Ϧk* +~װ +~oo7 |7 |pk5.N`j5n [ío"~$ٛn}1Ep,cX"8Ep,5G@/(.X<<g."E/f"n+bl۾p+e嵮]/s/"/r"eE-bW9wSz)ExY-Emg|my+r"{zWsܾ_;?[W"E8E慸)b[Įλ"^~W|my} /s]^9n+⦈ٮ$̝",I66 A '@ *ǟoSKUr;~|=_{;GLnmv^vov~^oy}{ov~6{^~v~gt.=w~zi襡^7Ӄ&=镣B }4GC }4GC }4GC }4GC_/ }4GC }4Gc?C 3?C 3o 7~o 7~sC =7sC =7sC =7sC =7cC =5BO=!BO=!^i|͵W+W^zEW^zEW^V"+B///¯zmݹ;nws~7nwsݦuƟg|߇fƟ}_ڌ?Ϗ_o_?n>},Ygb={,Xw5w5w5o5o7{nܼ^i3o3of~vvvvv_n~sѺ>c# hB_6Ӄ&=_qWד= }]q=ݓWw]q=9ݓ=9ݓ7\OPuOPuOPuOPuOP w=$Ll?<<|Kwovnu:БmӉt+Nu?????#?#?#?#~~~~~~~~~o 7~o 7~w;~w;?O?O?O?O?3?3?3?3bbbbbbbbbbzV׳gu=++CWů_*~UUWůФ'UWů_*TSOş?*~TQGŏ?*~TQ/Gŏ?*~TQGŏ?*~TQGŏ?*~TQ?)SM7o)~S|K\'O?)~RI'O?)~RI'O?)~RI'O?)~R ނ-x ނo)~SMZ^?c~}8?:<>oxpk~xT?:V`.0{W ~*rn߹_p~}m/[(nsr?\qWtyӉoȜ"s)2Ȝ"s)2Ȝ"s)2Ȝ"s)2Ȝ3/B"t)B"t)B"t)B"t)B"t֫56 +;];x`Xs="~J 5+3a9u sOu>}| )KۋO.me= FQsQ}Y\d$J.2'J9> +KGdT 1۹lNWmRĸ[tiR<s~SPf,8JQ+cҺmV;77Y#Oӡf9sȆ܈Ow֧sТH:J`ٗ YTcO0 d٩LD +τo=?鴝gfo*KLjWWIIIm*V#l׊޻б^6+ SVz +OzVXI"J!6 BT qJ Q_I~ +OguCŚ,,ii1$~;^)mV-I %<~3aeO>I+8R^4[=$.?bգc+^5z+{x\+~HC@lH;\|ǾfokꓤW`3ex;0,x_걔GvK>ظ>J %0}wX6%s <Ɇ4[gLG'$BOeH-ȁH%Dr͑MHOdE3.Gۢh8*Q]Qov2+1hCҏ)FcUC]VDf*HcT{&g)JV%$?MmnKH +.Ɓ*_S{Nbn4 /1|[`*YX|s˲8~l3?̿~kݯU&&sk)j:;9W^(y嘀<Wwq:Ϋ 1>j$!hpkϧ1 A;K1zV 4+Y$'tLKtIK]ɹ$(FaWwq?|\p?ls~3((ʎ()VK{}\;EeGOt_ K2U-Utdl,}>nw0{/v_ rAoa C + +"Yp/>Ib( 8n~x ?#9z#OTѝNz]W3Ay~Rq!&{&vv @M`}ڥl@J sAh3t{dVmc 5m?07n2)d,hČbAD endstream endobj 44 0 obj [/Indexed/DeviceRGB 255 45 0 R] endobj 45 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (pmehta) () %%Title: (RBM.ai) %%CreationDate: 2/16/18 10:55 AM %%BoundingBox: 174 237 697 389 %%HiResBoundingBox: 174.6948 237.6172 696.6953 388.9453 %%DocumentProcessColors: Cyan Magenta Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 406 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_TemplateBox: 396.5 305.5 396.5 305.5 %AI3_TileBox: 108 -50 684 684 %AI3_DocumentPreview: None %AI5_ArtSize: 460 180 %AI5_RulerUnits: 2 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -46 612 1.31 1162 814 18 0 0 50 76 1 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:94 -376 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream +HWْ TPAT +vq[1}~ ݻ9Jr\2!0P̖ZptqqYbRw`+fS$'ϛ*E^v')ciʆ&wl"򗈠̣tn3\ޙv?'^_ 45|b-C[\ +\_@|/S-O3Džk#FL 0F+՞ 2%tqP|y퀢k8z*PGq@XGB݉BuaH~Pv~(}Owv%VvjUڳCєX( +7RwTT]~>;KU]gWn-+asNDBeLGBV6^6WG2:~ .\t(JBTڋ8kPAUn@( #1)!=#zfDDɹ0e +ĵއ"iMP͏s";\L6Zin&j@M ;7㢎-bL`Wƣ_$`@=n=z\ v .Wb\Я^L%yr{5S-o_A‘Vl!_9"!%{ywHm%pr\,B n@J,ł +_A*s] ɍSowa|fl@ZY+?cQewu[e8Bm -E&fĊj3 aP`D!Kcr/q?ܢ#=HO.I_!`6S''ZEtdpƅjump+YV -pi~a +jDe^ay](s9)zYv=[JoX*ɟ9HbLP O((jn{zZJU"bb8H"({i7,@ OT3cnH|rHS|u˰9w=;4B4!IūEy[?gw)Ӯ}lpMKe,hLeR%ܰGK L8hIMy p?n<,"=SO(<Aԯ.?euhV:uNR&ܰI,=\S%; h4H}T4c?y478fu8 bv3 =tO)Vh2|=G, K4oCɕDa){GL3oaްlbyR0*Mpspv~}w|syVO1 6IJފv6&ϬY@,QoQh wyJE\.̳G6:resq=,>\m?ם+j;O(hT5^}ik3)g;(+!xXq)F >hoL]i! bv$˵t&!(qi酶I=9orLm,EOUþj_ GQчRxNd(6YgܕPbTh)g'w^XTآ}?1#|1uuH`QC9RPY ~sQ/LexXP<Ͼ:$kn;6-PLm`j&ձEº_iˏ7(=OG;7}ȋgp?DiM J&ϹA%E$|5V4)W*5i=}3=&r,A*_u-|u8Wlha +|"K_=kNUF~7YNG4Ѩ?vI,:}JAOO5u +) +hVZJ7#_=N߫-,hID,U{+C +2Qt򻻨i p:M1;$"BѰSy{jyzc3oFF/m'zMR|{xh#2L&(gq +"3SO2Wj-,CC\AA҄g5lCPAaE{!ߺ7(0TjF{$^Bɶ`p9:,rZZٛJz]&7CfVK}9?%";Yt gЖgJp& + + 8KEKlU '[@p +$k;PiZ.PrDpSq;:ird5diW1@Jٴj7>A%Fgy-Zu NE`ݖ"=Nڵ_MC-p˂mL x$n +m +aKȪ͟/oj;; t5( Shԇ*1~Kge(ӷg,T : 58PSnufu!z\uZ\3YP=WiˍlXxs~W4`o섽^$!- MB姀*mPR< +.mSy;/9ߘ ޼ua:bCBqңtIS[cxnUU-ӯ*vgx-Y>RO.ܖn)NM]w-پ+oX~E4-Y`wM2fݻ-nXx8?wLO=Ƴ-]OipXSMwZ(KJc=`kGɸOAmb9Z +鯼C^[i+Q I@X QJ-PGZVA?3Lfg&{l֏I3)ikha1 +D0^PHXH8=a`O :& obZ-".|WK8o'I_>yD,0O϶iuG>D R"e夀hp`.7!<]@t}ˌԇ;~eNaWRW}oR}4Gu@j{[83g-ul Q-͊qYi~Jmr"sKVe+V`vßC;QqqiJJs´qaiRդ37+qJ6ك!C{i0;{HjX_pcCQ8tT{sP +2KJ*]}gj@Vzdwl*]+ܤ Wϛ7" 2^*t=yo=/auO?^AA,һ5[ +#;Ё(Q5Iů}zQKqd#*/ +zv$jSp0br2_MSKQ=l48vdҝ}0Q>,_D)+pNf29wh>2R`ٚ༜\Eu[`Js h01 8M$5U1d+h(h-А + +&sJ⹴죹pQtffǤq`%BlXԞ[,8͜H؁eXcQ<9m!wVP7gw*TNxf{\o/:~͊$2.͢`V*`V:-U" <5?h=ݱ8sN!0]b8,(*$ p(]j8N8^ lj+F'OY Q0i&W[,/)җVps'Z[Q1g]aT Ł[l +\Zı85BJVb_U Vr*Rr*iTn?&n>_%2*(fd14rzэ);JVr(cK4ɞtC_xyPJ +2dX9YBZܕ +G Jlǝ,9m +PÈP?`mӄ 8/*S$8f_Tq'wF_؝6K +HiZ(w#4=^3B>7|>?~tƣZݮ~Y_Nà>~؟rBofPo3/؝MكYd5^rNjdwV|YȟO;O~4Jr^<899z̜{ݢTѳ{iP???G N+aZ1]ģ1a$ɣcYNV:&RvGwV O'/7GPV(bK/EQ^q5y|G}Ժk~r}-G*sD +cP(wwWն1M)^U겳ufboo`J+)kk^DȜ*a-s||I ]zFLnzR +L)p+[b0:|YHT:} +nr-$M>ɜ\ +L64&SdL f۩rS4=VRƺx}fls=m?sGa^dwTRvU0=1SiB,.ZIi$)Rd6 Ha2uU ͭKTh,+S&Xr~LQmԘ4U8CMW7/N A悺7N\EWFwWb(QB~+)LJ p.RcJ|d%U>}u/WH:w7K*=]*` !^я=]rgXģ>)5hǞ.K^q/] +Ԗo Rt3E*nV)t(}קbqC5%J,qwqnvlܱe\8~%9Mn92LRUt ޡ}g\A4`i:* %x )Lƣ.XJ*RW[)zw܏I;g@n^ڂ&Vc8+pͿa!tPd,=Tgdr%2̒G.C.#6*\-J)_qݝd6X+)~%K6ޚ3,oZHJW?\5C*'nLR7)>79_>UD̑&g^w2ZRζ?R#' bh  +tvpf`ک>6eO6}8XW'OҒqb@rJl cf:M~^ßY^BgXVu:O _H@ 8ci]hÎoeYQ0mGpň1j/8*[iCh PKhz $אZB 畔 pY`nHJb (:6{Yk^Tvʁ ^8ZXJN].ie0nP¿0LbU%p0p_F){0 +p(8<{؝"ͱhzל7ڷ'C-^9X*'|pЖ0% &RJ^@+؋oM?[rjJܛC yh.ۅ hX#IsBDO.N*&#":{T'&x8cU$zy.(ҭ [c!қjf,(7`{eVa%xS"g\eځml~!Ԫ#fr<G(ރY+jk-o^òbdLk!&:NC)0ø]JԗoV1$SDX[I}K"L\ +.H` +ROyg4LB+BPԿ}vR>v,+eeEqdh!01{0uE4:^ުM~5Z~9w5,oMLхkq )Sn55SzK,n콆Ȋ;_RV,,RV]CKTYH?a Qw uE#@hB".%&2FxB/sfR5Q}G%Vjr+?qWx8hKߕNGe +@aOb"$!±r[~>KVnP|Os9%hI*F7/˺Xb_Ʋ3)EOku/c*~$˛H z9KPe90=`HiO^j|3XD4*cJUOz9yϥ/^U|~3Ӻi` #ŢܧL5cM˄?Vq%HOz&d⼻6ͳ@8sis%sBq=K}8iZ{4u LRB䚼{: xNqǠcnPHs.ϱ i[iI4[_W)ȅx;-oSE#G\Ըi=uj. V|=]lܣOv#u# 9WZJ|"H $ + +AgfrLf~_;Uwu35oUuaYݱm9H1ZPlk :(o:f@EJxj"nW 14hּ['%SR ~Tݷ^>з҆ )]NjfSlj83f)b+ Rb8OFJyųtg\_I{)h)A(K&IFu(mR=iC4pI/үX &_vb][#[{KcgbҰ9{Vh+n'\V71 ճ:=q!M[~o4˭oJU|W{HA|P'Ԧb0LX[ ɿZ$dP`‹W29[jޟa^KOXۋxߋ(I._+ۀ΂pgd^3:["E#0*5'\vd(noSrԻo[KGqqC?3ƾvքoȽ6bI6Gͅ7%qJFoAUJ]AZSE}awP֕١àk~ɦ,9KF(P1\N+⯾@3sQH5z^z1>X{e3 k,Uԇl%L>zR1"ug"渱X-~؀jKz96"dvƑ\NAӤP?-X&;ވm ހMNMAVAIYT=9di*z ETO6[TcԾ9,CN8 k 292(OqwΤR hߗ}Hf <6s(N8(cMq#Pr+]'_"'-%ܧ*?'BD0SR9.閩lmv[-qWwҝh~Erϼ _ZEAEepkXA0CTB]M2:QZR`WG8}u +QU {n߃ +JɁO1mYr +2\ + 1S\M9,YIFfUf +U,4gaj`O/8;I:jeO\"`/^J/Q3K/~>uQCws 5'txiu8fZ\0xc`$/0'WAgV8^}bZ#8tL={k_Ha3V2g xxǏDQ G^`'1Gʼncջ- +!`zzOS#7ѩ!էeη ,/gg<c7w饽XFoŊWŨ +Cn E%l`gG21Ąӵ;鯎 +nA2ޚYS\.m'N#eDS eZ;΂0"PT֐XB+WG8 [ ZCSɱejz+q9~ s^ +Kڣ``PH,`GmwoWNJ7eHEFI{sl#ew!t`OՏ.u"}j` {z|hvx(?/Ǜ + y*^1>bq"yA촤Ftu/Ȭp:Yw\iG:zد#-!WT5زy3 hʴv }j&Q/"0B}55Xr+[iR;,1J( +zxH\=K{0)sLax0^K]1[ihmdcCL8D\>¸8ǀ @ {[tB}>xV2 N$F-|]i~8~h8].dO%M6uqq +1C?"ils^ ?^e\^*6ɮSL~\,EI[)ͣiT{(g],?b9߳wk!>6)+v63+nN|voMKo&ډ8N!<Ȳ,ț2#?]y76 ?,mϷ}t}B~]f|\,x7k +'_wɔ~2B:$.J6 w[zzE k-9l6\c^~RO>™t`Z_e T WXbi_U,77'/&zS]K@F(u/Fz"b7 &|Ɩ8[?j&h,1)reon*~6M9.zx"^ Y endstream endobj 19 0 obj <>stream +HW}_L~TeTT4_Ҭ|I+3+3sN}cڙfvfB[T"Iox!RGϋrXj\NQu<.dVғjRvOO:]mD0ZN?1Ėx1 "/~n$Ar!NqgL8gaIc+]_3?Mf񃀔n+@ g6_ved) n% nʖ`)B;|tSL.J +-TbG)ul6RcŤ l°3ؘM4ԺXi%8? Q)(k̓c&) &^F\$Wsċd\FRK-֫]$gOMo@IT(SV]\<'ϟ7PH$RY濪B^'8pػ` Y;N%{O(>rR`6YmF{XM5hx =Y?fCuk©1Nx*2NiUMVѿF Snp"z̵GVu^1z~WLFEj(8#yn*\Y" -%9Vsy6HXGdE!퉨qm.98eȈZQ&b>8 Uy@ ]6~fna-^b´C‚@S3Z}F92}9(ݥQv5S_RwEUOoA}W1r!aR.Y#Bzb} uâ+o70 sV^b0-`)8Հ&.)"CkHv,ֽ"Cuj! ڕbۍi7ws+P5(bԶ/GkMw4xe-ZT4mD[4$0(#h mKbxCءzx8p xqX8I([Kr *.xoΨ>NrA9,5*LoC8v:6*8>y= iB :4 pʯDI9nB 'aTf7G:{ !ic1t%0 e[Cns א 򷈑ݻufG7-qUZcR/y"fs_~0$B#?6:!ͷ$~E|1W"~E>0vlNٯrRii w;ݼ{ą8&odO{F#͕òSI3y@,U)q{wt6;&,j*?xBd f\~"f -9qh\0nb;yv#l+L/K*\:\u(vKc7bj|ؔ$N]v*E3{d}UjhB5pO u=f۴u0MmDG`Rr \I/8tJGtBRxtd`AГ td?ޫt-qf _ td {B"" +( sY 233Nz7dϹc wv=]@"[@SQɗ\st@8_1U,8VtrŠ៥XG>~q.{X:9|SNaɁ_d0Y].INg KY-KW1HI gޫ0 ͵zQpPC@sƦ?D-^d0sp^ g6K&^@o™6xvyTze%q&>*/=E ‘R^|D,%Ym[bS<.,zI4Vr-x +虍GaKtp'$Ṳlq:OƔCQo F4IdxyQІU:>8|$wx6PFҒHEXܿ)QI!I$&=޼0{m)[;n/pP +I) 3up:f'-ʞYTK=۾fI2)2g΅`ǣAx%Sꐽag ȷ(r'/lD?$ҍ̎|HgYN~“扶k7],v@c~Z$>և*<$~[P`,$]٭IJ5aL׎}mȕ hUW֝zGfV|xNř_kRQ[ikB0ko5V Q8mj}U؋3_n 3@S(ƭXh_xym$*vFt8:Azn[0JiG1_6#irP;7czZu"G~VBSG{^[}%QbRL i_s.w,|AhSY0cF1=+АGoZk } w5ݹV֬ή2U/7Чλݖl_ +M}NF#sIinY4 +K)hK`vTpɜJU/?wIBȥ%7fCp3$(8`t}@y#+,-\0Y'!<1m(uY`vYr$3|z;m(Vl|4ajZo4E{GaJ>G,ØƸa6V}u(Hgѡ]1DG{齌ܬtl^V' ›Ž!9hgM]bЛ\7uSV8ɻ Ďr##\R4֙}{T%UWj8%9})lk`Q-n ƽy&Tg"fimc F[E![]>Bw}O:t[oˮg)hdK h?򛻸ZrfJ0up~޵0&XsF'k9Zg׸s +Jp)h\dѤ99 O-=1bê^ fwbL#E,bKT% Tmf42jVlV,t/'U/8Y4XS~hU4uf0׷Jj VDvРvd1F-fODCM`y[Y͞FvA٪Z=ͣ.KbN(2lv" SZN+Dޕ`+¼y]c)C,+>M4yyv6oPb),? uiSC+Y)ef]< +adž2֐cAv#Nݢߤ;lyF.pJW8-br̙}j>:Bfa`!◝ nn|_tBa]z*8pI>h]nU!±=~…CrE\@p E(8Z"0~/Y:A¦xq6NGۚ, QN@I{͚eDV3Qkbz-V1qY#(TU)aV. aaq;oj5k%p1z rދ:}^$mlw.&*Ns~zͮ+Km\g' +FJ ^䀢OKDIUI&[;Nce]~0loxGAR B >] 0m$43o؋{env5dlf'-+28PW JL;P2g";kdO6q]&#/, 0.AU~1l|!̳: * kEu+,_w^7(q0YhCP`9*D8Fߏ!,lba"Cc l}ޚ@0 WqǢomwK Ȗ2:H3^fGA7p̾&]V{yI""bM* ՃkRfS)0C%onpc(v\UJ}k 1Qy߲\KbuV[]/ +-G`O]96M\BtFrʴmp;@Yb 0 eߘr(Q$C'Cc+ݼބtEo͸xK$L/cF (`GϾ_}M%((IHn_#ufRr}N:Vr{i3Mgˊ#g_} H5a:2Eu)`7]p֌kEݞX¿$CVXYˇ5hYGB Ҝ j[hj꓀rdzSa}X!s%.[},0dU.;el9X4fJ.;B s۠鲛q-fkr__3_mGlT?DlD>,RWϋoW.,j*_ى;#r +1a; +ȕ&7 ^.a9f$RiL>abODHL,kO`o8ܷ\Q`2`K9NTw*y00߇XYK4"  Іuvla_y|roD8In8i= jhTEg„l7o>7}m$j"U"8DfvUȊ" @,hnN?4hWNzklD*q|]SSk:h*?O {vTCNeH,ᓨ+ U.! EHuXc8/cnBv[8^*cl/YǒM.wFHڪ1)i,z8w ΕI,?4Qz̚0`6(}Wq.vgCk r 07XX6RQo1\ޣEys%Gl_$L戙.~%c\L}g]u*PïC2Pձ7TcD% +{}_H@wդ0hgyh&@2he 44wy0%^Q0 t >t$bˆŒq.]Zm%GHgIw vaKV3+NKTV-zBn29zI K)@a;8[A%*y.l`,@QB+"B!ڟ_M^,:p +Vpp?Kvg?ݏԯF*W9OgdB AݘеTTCA{Ǐ^.{R xK+-ǚk&j9QOڗzBQuZ]WDD"xM +dK+ +x%v6ن/l]N㸌 k9SW4 6|wSl(z+ ڿÕj)đݝR\ E *nH&D1G(\c&шGvv0,Y]Hr%1+(yarT[ ˒WdH%e%8C0Č\%c [* @?GK^x<ӜޜՈD@oe6R @$;pg >ǁb~g1CIėQ{б5 +A.MrbrM?],`/Rw.+N3{<#LuөzM ucZ5TZ֬i띟k43Fk1f@e j%[6T8$lQM0uߤ=r;gX/EsPKA\Zrē%]Fg1v[>$Lc%.b=]I +$QD%VyRsXN9+"vg[olThe \^HdW4iq/ 8'$U6n/W߲r=7S"9x.8g4ZD8'~~bU #\`o6 kVwfk]O{wDO0e0I&ԶJbuEZ% + +{df=xا.5]Nb$vU`\a:G?,~c9.fmñWÀ9o>>P.}<ē,{(e &ZlҾxo{/6,Իtq[Lַvy䏗9eGT\zӗy:ߝd<9h.fEL/.0MS$UoWopX̚͡4o6m7@GnD Fq\ 7 SP;ۓ:9i~+,zs +%+%؋dŸPf־Zd9ci (>KD䒣WgbrIگjr?bd$kZ|]KSʖ\hɍ"7lɱ/,-z¼%YД%5\XlYSy6ށ&̕ ֋6/!Vو@ƻV|[x ɒݴPKw<2o`bUѮy} +~CߗOwN>pB[eYck.fߪFw|QLO-~j'ulm\/eTʮ7 +fbח+hS<UڰZo"Dnu/{c40,QO?$uh(q,ʤ3`zy>ڃG*Y 1ERlh 0T&pN ÖA +>0-|1(^d-&6?!mr|JI L/dyh5暔!qԢRy&e^Hdu'r+bGQ.2Gy|E!'( +K! '(C+A+{ε4sz+U V؜]2 {7 IL2hz% z>NԾ6z'<[h4h}~cxL\\hSip`v8NhZ̕L)"- 7=?=zPp"i6"m[i6iȜ-eKJ9PڈU~(hN4=iHS d4iNKs06X@d]1)1Owj+g"S2 @)|ڼRL,qx)rSM˞",WfW6Zh?FyXmwA:a߈{=\- kD+)X\۩. endstream endobj 9 0 obj <>stream +%%BoundingBox: 174 237 697 389 %%HiResBoundingBox: 174.6948 237.6172 696.6953 388.9453 %AI7_Thumbnail: 128 40 8 %%BeginData: 5498 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFD0BFFA8FF7DFFFFA8FD06FFA8FD70FF527D527D7D %527D7D52847D7E52A8A87DFF7D7DA8FD057DFD0FFFA853297EFD08FF5329 %7EFD07FFA854297EFD08FF53537EFD0EFF7DA8FD05FF527DFD05FF7DA8FD %15FF7D7D52527D7D527D7D527D527D7DA87DFF52525253527D52FD10FF53 %2929297EFD06FFFD04297EFD06FF532929297EFD06FFFD042978FD0DFF52 %A8FD04FF7DA852A8FD04FFA87DFD15FF7DFF53FD057D52FD047DA8A85252 %7D7D7D527D7D7DA8FD0FFF2829282953FD05FFA82906292878FD06FF2829 %062953FD05FFA82928290654FD0CFFA85252A8FFFFA87DFF7D52A8FD04FF %52FD28FF7DFD14FFFD04297EFD06FFFD042953FD06FFFD042978FD06FFFD %042953FD0CFFA87DA87DFFFFFF7DFF7DA87DFD04FF7DA8FD26FFA8A8FD14 %FF53292953A8FD06FF7E282929A9FD06FF7E292853A8FD06FF7E292929A9 %FD0CFFA87D7DA87D7DA87D7D52527D7DA87DFF7DFD3EFF7D527DFD08FF7D %28A8FD08FF5253FD08FF7D5253FD0FFFA8FF847D52A8A87DA8FFA8FD047D %FD3FFF7D525252A8A8FD04FFA8527D527DFD05FFA85252527DFD05FFA852 %52527DFD11FFA852A87DFFA8FFFFFF52A87DFD40FF7DA87D7D527DA8FFFF %A97DA87DA8527DA8FFFFA853A8A8A87DA8FFFFA87E527D7DA87DFD11FFA8 %FD08FFA8FD41FFFD04A87D7E7D7D7DA87DFF7EA8A8FF537D7D7E7D7DFD04 %A87D7E7D7D52A87DA87DA97DFD5BFFA8A8FF7DFF7DA8A884527E7DA8FF7E %FFA87D7D7DA8FFA9A8FF7DA8527D7DFF7DFFA8A8FFA8FD5BFF7DAFFF7DA8 %FF7DFF7D7DA87D53A87DFF7D52A87D52FF7EA87D597EA852FFA8A8FFA8A8 %FF7DA8FD5AFFA8FFFFA8A8FFFF52A8FFA87DFFA87D52A8FF7D7DFF7D7D7D %FFA87DA8FF7D7DFFFF7DFFFFA884FD33FFFD05A8FD04FFA8FFFFA87DA8A8 %FFA8FFA8FFA8FD11FF7DFFFFFF7DFFFF7D7DFFFF7D7DFF7D527DFF7D7DA8 %7D527DA87D7DFFFF7D7DFFAF84FFFFA87DFD33FF7D52527D52A8527D527E %527DA8537D527D84537D7D7DFD10FFA8A8FFFFFFA8A884A8A87DFFA8A852 %A884A8527D7D7D7EA87D527DA8FF7EA8A87DFF7DFFFFFF7DFD0AFFA87D7E %7DA87DFD09FF7DA8FD18FF7D27A8527D5252527D7D2752FF527E27A8537D %527D52FD10FFA8A8FFFFFFA87D7DFFFFA8527D7DFFFD087D59A8A8A8527D %7DFFFFA852A8FFFFFFA87DFD09FFFD047DA87DA8FFFFFFA8FFA8FFFFA852 %FD18FFFD05A8FFA8FFA8A87EA8A8FFA8A87DFFFD04A8FD10FF7DFD04FFA8 %52FFFFFFA8527DFFFFFF525284FFFFA8277DFFFFFFA852FD04FF7D7DFFFF %FFA8A8FD0AFF7DA859FFA8FD05FF52A87DFF7D7D52FD3CFFAFA8FD04FF7D %7DFFFFA87D537EA8A8597D7D7DA8FFFD047DA8FF7D7D7DA8FFFF7D7DA8FF %FFFF7DFD0AFF7D53537DFF7DFD04FF7E7DA8FD047DA8FD3CFF7DFFFFFF7D %FFA8A8A87EA8A87E527D7DA8A8A87D52A8A8FF7D7D527E84A87EA8A8A8FF %7DA8FFFFA8A8FD09FFFD047DFF597DFD04A852FF7D527D527DA8A8A8FD38 %FFA8A8FFFF7D84FFFF52A8FFA852A8A87D7DFFA87D7DA8527DFFFF527DA8 %7D53FFA87D7DFFA87DA8FFA87DFD0AFFA8FFA8FF52FD047DFFA8FF52A8A8 %A87D7D52A8FD38FFA8A8FFA87DFFFF7D7DA8A852A8FFFF52A8FFA87DFFFF %A87DA8FFA87DFFFF7D7DFFA87DA8FFA8A8FFFF7DFD0EFFFD047DA8FFFFA8 %7DFFFFFFA852A87EFD38FF7DFFA87DFFA87DA87D7DA8A8A8FF7DFF7D52A8 %A8A8FF7DFF7D52A8FF7DFF7DA8A87D7DA87DFF7DA8FFA87EFD0EFFA97DFD %09FFA8A8FD3AFFA8FFA8A8A87DA87DA8A8FF7DFF7DA8A8A87DA9A8A8FFA8 %FFA87D7EA8A87DFF7DFF7DA87DA87DFF7DA8AFA8FD54FFA87DA87DA8527D %7DFFFF84A8A8A87D7D7DFFFF7DA87DFF7DA87DFFA87D7DA87D7EA8A8FFA8 %7D7D52A87DA87DFD54FFA8A87D7D52A8FD04FFA8A87D7D7DA8FD04FF7DA8 %A8A87DFD04FFA87D7D7DA8A8FFFFFFA8A8527D7DA8A8FD53FFA852527DA9 %FD06FF525252FD07FF527D7DFD07FF7D5252FD06FFAF7D5252A8FD52FFA8 %5252A8FD07FF7D4C52FD08FF7DF87DFD08FF52277DFD07FFA85252A8FD50 %FF7D277D527DFD06FF7D527D537DFD06FF7D5284527DFD06FF7D527D5252 %FD06FFA8527D527DFD0CFF7DFD04FFA87DFD1BFFA8FFFFA87EA8FF7DFFFF %FFA8FD15FF52FFFFFF52FD06FF52A8FFFF52A8FD05FF52FFFFFF52FD06FF %52A8FFFF52A8FD05FF52FFFFFF52A8FD06FFA8A8A8FF7DA87EFF7EFFFF7D %A8FD18FF52A82E7D7D7D5252FD047DA87DFFA8527EFD057DFD0BFFA852FF %FFFF52A8FD05FF52FFFFFF52A8FD04FFA852FFFFFF7DA8FD05FF52FFFFFF %52A8FD04FFA852FFFFFF7D7DFD05FFA87D52A8A87DFF7D7D7DA8A87E7DFD %18FF7D527D7D7D527D7D7D52527DA852FF7D525252277D52A8FD0CFF52A8 %FFA852FD06FF527DFF7D52FD06FF5284FFA828FD06FF597DFFA852A8FD05 %FF527DFFA852FD06FFA8FD057DFFA87DA884A8A87DFD18FF7D847DA8FD07 %7DA8A8FD057D52A87DA8A8FD0CFFA8525252A8FD06FFA8525252A8FD06FF %A9525252A8FD06FFA852525284FD07FF525252A8FD06FF7D7D59A87DA87D %FF52FF7DA87DA8FD29FF7DFD13FFA8FD0AFFA9FD0AFFA8FD15FFA8FD0BFF %7D7DFF7EFFFFFF7D7DA8FD2AFFA8FD4BFFA8A8FD05FF84AFFDFCFFFD1DFF %FF %%EndData endstream endobj 10 0 obj <>stream +Hko?ؠH(R"EEM{y v. +hG==znwHڲopz`K7g-e="7o^/}zޠޟI^՞GU^Z%FO:ߞjY}r}0C8ԗtS[V6>8IL~QK &"n/ p3DhrYݎw}Ðvu~ZZmVOxT z;ժ汫jp?wjװW% h]2#誨j yi $y*G fʆaX@X̻Aǫ0 =o$:_q{u9Ӽͮ|t5='p>:1c?]7]>e?._>OʄpJ]QVݜ|u Kouhk{DM)agve!D3s{.f֌]4P;Hm_mRDy3w}Uݏ|܄nnCQ'I.`5o˴kLs2!-6[ +O; +aF=Zm>jdY(=QeU +j=݌P<0K(Ǣ6UհgճhW:f֪Px;۝v3o\X#TۭQ jo4.65#کD`@N|XCz{@[iDp +Kݨg|]X 9j55ӗhFQza҃d}jUc_A`ڗnlպٌǕjgv>Z#!Ŷ35Җҍ}B[iWGC9?o^SYOI+C +6/v`+M\٣]MI'UF>;\9i^LW1ݞ;q<8S5TL CN]"MCljm;D{ijZM#C~Fkr2]s8^ʶ]wfvW/nW%z)n!3nZ>77ǻK5S~c^L`'u^8Ӿt<~we3Cխ?LCU6>LSі<sḘ96ZX61h쌄v}WNkhh@*Â" XH@ Qk\ z/jDa hZQg'zһvW޺wj|Y:cù$CQ;[BC4a}u GS5WX~eճ&nkwVm]_Z3|i  +p ~Ssk^ϖGy<<,ɮX';yֵ^<ÐLo?I,6o?۝89c`T4A,| c 4,N[wǧr.klJ~~%9ܬϿ'w-driT0>>^A%~R_yEQEVERB V"*‚",O$y,y9qdEgYfI&3q/3,Œd8 ",M$Hy,i)Iq$E'Y&I"$NXB( $d!sT&RJ!%TF2DbB"HBp &D("ySp9GB@Y$J)L1RYʢV(E,7Ui[h ZvcMƯ3Ȯ6.4}^i̍Z8|Fim񳑨„mL-=y%}SfjO)4&}eL S1+S^a'-KZ3qDUJaH.\Ɇ|M9amu֤)'<ĈK@d i-j~1O T'P!Pسg^)lMR1C auxxĸ1UXsSc_w뾼]]KyP[sȢTSq ɮPebrݞ;RϬ\ycM z]YGwTx5,^ʽpUKo*#h 8JE*_(`^ܑ0/2B篺²^ΰN?g_<7s)2;,mMZRu ǜŏٷ?tD¤ 'dc-`.>% I@4yy(+>;]uLtH-x#S DHdiJ%xvw%O ೴ו}@z,[ȴܰ! ~F@bvm a?P+8eS ++ːأ"+ 7DG B[G,ongT$> +?c=[,3ۚҥoXo[ʜ"x +Sg"{` alXn:U#J +Mg-]t[Ň(X A2DZ=7<:υ>nQ8BvsTҵ=JdD>}Z+tvSe`՜&ZDs (ٮ+b<(v{O4 B.>M*}c@4NeE[hV>ˍclL,[WּLW?/m1|"T] UԢK Q&u~~U13HGI+u~#| y y}ctB2䲑N|th9nߥtt$]+餋O8kH_IG?I'm\N:H'sBH'F:.HwC>d#]ҥąt|GߎC[m#|t bȺ ]VoI@wO%oSɑth-K+#餭t ;=MpVԉou2 u9utD}ʆ:: u'N>)x@,d긟nCDH G! +qEQ'Y܆:su2~AR6ѯGԱmcބ ud=NXچ:uCݢ?v 4Vԉ*?˦玣]:RVA,@Dc p"YSLMUQ(Sw\OO3Q!':,Pu! EM:هYHW 9|ZgR1vCXrqCr9BǬvG!q2U2Nrq8l5#$OyQ) +Fچq2mANb[`%$*2Nf䢌+C44eKuYz!'ksCNrK9ɬ_$$˻+ +c8,PN|ߔ((YZ!2.R3IJ9ɵE!0K7rb6M9r R/r;QU=H9zH9ȌQ+e?ܔRܔ;^ +9 b/q6qsCέ(䰡kr/r|T1 Y. +#r#y9riqA.S\1{ĕGqEUfN\J#+]\p⊯Xq)rdي+&YqE⊿.`+\4#qӋd'y*##p̜Jv*yJv*JvZ)2*ъ+.YqE6Z)2slyW̬ss#̛rfĕ?chӊ+6.GF\m+Wd+λŕWM\93lŕً+FV\"M\s<3#V\%⊙"o*#'V\wq+ŕg5⚃WM\1lhŕf5S\s*ىkdUWɇ̉d'9*#']\eUWɇ̊k.N\wq̊+\Nq̊d'Ȼ;V\9:]\sc2oʙWd+]\V\y?b*Ɋk^\6q޴*ىC\ǭ-F\7q̈+#dWƊ+W䯉kʇbdي+.2slU&2qlyהoS+^\92lyW9q1F\wqŕYqjq|̜Jv!2*ъC\e5U/qWN\%*3'v̜J*W̬"[qMW̬Jv⊼+fV\9@9]\F\xq̈+ƈ+VdWWQ+rwqN2⚊WnM\9"[qņ5e/|2oʙׅG\!/Wf#_XOqWayW9qE*yWJvwqՉ+bŕʑWd+̛bfي+f₭rьJ>56/vJr)2s*ى]\eUWɇUWɇ̊D+bfوk̉+W]\1j!WcĕyWΌg✻bvZqȈkl^\vq4lyX0ʼ+gF\2{qȊ+W䯉뀷@7s>n@\t;5ME]VqMMQ׹S\C]w [$]FK:IAKdA:Qu.]VAO":uPIYI759 xF$݀VWOIۍIq q]XSMhIqa2r*ٙ+>5o1xs|̬q7W̬2s4W̬Jv押+c՜͕se̕3c\c< i~n:F݀.:uց>nP[nőﶴ*I7II7NmvNOMNOdA7hO֬rNnvJ譋9D]@+5 u<\vVo=wHFp;^gT +lwE<~7ZѨ cQ">_ڽd^M6PdH@ME9,uKjǣF`EFlAfýD-BfK6 ]l\6%BffYL|2{<;fG*|2^RJLJ UG7͑/CD~"2dvѓːٕ|2|nelqO[Tɗox\wzv^f3]|l>jOǓ!w] s8asD_̦ <I)J?< +; @ (C hD:2›R!hnZPEo_݇w?//ѫ߼|O>?_~};y߾:`h}w?~\AN0~?W߼ӯKӑڞ'xm8r90ȗӺU7ɉtdٿJt6zEHL3qX4iN __8T/VIr ś2 [CNq,C[רJ\@P\!{Q8nq]͓-S!)yiVSq嶛^ik k-kV.V>Rb]Gm/壬~JVYRq|}:9/w{3ESɗJ>BKKU*9R4\lW%UzN^wN~|_ʹRb,ٖcKfZh5)α/$IRި g=g"YY/\Idpm{{x%丫檿<9Caxr4'_qO<>v<8h@qusʼHGR+ϒyF=uҔl뤕 +Sɶ[ʫ>:jRjhh=0衛o )]Fgl/tYm{NI&qͺ;NYxeptҐICC曇fVN2rG8iv5+QNDtMcV5^_}xi~#mTxiB5J/{uir41_Q;8i~qV7vVkkiyEVZinVgo~8>JיV=4V55륡1m}BB/XiN/c9U>#V5V+ Ҭh\bT=xi֊Tas+ zOVfLAq8ӏz7JSșn^/f{4<غ&bOb?r:(.Grc´ҵ\R$_Ve)` B딗`)Yb?´;KrT.L),za|A3aڤtriU4vͽ]>KR؛'RD)$J}zVnCR(Ks^.H)=~@ʚ usRؔ)jH!-AJ49J9ڃQzc4W.?'g8˃Q/uIcl$FdEVkR-IQ`{3y~~0ʦU(SPh}/8Ӏ(um/D>QX6 vk/C*PjuPSk!K-6 G-fp !kmM8&RȐoƕF⍒>ZC'ތ㍟iu{oXoso97޸F1IQ[Vn]pU䯷f8K1 D06hUm[hn; M70gmtCIN7hoУ>%\;#fh_7XZ'\G4pAW+Z5 oU7JqFS#XQ[&[|g}楞x #viaБ+lrCVo$MKFyi{ћU 8#l=c$O@I8ׁ$פ'\3HC8GU 纶$uNѠ6K8oQȲ$e!jm!bdj7\2!]{x +:!ȸ=r̘slIk%[I9jP蔣V +Slz:|toatM!ZVtʉC|@y 栃m9СvLN'iIYp:s:%^r֓sI"$Pm^tmvI5ұmA'mQ~@b :$AGm"X8N]A1m&3ktwL٠i+IǿsNnl3IifIXra&w^;Qƪ:5[* :G˲Dt^+A:u9Du$\ֺ~E/PUoZ.:mt97頺"(K*jf۬teܴJ-M#9oZgjX>'ky㪯 II:y%Iǚ3&lt|&7W޸(5'4]D76,}ӪN^IWҀ +i]ex3t~IW.t +e7* AUlWzA[xAǀ2o`u-7BG +5-7*St</Pr#kqH-㍬@A:~&MrHǒYzr9M~(d>c#-9rgr{9ʥ7Bjode7 :'˺Gku&\$E/|z3r3+ɬp%ws&1U|168B+`MKAjts%=1}\AsȸEs ]b:RLPRD$8m\n+nzjeRYK9pe-:ms5,L.$ 攃VRK&ir/k"̡"Vb9Tt&{ù-9Ёd\;9\;1fsZ〓s5s K49Gݪ>cM@sugb}"2S.a_y\֤7d.}8Ǎ,ᒜs~bN:^a[0)0wx{0Ɠbr51VCڋ94hz1Gq1G`t0GU}9uʺ.j/ }KKormQnC Ss+U EAʴ7n:hқ\*q+9\77RZY :j5'uo=AǟV%Ƶ[&7Bw]opst* :}+[{wʍL<ݤC&rVcyɉel n:n3dtԣ t`<脚z@GYn!Vi[)ι۾sh_AP?@:#|MYC1T7xc{A* +dgpx,MəQfQ>`ɩ.=j^MCC~anN3^# }0bHДOX>y@@ȗ#ǎK@Y*ruE*|E̞zNGb!?\t+ Os} %+=t=0^/ Z<rp#9Jyryp:.SlșjN? 81?y6/8,QP`BN@04 4 te_ӗח"۷/O{y/?>|O߾C_l ?~?ˏ_RGw6ə +#\B3:/ 5 C@bbgcdgf%w~MǗ +ȋ[`4mTtj9ZOURz[:F{B'XȄ jA[u\SU:*z%kP]1JJmHΫ +eAW628oH)$h)XSt'1brnzX&DKЖ5k:l8uK#kN/QNT4yM ۑsaTvsHn]SjqLE2Ii}.猨3 ]X9&j̉}NMYs@\kP{mqS-SNLjO{ +EʴX rܒ[YKsV.(\#eij@b2A6Kj==I =4/.)]~4/kNU&*" UQZ^rͱ m[nD?o&^|2]t2xLـVwW(Ӿ(zvPɺr6g?(FFb,4ʇ=vF0)eN7O 𔆏(<.#7[x[G::օ72ěv! o)7M8G"O &OyX [wZvވc9/DNeۦ#zp ٜpҶy"x9Y'c-F'q + +qԬ' 9:kqB(V7(k(82/)qzǯq9㈐fN|ZGt1NӪ3+bӚHAgr:esA9eCN9U@2g/)ڦdsȉBi\dSZ]3sku${bt{.cÝSǟ^tٚ[r6tzw9C\Cw.ӱC;xhz6z]*ءn1/˞Ojm B=}nzjSm|{mgڗ<ءl{VǮ?!{6)vI;wt&+Ŏ2,֣ք{g'ӷimON{v5ƅjqrv\vNogۮwH#iǝ4qNw^[I;ݝvaŎzCo^; ND ;y.کF&\;rX{ɷv ;Xt#ygڱ'{v8յc]fN1kǺHJɵ\H|Li]st˞ڡZi_ڱ7VDWֻw׎lq[<< jOKǮP\[ҭjH9vavtxh׮>C.vx}` ]Qyߣ $[97r)-a`Ǵ#j]#w %kg̲ʹJ]#aڡ+W\;NWPzZTԨ[ eFk:^HP҈IW'=9//TAhT:; u3S'v]F:Z$=[˔֡u%UleҭcHw;;3:v赳"Ųn;v9ŲFwP Rl\bc3brر-{mFe=tyHX]!'Xݱ+:vGre͂jzTڡƣs'j!bWKώ* ;;ԏz*ɝR[zp/vqcWq)=)e/9v-cވN)ԡ96B,c#RzIKԱ7%BJ2sկN߲c!V{=B,"uCz\;Ҏ;iUvt՜a9{mk j9ò'uˎ eZNS-R}3UJDXDպ|a.$ػRǺԡ6:vxPϵCǺZȖ;ǺαV?0w4Ȕ9NUws'Tw;9ޚ2:zؐ9]2Q\g[rr焛_qpΡ~ #s]$1 `9C9K';;z}9~sdE~EYpjs2JGә'cبɓfs7:=:aβ_c-e&+[,*t^iV(ty@#A^{=P~9$ЛқC'W:zUtܞ[KJ PV|).FRމ:=)jiY:d^[Ǻq봾|[:czR6gcĸsZ2\Ut~Ǽ;0Gʼnғ`Έx ;Řrxm[[-FrZ웻->VdX9U;pZ/ƤGdX}3;ev9w NpD=|p<N`w#wt4 +]aQ?2w)չ+ -2,Y +o 3"[ᝦcYaȰ 'Ȱ°eCyzCȰkwWwq9jE嗖3,ױnϰ>^ȵyO2X[ZR]? %Z,Gjq_#m'pdu2H"Z@ɩfz'\J]bj**W?ծ{11q+-=evS#^ӧW?'u$sŴǛy'9 =vN{*qiO,9؜ҫ>u·mr#Hun +UY#XGAEHSY5WjCBƮ;i?/~?_~?ˏ^g·rBܶ?"@HiYAvUc~G~_[<=履%___ +=Ǖw@SL뼥* 961T)eGC4zif_bH@e>)GK=#FO𢡶RШ\::Al5e 9DO)LexMeiFac igBGԘiCPť"myA;f +fBioj.YHm7B+GulT/A?B ӚfhJ݇iqj1 +cF9I^Z@c6Y$.tSciỴ{ZtMۙ<1Fѵw[#VCԼϩi)"`;kӘzN9"bzTTnVRmϘ9- +sS޵yNj:fS{Z'TbtޒtBQ_iZI:2tQMkrL![,}&8itZI5IG]VruVjcJt|ĢeW5kX5t# K1!=I9[wI:.cWiU=mWfDLnt%.T q} /qd+أ}@WptqHWE:tˏ]yF3l*bгFv>Htt(Vz +*q!1*M:V=3HYmYHtvJ1?UDzry~s8q:̀8/1皐sʺv;VefDzB۲2[ȲgUE۳*׭@'"ЉD4*]g^K :99g9H`iq9T^~0}]Cs=>$0=Ḇ(&G7qan; ,cܔ+عXmA尾RP[VPY<3C9IE3(*,x(W`4n}Q堗GW.̵bNAnsWrz#qq]YZ:׃|8ǘE /ε-39œ|#(ǹRnI9lO<\~ycΘ{ybΞF9@9Z`of,Ok/Q9s#0GY8i>{Qǔ*tL1{:Wvit=sn'˹2Ԟ) Sz+/ve9ӹrȎfL˹jc\)={@XǸR6t0.A=ǸBo'jBk E:r6H9 ++s]CiBձEW6]Cw[ :$2z<}h9qлϖq;W\{t$qB_qށFazZ0ذc\?sseUot͊7WJJVބ,pB5M ż}ΩR$`LimI_q 8 + :Wpe +fgpscWOcJ +)M:.$mCM;t[4sL91lwNa+jm9֝]Ҟ2^%ʺ[/cN86˘3@s8l9Եȱe7#hĚ:mqn=}#ubJ֡E{r5D7uMqUqx0c]sQj>08Cfw8ԩlU[܍Pk\f' cWơ.ơn"0c#%qPԇǿO8ᬭ̊2ٻ8( c ʼnCV/Jqֽqr%i-[:r+S䄛:~Ez DZ`BEn`k<ӏёcl+rvN;ӱ95%G_z {stBctDFr2ga"'S9]xQ8TWuCRjs\%VgNa1'9}gN7%YuΤiB^&;: q紶Kvsk\ӹn&vQgn|&ť#OrJڻ: A[l/P[(ݨ㾬[q:EL/ܴ4TPROt5ʭ:nТSg&5:u[I/+̤q ;u\gɨdl8:>n)uU(N^qVnR/VnE]c-˺$ʙ[16rYU9-NH=cji+j-+*[ ;ؕ[|4PPN0ʭ5:a8'gYgnձr+?4[ʭO.K5N鰐JJ^4Nn;t/r+wF :Fs:~Qбuq)5eAG : b+>;m_89H; ؁{l61aPdۡ]awmwyq=U0; q=UiRtx1N8=wv8 +bKЯmMC>ZkLh:z6dyX4G+_y[囪gYYY7zړmaOe_qFN"YL+ʛQ3JxוDI_^C +'Ya>`Y'$]TJ3޲Spˁfէ4C=bi%X4Q>stream +Htͪ &ʉv$J't^Ihm™J,/:l^-[,K-Y/M}}Pa5^Kh$r׷9EzS #"͐sfMR3hN1t.תCBI^_ŜM&Ѩ%% cH$tDZ}V[b؆`flF.u63xHxɜל6ͯѻk*>07,wan@{!0rt)Xca !-QvE4\ZBz1|Q\wpx<"fM}j03#Ҟ) 4pLj vecgr4pq6ؔBO5gRΘ>Lcd"-]jZgm6me +OyB<gfu$#3G$>5uSJ8HF-f_O__~}Ͼ7~>懏?忿黿_;}1(L(y(%υQF89(lQʜr8[QYY,u)|mmB[1YJ)zLe)v :a1S>0ŚLQ8 +k~ fH4킫)lQ4B)D2Q +\fR 'Q +Jb] ЬH +w„Z\ERH].,,@:6R&H]/-raM]0=ln_{/jV91΅XFa]>(QQK{Qԓú\$ɼh@UzaSP(V@CAԳɁkUunN!b; u&C0'$ k6ۄl"dM8C g+| 6c%O*ԅ7Z :cd oaj VxslyǛoo~gBE y6|wml̫p63Bt$F*6.=e͢uJ;`b1-Ao +G@-M7h z nQtzE77Ջneݠ*ͳk UxsM.e|>6\ԋovvV7זmS-wb,c7|{4M7ϐ2 M+Y"T.Erڀ4^uStB'pa^ p!U,E$E8!!"=}'uuN6@ )/�fBҒb4qn|䠩+ȹ r%g@nj,ʅߵrfQ5(6 + ʹVM9+t9\M砻dZmt (ҩW`S:Ȃ@~st"J tb9Xl(AF7ýlC9œs +f7`bt:h t5s[B*@OkAwfY.й6 tnSA1/6 t1&]KYg7ӴH*qo@J>tq2t!bv3KA:}H'"]d&0@>}6[`˲]D taU ~p#tF.tE:<*[CILzUHM:o7ҹܤϮ 7yZY5ӭqw^6Oc(|A|7[AHgRsTݤsϻ"oQ49hwߨm?)qM|5tM:_;{$'IGaYee=98v:8dTp7929Iw8y'w)9riY5R[@hYghw6yF`͹pKg NDYqq`{0Emޘd a +JAk^us򕞘>{9φFs CO0~AglߔgWyGPs0wrϤ,;{rnrȲr0x?焽Pr3ÊrWPzZfT`N`ޘ-3(0M\x^;`8S9'CsOE9yZwι&ic6\koqmcxZs919:0K5FdN0uRQ2^8|%8`7$ssxno0ongC`2oQWau*9Hooys&zuQe"!j{MW-  DQѨ(,9g_? V}홟@9לsUch\ :JCLfJ)whseLVNAÔߓε&q33Йηsyqli*_cߠV :~Y.@|Y9Zö]<+~*1u9Y#4q}J&c\BmAo$[@jDtu\}(vB/w+tMMt71@X;r+1P_Fa94ؘFa^W 23q te\-Tq.r+,6:qtJ!ͻ 3c\18@gWnE6(γ޾,3[M;sV&s&k ^s6M:ژ3^޴C.Q)s#HAj= G]8Ї`ui3G]]2˱L{i25` 1ֽq#1"(nNcm{'cMx2.+уq5{X7A/!;/KƋb3^Ch`1q}1/:Y!P A_844x"k0./=Ӏcͯ9\d QKirU9{w-9{A',$# G"9.O^CLH9;RrL)bIy(gWE9Ⱥ)YA'~aYފ,}Lqa*ŝqQӃslsi5~sulfRs]}@vH:ܗO%P؝z1tǷޞ4PǢc[H_m:iPi絡EkBtizK$zVH؀۷yu3@<|Fu|;uhncǷNޘ&[uUToحB +F&ǷBkvXڎoQaY +ǷǷR_eu 謃nݬC[:Vި9i|[* ^V[e,!"&JtLxqIn'KNPC5|>]Hˣ"P6|eH=&В !%a1>מ=U>aB=<Î@%Yֺ}Ï?O_^~Лo޾|O>?x?{>__y/IЗ7o_~~ĸ)y.O?W@,-ԕMg4u=` CLQ,5$䣮tKti]'{B-GyXp*eiFMCQ7YҴʸ}G,ό%ϰDK):نLg*!(ɘ9}=SqA.2 [=e^J6д&/΋7sbX mmHm!~#p/7 ;ehq5Ǧ6dC޳ӑNs#fQ֘nKfG&d´{YVh3`eOi1v5@8S 6oep{Qr>\1fd?c:tk9梦dcZ#ژ=O{L`~b;iQUgK%\&p+[D*;;~Z9Px(:{n"fh^-ނjl'=IN Xj=qtS:֛xVb7M79{ 4!7@,Wik׊[8АO _(>Fib fzP +JQyYRA) +tz1#6K3*9,iҼj!xJ))cY$ +6OO7S/˚o"5s5{Wx937~UYS/*k鶀 +iiDUl8z͋ʦ +e\8UPkS%p +=^TΠ)$\4E 8ֶ.Rr=aX#`jo1)SU$`J)d,tJRr 򩹨'Jͪ|$(!~CJ-Kk^02rMRncc8I=ER&GSP$QʤF)B6I4$E,RfR,7H:  %(iU(9 +>цQ.1&F9ZP:"A=;"Ubb8Jc#.X~O8r!BIqИ⨇%Xw8Gj%G"$lTB7HmmCv% @ݒ@udn:4Nd:s%o>"}!P)ܘh?*¡}X + pY#y/WJƊǼ93w +,)!8I)Ʊֺq?pm[1=ghşbfw׭8,<8rqIX g3HGyHt9r%rr\9"E989WHwQε +y\9S9vUΰ?E9n1Ϙi]9z*Z_rs:,α&18t2H:㱌CǏh:jE:l4|.s11"kVJl6R:]Rǟ^|zZ8{tj[[O_팇rjvd2^`Z^;XrluȾ>/CmYOy^VCMmIbξ!G;֢}s웓.v3fѢü&vC`ǚ ѱc v~?#g%vymXj .\;?Nnю+ɟvIv!}w'ݫ^v;vc F/ءcrFbgYkr>UWX?rNrnyڱ6귱7j׷d1XǍtƛ^:wN7ud{$vyVWWbTʛ_=72o~S6Wӆu¶Q(Y?ǖGQlcWp|N); C7T4GF4eAJ/{QHHщyt<}=WyO:B3{__'tYDֶ }i*q!f;E:.7aW:4_\]Pg}Wǩsg%uSmq:sx4^gon]Xhݺ4:fֱŊӖZZŊuiݺku̱;:uXo.`3:PK+q!u8?IlUo<>s?Tjj:=[P8lTVG7^:3+urץN$_:^g:dNqeZڱ72~;3&vʇܷ%vue!cB}S,2*zS,DOy:e8I-GŎyYX jC,SX԰)&v#vYA׵CwuE;Լ _aܗJqNe!y;7Cړ:uuMyC5:6뷶a;5{C,7z˅C?N=wȰYNZXu;xZgXnNӞ1q?3,k{Z7z6cypꜢ?m_y7zn2)ԱvZ;9PKXry f9АtYIHdѐ).UwO'i:Ǽ.αsF3cs#^\/9ijcJdM+Cg~ǥ92K琯aΜ,ݤ0Z4`9/2ng9N!GCx_9r~E}{82 vaHf2'$k'zEwNi:5̄:N8gL蘥k-އ5:fZ{~G\.dwB< +?oFKС^t<ٔ_EN?:ԦXO3J[OHet*Qz_:n3s\ +ޅ:?)1ҺfunQ:LI<%uءc֡=niwa7\X2R;dY1v8ӢKPCfX9&w߀qǃ9OD#qcnTrǫ;ܶ ѹCƶ-hr[oELPgX sUwءI6:= cfrC®pBљRf]auJWaK5fXٹkho5B3,9w:âvlVx<|;z3gy3,Np +d`͉e'vox}3C,hC;=Oα;ba72Ӻo|:l3DV U>נdh=9We Ӈ~[F>~Uj^j͇nn:W'obl`qE[KT? 滭lDW,ur+lHzrwlj1*=MΦ -~c%l\פ2WٚxK=>2DI݅3yL~j塠 HװahPE>$Ltm_?|o?|}o}ÏW?|_雏?O~G_?}_o|$ao|_+#{K8A4Bs:1K5  Ī!kpY5G3"#|7 u)Qk4mтWHI\JI}|D 5oӪtJ45eo-gOπʐ]$$j\gT"azvqQÅ J+G<+Zcѵ*X( ׸ $@^^FN|^ JA]z bB7ZS4] ^*\,,y ee= +W A4w +dK!$NEi668Lj!3tQ2+$zR5F{cιn-҆rJ 8=f(yq>cy7[@ɟz*:3 gXݨKA7JX]tc(lCA%6:Y~Am|6zMd6hLms mm#hv5ٴa-{BZZXCWv&(OkenCHu/c5Y udc"[gRd~૒lhSڠG!BnFo_7(gZdn@dol YA6h؇he]lc,l{cmz`u6Il1bbhK6mxglÎ٢la:6"._؆ۺ(k6e\۔uܠ{p nVMFtbłnp~|(ݤur]tkXmc2ƛn潫F]ݞQt` +8l)tk,J> 8>2x pҥ]ӴnD8gvjE.261,УXȱpȱ/I.IﯠB-&r0:*b6eC m^ǡ)Oc6UoiM8HKY:8b3hRp;qʷzwɚqԫ6:~r@NTYOU-OU,πo ' +]Ӭ3Onfb2}Adv'}Y .A y!ܠ;⠛#\ı&Hw戣v#Ӯ|2݄K;[p:᠇C8,preM >p!\Fzǂ W &\9"qWp=K!6*^jxEbFj@t !J8hK۸q]ClqK$y0]OGl14UUn8jrqŸ9 qa|z(V~KHt-"DECp3[ 3v9z1zM#E8^nzV q7㸋i`NeF7Ay$=}DŽFAtDn݈Ý6J=#T8v>q҃8B8Nat^0zOfk 1qrԻG !V8ncvU 9Ub?n~UVUރ rvUM{*eK+ '&vAN ǬRr\y[끜n<̶r|_A9.G} ,7O@Ne6Y֏lx̀OlX9%j=n]G 1{*VUx9k{c>N2J=/ımJB5BcݎY}1mV޺rz= '=nX=f:cV9g^Y.u̪sDrVE9l ߀.^IY}8a*cVJ0NPǫJw )$}?81n4K:VcUOaJkBcj`7sɁ8hY(A1F:7ߌG靹F}|x0M: ou\SQO/c[s$7Du.kCo17%!G7^>XwCqA>"l`ے]xCi7a zՋoR,=\7y|5 = t o䷚ox[޲o7P>c +3*8jKco@5`58|̸X8^JgXst9 puspvN)"rZAg+qЩq!r *!NڙS{2#'fIN˂q{7㐟@!6J&&6nCWa-(mc{SRn6(FA}aeê 6樓)0Y'0ǢMBa:~cn907xUnOBcf=搡(}07 v**9a*9vb![v-X=^^d\GU;ݏN +sos n sڂs8^UڎW~猍FWhtAn!V9/[99mbxU3U{W.y*O3{(!?@rHVëF@ 'e&|*y} kme#ȑ*cX@zuAܐeځ)L>CcU)*{qH}N.۽s]b.7435@jh}cX}PR,'X@u3v ׼hꄣRrӬ#18|e]y Tżċ C}ګü/}S,H=bZc@>V_jg,;ݼ{7v^xaOJj/uOb<<|@.Ǿp?vWb%K +navoy6I{nEnJ"ؙM=}cb^s 1/!ʫ3+A`pU'AWcsS^6xs_TҪp>$e&mA  }$#mgr;K~f9'8D?j  3%w]'7_|?>>'o뇏곿헿?>?K~_~_ᣏ? +n3)2<Hr) $FxQE`gFʹ,=E1^pj]3}k.Y/M& .^LJ05l9VP:Mt, 7yVO/ʷѾyF5KnU=cd t7L&cBV ^PIMr SvZ;!tNԕ3DWbȆ:6D )[u!Z4=sZ{7w4hxkmb 6d:QJKQfFyS;j.LKթk(15MV~8t;\]=Lt֪3'槦dh1-Zs 6C{eL{PPKc^Cz +xTeƎ[=JDl2ԉGjeTY@ezX.bU2N'Y5vҒX?Woiy wAW|iFDDoA3Dw!)~hmtvM:<ɟ_͏ RBO RȖ R<H!kR&msxQCR<4,)ciOt4:Mr)iJ+n7NҎSY mrigѯ~18~X)v] ՘eo*sTi#@c_66hg[ϫdsAC)h8 )m7u9Q*Vn>>cĒUnZy#6$c1TbunadZ\c0 +NHG!޲܆anI/e*~M-]+cdjX7x$N֡6 ?D2^+Qw]tZPܭJB:d}y^B:p%iut'q}PkcՠقM7?ֱL H:f]uY)1ނ:fYЪuu8^+c'X ZǼ[ZuZ*yh {M!MuɝgVԖ\+ +3(|ql]̭+KQW&+8ic>CY*Mo +VZQ=Ԋڬ: ~uS[WٳQ:8`n]壯:v{kYWV\>uuO9n]~B:x+/ϲtUOJ]C$wұ7vC:mVm^?xkY\Al9orՙ(yrUNZP'tZUɕy&^JҡtY *67l{!=pxAFs؞~sby-]o֞s- sxkj_&琷# JYrt6vH麹+k|teUٍtNtctOKe^yëroxޭv~VV1>`Ox9KP-ѥs)dz +999eo59-{(O9u?5kNGּ xO)~B9~~&WVKO#e`~q'F 9ޭ}I92*r|_{>qc7r+ۿNP@n8B~#r\Ƙq)5c *':9ZfbRN0k\l9h>c_T;csgbjlĜ(;/9Vs|,9VOㆰ6:ѲN@wNGYI֬ΏLiRC:OI)aEZ:Ht MnUyz'7 O_^ivdX7#Ž̚<0\q3vKnbzu[^yjY-޳&i7bH.+;M !{KOܥcWpjOtM+h/]ozE{e׮8[^Q;Z+7=4̬GWWo]e1˅tڡ6ʛ^cO$cǟӱG^KHӫJMQ?e77y6:lVW +4P݉emۛ^& iQG[\D'QǃR\TQ'lQʝ/?P {\I>>5b}ƾ;π-Ncׄ9Nö-]ŏ~|;giN;b^Kv5rzpNK;yic\ ܜɜg@`S+@Aȁ&ROȌf`Yv|f}xoz뗯>~w_?!;[{%Ǐz_׿#9{^1j^e\ረ++0ɵAz+ɆBV QA)y NCx𾵶Xp);M~[7:ȅ cQBgeŐxx1DF~ψycaʡ,uǏ|tb?螳s&5cWo+e1-D7/~as 㜚m잢t'[#9F>'Æb=J!lnA 4f8M*S;@s"׃B@[u@פ]:kN-r0UG.{n, [Cgwl~wwRTSEs=.瀋Ojsw>gU{1^ewߒū9=G.J];![o;B_qFN4(o%)]侅O2 dYcUSu>Vbky~Oeĕ>UYMh@/lŒ6V×hp5ѣŴHWEr~_ ;ARif)tMy:$EF$ͼl'雤iiJNAS4U Mi{"fm&)+|KJ8ղq +؟8-7r8Erv<)bx8X<(iEy +}"6WkS-` +[0.uK!`)b,%QJI=QX[3P*;QJO}1t*(V +9I) R.\^AJf?@' 嘜ZTstAHG cE)tdGhUovz׋̎)h :Rffmns(bm2mRg;1nRQBNUmRSZIVY1fbui-Vqm7 +a[E2A8x7(oQW p;67B࠱B QO=c!:Fj%G7~]|MUoe'p̀[cz5m72enеz 1nP +q bߠ/;ߠ}buz+"g@CzMf :]^oߠ$Vcc mnᄣ_ނpM8S/1_7 +ar8N"Sd!7[ =ԫvNݲ;!P 9 +Ʃq9Sq='y0Nr\㨓3`\|B;ǘL8ݬGmnՃq٘+GâI9Ʋt樧ʪ !易.sQucxu-8Gd61:mAwS7Chu,`]eEy{˜8PWۮu[%Pm'j ttɷIبzn"]|+u6{ իy1nB]:u]Fb-T9ꨇ@u+@cUסns6uFNu +c*=Xǝd7txuLk`Sto)lSzZ Q;:&4L:P%P'SQzNnIbXT:-GN:`u|ΐ{`b3ݳR#Ousy`cy`1_W Q~vv:ݳRYm ݬ,?欓.gӪE AF!uVYkkYJ}.ָXggY1ohYu ݸ1u7v9R:MH t̤vjb )[tԫ:v6q9P'ݹ&ٹ*:IN(:IU\\gI:goe :zfޠ6k'i 4Aݥoб(u^ː]]yZ}99^_sssC9|ys;V0ڜo*ss.cj :i鬠7ies sA\9=y7`J9@Xitй6&bMH=XyO!= 7|z(Ue"7JA,@*n#U3c\Bmמy<'ul'$c͢l7sHG]t t>+W'5HX Hk57t谯:Bqf'4PU/q#jtz%@uܠC&& \3/tR:bkݠ3G:e.Љ}rБDRoqt܈t{'22tt1jWYz:_ˬ:<_+y'Nÿ5,GWNXڏT_uѰuUcԽtGK {Eܾ尯{DBHkQYfb5Aw:hܚbblrͰedPX[e:7 uݺ@bU{P(܁~WP_kjQG]uuTB|@GrqQ)50Q~W}t]:3N쫆jW\¾rɼnʍqJYiuLQþfN3/YsqQS1W+cRN2ý67:qЩP)jtNuy ti3AGKvAsQsНx;BhdžS:唣79rh3fS9]s`SvQ(ܑRi瑞r_2rkrIᔃ.\8E9X1N9h#ANb|A7r-E9V).8SrH\!M! raoCr=r-r}̡0s5 s2r% s% sa|aN]cN(r s6g<12sH/!Vsz# su1's{Y.1?tty:yAh1P(TyNK,IgN:%Qt$N:Iz/$Rqt,bhRtDrilAnc!\ 벇ye8N +ל;mR X߰ +FWh۽v2aGMm^vMl^1;VPrIE{]3ѱv};l6Iaqإ DvH A;?ꨶpY[N}HiG2½p]oX3+90vkl ;>JC{P ʇUa4oʍ+37A77{%` G3牺I騛sWvQQG +:jT̅:J2ucq*++\I7¯"$Dƅ:~"p:3krYڙ5m{sGo}):=."ϥ:ǘ]ƾXWhJ4u~8fht?~ e=tPs針i.:=lHzwzb&:=pN]ξ^v lq5X@y9?O_^~Лo߾|O>?O~?|7;/_~yo~|y?~Q?~ۗG-WAC?}tV@M;:3XC];뼣 vNɞ8Nqi 4̻0 D[uWmGΡܘ$x'#(<W%:~%*g. 0H2c?0W"Kɼ=eUv]m'@agLl;K2xs%f^{6m07Q?īJڀ)v0h%=W<>Ķ ({ls)*;Zl0YtD{mאacc 9.O~2ɺi {/TW)چcT3{?c)zUtaLMkà[#7^ҤT +wåȓCPܡTԝ8x%`㲷7֘ՙ=Ml!ΔUၚ=2Y +I?s;/^W>wѐ3Sgw+hk],^+EYZNK,攬OgfΟ~4i ëlB^+<q%R"m;R + .jTǰ|s.oqR endstream endobj 12 0 obj <>stream +Ht˪. O6mMdc8ss81!`N~UZ'fZRRjw_?~Ç?_{g>}__Ͼ/߽w?o?~?M_2D=ھ{?|WΆ/~G_?^ވA/`ԡ˂Wh7cED5ڲF6s*-fVlpx=^֛15zԯ(v}B+k'zX뵵\0hS97R16)5Wy#FmCg/`vV_ޤLF 2 /.|<ܜz4 :xڵSmy-.AfٽmG βU/bjsdTTkoW'+r6JcS&)&*c'VJ=%6Z>- 'Ћ.\NȵM%tQxL N5z3m_{Jԥ3'+ȜWl)YL V *U &LU\sӚ Pqco> $aâE5h +hћɃX8gb0apx.u.]ƨv!QC=|,e*YK-r.= w]HV"h.u8vQ>vQ;i =xȖ#/ zGЃ14s|`!OTozE=hmKbMLǭ:MZ_cCO1"5oeY;Ajzc2Gc\#Ẩɑ߁Md,[K,q-.mas{0Ynn⻪F.ϼAnѓoA ugU /"{ԥZYӳ殺mՅzV9n?{ȰG]أǯ=j=iy[MwUfh哪=tnRl?Z/{従7%` &>W/E?xT06}RpZeSEJA=6=ˮk%XrbR9lWg4&Y]ؓy`^6_㻲.lPXz ~@4b z}v&7(H-C\2c,mӓ:7dR/tB/]ڦ.򿥭!zx]^t6 %/!:#q20zlA{~C_̃<̝WXe/,pv>Er9o)mzԸHԣgu׷&y[Ev}FŶԃM=Et#7i>Lg>.>y#ԃaM7`܈ԃQ5uQV(pa o<0QGIM=zoz)ud,pw}K= \00 J@DBY!3Q~֪߻wwukɱ +{H9`N<'v{ DRaz,v{1@L{+q_&$|(ILce"̓|nmuc(q;; &8xx]܀!Dcd +\'<"ݬWF<eq~K%mØ/xr L0 mȓtvCԑY?xڿyHyژ'u0Ob&e*:y@Od==Ʀ=ez(.0z*LW!no˥Ǝ=6UAT,<C\p^؟i[1*iMVb;-$7>`[K#&T!&X0), =~YrOL/VwSv{L2-wJ{(%l̓z,?zQwޢ3J=\v+J=Rxc\(aXzB8G*z u[" |=hRꡪKuj=#ZHwaЦ* +\)8ȇi }Q}0~ʀ{Uҏ] + fǩ +PtjyuEV( ǜb"H:ɩAd~gʮ?{v@"P}ō8,5".2@H& q^QHNSr QZC +BƂ)04TAH4m4Wޜn?bo7o{wz˯8GG=fO7I_)v&smCMZ0eS 77@hs8>l2Ӹa |axdd, -xXzĵTR:qbClXS7,1"CAEZX8G!w+B:pNuF/NJV\cH~Bsh *2y^i 2_6:i9_uL.qCFP0rpWtərsXBϙ9;!1-g.b?9)񬖜[w{'Ssn)sE9C G\F hfe zaP']*[XMWF:$kDБ-i9ѤyjoG<1-i,"H'V4Z ,Iç-k' [Eջ4p֮&M8CŎVfK{Ҥf&DlPVXt,!|nH2!煝Q=1jׇ+p񼆨=pO3Bg^XIAs[׊HMZhܹR"ꃼ_!>?lDV.'h (uOz6aT*#m̹`1OObNLqLuM jz&i9C/zڨg[ڨg`bGBgkK64!ʹAc=:M`kiJjisbkڠvfHB~KyM斶NJz($`M$k˛H$В7fϛh$lY{F*27`ڞ83<m픘'`\ ]ˎ"^ՔUKE#,ͤy=`[w8o"#.1}[Rz(s 8y~*ngZpk6gb3'¾*Ln Ba$( &U~Ny3_Fa˅1`-#w|47'b 7MΙ[dhs۫f}"GJ}4W6ik]>D4fXM-%si 5iLG#`h:Ū5xfy*u8VQn:Mv%|2ӭ!k-]># N|Y8>6ML(75 xlYViۡLu"b0ޝ rV:@ 2/3*WNJHxHp dXc.mGa+(HnV$;R0X9?3]{0m}ĠP"mNEV)UuMi +wLhCSGakwZ RN ,O(`B()E3W Fp1YFDX頶,-vj칒mNjVS5K&7n1ymdfS[e3?zjr< +N2N' rINٛD%?'Νj2N@\|H ڶI˳=li qΗF/#e%+=ʆC6=#NбKnOlk{jf $Mva\KP2N\l D'VR M<d{\W/?f`[l2e1PJZ.eYWHmJ\`Z= {M^/{ Y ,=Z"I Asvht-"N[{[NA}87>)l>֐ +`+/e [1Б;A1M #,c.)R 6E28=&<Gιzt~Z,.L%{Zl\6(fmGgJ*tM\~ :[uZIe|:˛ +^W/=WU4A 9;AsL5N4~ j2L<CbL1$&=0ǁ;cb`T~"*KAw~Vo۬o0yq۞PSP l9+[ck!P&p0/'jm m(PLp,;8|Mm{jmȄ֝S~!0U&f1OpL։``j>6nm:fOlh RK'\[g"~ s?hSP:\ =Lu>VMܲ> kD`$3+e_R q1^+PF80Ƃ +c,ӂ%+sAO zzзm~2ng8g!krë3HAIu?\u>~ +D-rzO!X6KgH2[r"%!EꅒIS}?bمڠK$]}{ 50`h3G 57R809'7i&`/=F:h"vK- P6I01LE k!p!u(bx=eW5;A \UHsŁv#wս2k|^ .zildy h'jk}׈vJg5:OP]% no)hbf Rj ,ilG؞r$xaH8uPt`'e'EBmAם,,g'Թk6)/,SBt[;w@S^Kz2"ܶs1a2]KO]ApeR߹~F}>Ӌ՗W?|s_?_}ӻ7Go?(/~[_埀~ok5?>|d7$,Q 6Ï/Ꭷ< =7hC_fm:;N`0oi]4 7l  dV6VsSxu', C5^YǪ06S(`] 4y0CxDb`u[|?{E6;e |Ai d ZR&RiAћPlDՙJ5RGnGL_ p(񄂮x3=@A!,OUK# y1+뱔/lll `3% #ѧOwABu+3###-4Rl{}o1oʞSX< 'FQ5:W-Ck+#jxuO3WyZe4Je-X5!Pڛ5̞`Ir%Pp{)/EnFu³=Yp &hptجww`JL{;5d\58K}F L=F/,wb?G@Ò}Ί-Hf]˰Pm' iUb{M +0 $SވR8, +Z3S7' ]l Uh zYHF.ޢ3hjE=0լ;Fp[WGh.r +M@q * =6Yl [A%tK) +fGp>A4E [42ŏd9p%\Wڏ1 +,Z`V"F@Jtˎ::#:}Ny<7~i*'7^&H+cW؃$- Ub> 8<6{jmxj W:!Ԁ?+23̪ngڠ;e^ */l`n&;JHՉigu.CH-qjMgP*O[;\CjSS &-@;ve2{[hvNS' +wU"UhiXO f)f) ;Xͽ.3C](NO3="Y5`fBl> uެ\747hxZD*t*]2{x̩*csqb0"~ +fGac,+DFllCаNіo b ^JY^~[Z4l]&:%HM(9ܮSJ_Z$)mQܲ%RKRԧi}YJɅTҽE@;gHdH}ƛٺFu`4L`$T+%?-'P5]u.h9иaΥWDi\*(i!aU:}ҝ f֑dvk 7vO4Cb N:l@쌵;un0^5Wz+Ѥ7& +O/llOl.l膇v E%644 CGUo;TF2r&a04Jq쯚Kp9&! (^XtViݣ^)2ϊ$9ڰ[.^ͼv?\n@zvTs٠Bw{-)4m4yS0oh#8Ee'|xyFK"Ik\>Q\| m.q,e8 =)O{krqaoH 3a`| hy<Cej]'Cr^'cj_gd\ڑl\pzt]O<:LОMk 1ALQBA5L TvF$t߽W__}߼~ǟ?}O|5wM[%ݾi;o@->Y{mI-?"6WgDkND0:k$ofFח7AnOV0fC_ebyR"Ek0}ȥ˴z{Vl/X2~|v\Oܲ-\Ai?ӚKdڂ%hWeYf4Y`QHjw0.H8q7nM5; Ĩ"`d+*j8Um"0T/_ϦRgfcȭur5Qr 0zKnU5PLwE @!IpV69؃v0R|;A^Pʷ6 f.R@DXF;Қ7cH\w]-ϬHnm6PXU$﬉+w 0 +cKuGVq_f5p‹O,xyd)5[W¸҇S]R^k?$O#XwVOg`Z*$pg9/@zgkRvP,[~7 t  q֘c}\I+Y$@D؂on^MK`$PxV%Ww3E8[MyBp]YMT lp;WӉ'?$ + ~g;  u:J"1bP2)c?vs?]>VLYf]1*16 +׬yb`JoDfc zS\ ܒ+9@:4o0pp$#smYu_\iftPLj OX\NH-?wB&0&qfڬa#T?{fn5L!-˺n?]EMk=>V@: Zܧu2?n(Tw`*N-R #_Թ a1'i`YŔ6ĵY}.n+َD`,3k[IƋ]|޵.Uݎ" +?zu#t//-H؉G/bD|{GUs.E+_j_]]QLɴ--Bp7B-2^;a3Eٶ',_T/%z7dxFrZVlYVIGM1&S/D1M + 7ܨz^ˌw##t?iъwN[j*CdgRxqlTa0\^ ,OC!Zy&ʉ]O{Fh~UvI QOT9}$0/{]V "?T+:)_Cȓ\_NxTgą"S kS^jXcJ`[euvZ~,ñ5}p+DFyglS[~^nO-X2t5pKca.! `}XG|?%X_W`v? d^Q-dE5jyQQ6=l9`խ.<ģkл`T-L72qp7<`Y;O-j{pz(̓q#}d ܽ*#]wE7.*ck9`lfo)-\!^ycBLaK ^6zӵbƈwplCkjWefg[Bʮl]a!dթR>;PN[;Đ> q7KYkpҖo@BoIa!eɥz+@ B#8e꨹pVG?Gf*mҀkd}ғuv !F XY%o+ 3B%b ~dA2;ʕo {X#3:'3ȍ~x^KbV퀘=p`ՊyLF(*86VV  ;Zu}t\Zcz;aWh.v8ո:23Zqo2nI;k} i#$L,iH=l;dm "(VXҢțx@8s?B`,1>0_㭧Bi%e9 +w"\okQP,g M/MbjvJ; ol'2&o$4 h; / }ŵ4^nɡ!)o^p| -2ڢpF!`vM/T>jGj0}k#.i#՚|B6|l\7uC8*~rHeܲL)d +WW:xm4YOV}wR-d#yF|G:B ]w^91{>GZmƨ[.Ϳ{7b2~ǺAegTjWЊ) +/0Fsb⪜v$-U"km?l]ހHR؁TU +c(Zـ1jMa۷<|8-y(u;mͶHuy?OU#]ǏR+~˗/?O?~_O_7F__O^g d?_᏿Lߨt AQ[dSAIX8}'o^9yЩ4+k6 @JVx?Km}o#=M^2q\MUUj" ]pW'$ϴIēT0Љ,-?CA8 ȣd z +i diCΚ@ o=:Γ+ŷ2ة :`Ή<{|y~`c5̀2B!0|%{m tNM1:bӲn+91jnhOX/J\i* ±b)T#ɡ3ۿYk(x%"Wri]={/?}. CL]-In+o7`= oEȬ=;pr0IdKe|OjH>Al|,(;Yy۬6@}[+ P8

Co*K_ ,65rv$Kqp럜2iΙ%y: ԏ[ { !sނi `G[}WAMu3y⳵Ȥb=3,_o 8(*΁ O5dK@׭w~*Ķ;+S bĵv,q'[zkNQ ϡĚų6JMPrg}_6٥4sЯN-TF8DZI[gI >UF\eL6v>%hҜz0p츔ImVƔ߿>e1+'}W uA=mVش׎%vܟ"&O.! {<g,bټ4SvSYb J><HNpMeZ)ǥy|<ERVWh2735Ig'Mjsn#X h-5#4^P`Ќbsn2p5 prluUvPA|AQmq+p+Ksx_S7'DETh wx\W!goIJb|@z'-EB?wi$d;UHpD y(v `& :;}G4x?}Xi0SMhvN&}[oLJ^!/mar⪓2(#NM ą5!}\v?#W#γs%86ىwq5 ^@U7QpKK[9i|NvC'KP잻 ;f6iEC`ӡxH6[Ź2z/oC-h[ UMCA!?D=<𫹝m) !I*uY5~Xb ysesӓo{tF[ߝpE2`|&f)O0<]ίG xB ^,'Pr̃kv0uR/ۖ W2ޥ}p +^'p\nE2Qa,]ItǮR].&jHy0{1@+gWe@Gw&=J;r1Qn;wӿ@*`Ƹٵ +\|_^ #c|AVKwS3B7w)t1t]?{vzGæ!3smLJXz6;o7zsf8 dܠ0r;MŪ $ +q^G -s ~ؼ0mjAp|"-NSEZ0+w`:z;?^֪| N#X?% i\ӏ\(Z<{;.Ls iN\'x7\7mX4 ^n*6AgDZXsӚʣڭ?Z-љ +;AM`o=nD̵+±LTU{}ђidUcGN.Ed|Y BeɵS(bfZN6S1>`"uǍn,kc'lB +_4*x8E>-M8ג{o~GtScHi}ޝ!mf+؜\V  +p6/Xv|ze3Q \ܹ2<WpUot7%^޹rbd.|C`]>NlV}Y6uZ5f;O.ε-h*-֨*^yA(>Whuwxgcv㰹lY&94}KUr'erؘ5bmHd*dz>5[P[&RKGuZ+ZQ'0GjԦ5}6\;(γɤNI ǚw;^k~IN+f߯C}A: 3YFPFGP dU)|ornXΫe8rZ/ +ff +QP'ܾQJBv" 4+]fyuœTww-D{3/kn^a9e%ue:%D4k@*Z_\\’Ji#}}:6w:ENIž)(e{̔DB:g`{w=W0H^ JՄE xN>kja fKv<ۊw3@/ڥߞ15>*lV$# ,X7h1 4M6_~WS:Zx&xuy P'M3(al9 +HX,>32Ϊ +]y-wl6 iLhTc>8GmfTU3x_f)<9$G$_-3mƾ]΄-q"n;ωZV'Jm|P$<ʼn_ M8CX3a)Ԁ؊l[Wטota=!='y籴RiglzgoLB9.<릏n$ CRjTe7V陟YwGݰ2뼮±n*slH4t={LPN"}`-J /Y-s# Bpިfg{xhp`%"ɸ= =hgxi\}m(_{0hshnQ#-К#ߪӻpe:Zc%$x K+aaҹ77Eq '| ](^OdM܏f!WL6,:rG }@] syױɫ& ^=w\qOHS.AeE6,0N԰oPWaC2^ ;3n5xnm$hmYzc_a$9<p}Tu xF,vL4ɽEաξ u9yeX@7ꆑ}PAčiœYvNȓȆ&(ble o6bu8ci  `fdV g>l0XN\zWh 5[5GFk`;ZmvvIGXD F\ +csLn/õdPB܆bF]$˘)$^+}:-#1AܒuwyQFplWˎ-GAYYKtBȺ!>}F환p y;>&!-WlӑKKJ&Z@pSPlerY(e}]+mt%(?k_h`3,&H%ms_bц%I0VΖV5POgZa ,5( ޜXCAG.chnpw:cQDYdw`YlZ,' F.)aژ9wp0F"B1{ Y sI6ɘ:n,K6#Ls,;A"4WWR7Yj8s'0!h/5>4T痿/ۉma{%'\tn?rdH ֦K-Zhc+{iR;Laһ`(IJ4)Ce b\.Ռ@DGM6琨@o~A|la^/EbbE Ϥ`v: +AWV +s0no8kcsL] ]:Y/weay]Y  X)ZQyf**ɧK\]:=? +Rf7p/q3[8Eg-BdO6Y}#1{Vc))T`T-wT1 0 xfP<1}W/?߼}?~{s޾}}/n"(}u?El,MȮ?짞/xɷ_x(7?̊^g8d?Ōvغii~e[:h]L8W;HĆQ)Qf7qZcl{U8VU\LuΥ3jeJtwDc܋W0)D@fL] Yg +  3m{MrOXBn]Rbt2pSԼÖ7}vkĘ +P[ Ib{u\w@X?ckԮ16͵f(z`T5G5zXE>NGo̼v|I\_5lm&ذ֤kkYčÈiB33 *X(]SgE^Ɉ8C)1;2doP%4's,FRk၊ǏZig㶂%α;O Al"SPlxDX,K+'8+1.W+04CT0djR̛!lB,\b9iAk>F *L0 +xwK^b82^l-4)M^sN[X|n)E;9#U-@5%7W&.5:{%ѹZʺs +BaE-X&Bߗ?\C h yxrgZ]wK#k7cw<`m'2.‹ݣZGST~Mv@0 V#܏PfHcLO7,jZ#CcQ]q -(PZ,TԆ )zZސE Y9]nߕQɃ `* ? JjaVM%^$%E,(Z:q)\k6" -xa'vjNh> JZ뛸:ƻ]H}ɋL%w~ѨsU j}X ͯ{$ЮAeTeg& *| +*a}~ULH 0Ied -cK>ٙB $N4pѮ~X' ė#`ٴ[ "H9vYoC5?kWCYpIfW}qq7 &+C(]2R?醓GȔ6&-市%Mޤ|3(5clxR%p`sɎ7_n7HlXηw0>1[m endstream endobj 13 0 obj <>stream +H|ݪ^ `wRh-˖gSJ)NKr0a%yyoSB'ZՃCC5/{퐖d/AIUVA!|Ҫpޏ h \Vm dKV'Dפ\D)JI ͩ8d{kzpvttK֬갫 +ͿxNvQp}\ +JǛ>1ji?$ |~½:S1œ *lf,ZJ"(8N8`OCS%<`Z4ߤH8Bd" B]ܟ`nU7,.2JS)%,%reewêtzln# ^As&LvkEjpNWzE=ب7pXE0Uw]_}x#|~_ ~r?w?}|L~_|#ʏ4}__@?=w?%=>?kE-CwP?l߽YԷ zt//_ 5~P -(AOip0W 0y;h3BO #0wϲ Dyja72/̃WEmoY^ BYV]zWs%1sS, ! &u@`kYL]U!o$(qCg-N`5|Ø=ƠJr\S$(3q*:Np7]#VX.}xĮjl6.;gqjh|zϲB>*1jFpzbO8t]Z78`d1]e%/:+r6уCI62rBZɎ)l琙 -`ڞG@7vбud:ϲ\ca)&Y'ʜbA)X's H|2|,O6Ξg3Wof+#iU5ǎ9!ދBkG;IskdXg#pj10*8`*/ h ٮ+kotdmm6|d0js(ܼ<ո*Q8jHl#[mcgkɂ"AXM ձ@[&f(s*rTMVWV v): 0Lцɳ ]2*:z]0KLKav&^8eu hV-,L݉DW +wiB͇yTgUf۸E|kpGrK],^PF״ɮݕk {_0/,;|][oC}S iĻ|SZD@#IԌ5ծc&]1<0[X*=ױkop/< gLΦ-9oW%t[{^P1Z\VVVA\5A2*#&]ax|:4f"rEbKH zm95kZF +:4Ǜ3d[A}NKe9JZMI*Ҁ9BGԞ{RtrQ Mv6b݀ . +sPL3o@PFz\tQ<&CEW5b $QDWzYQ{.1LU ED0?c˒ra`Q?5WmMbK ֤%op(Jtԩi0`æff 퀶:E@~:5 b\;v5\K) '\|=wxs..H}-5b\S7׹tȥGj.AAxv 6hꨕ-ff(hvׄP?{iVc9H\,kL'$7QH_!J Pe}x~ac&[ZÔ{\eb}w8KIpbn!ѽV`QsjĶK::1Zja³cHd̥m!1K6,!+#ͥP5tv'@CUjaLHcBZ{E#0)4]vWOEwDSӜ gp> xBnl -˓,/Á|1\r,Mq(Cl$ 8jqI=i Y _~r+{ɳϺ"2)팲+hm|a +۪@!%UмLЦtyc.D^{¢8]5c'9,] Z;uIgs̤) zmۊpx֒`L"ln>>ʭ֪77Do  G4 Jh0i!] +PAJqV؃\\![!a1ʪ<ٕ>bb8#cp'}9 +aX֚RW*{[]Ǯ qd53W[fqisRbޱ$fUun +HYw,:@0X;?$ͧ v8/^+_/fͶe#㘜p8eս ϩ`*3HaVuvt"{W~i}-~U#'YaQ̲.j}H_2Ε Wf)0^l,oFJ* +;^e\ܡWPՌ69"lev!q K-v: f41ہB[qdyc ! ` +w@x/v8G@8*VM\2p _VӁR-L:;8d?&B.wlfQSYx7;u3FB%-\nѨO, +AOfX e'{hEEK@/qou|+9ff/f8n1g/"ns|}Xyyvն.<;!=/=qa>4bڸprӋK*T{@9^~]Lm|+FJX_U$yWCۅ~5\lM״#MgP Z[.}wuSOF'SqFOsmOpeo:!t% 14ԃsK.eL}"\ 8uyhm5 Gē>adGv;pot.l{Ziy%Aّ[_?@Wd11 /_̆aN' YGz}>AuBG螅yc U(>bWwi/+\kO`0G^~Ma0s-uxn x͑o,7yۮm IH͘g]g:|rIB ӲZ+:4Zk-^S Y|* +X;b'jb/?:tYv}cQ5/ + w7p- zČ0t+69ժG&a̳j콯7u͌;6-7ɡGl. +7|׶ NtWl5f?W{280ҲƄc1E-3]?bNb#h>vNrX. +<- Olۮ?X |aKU\_:FEHcO{`>c0!-@4tJ +5 %;B7#<=#CTŠs_"_I*H ⑨0S"m̻O)MmMjħnx$"OpZ3h5T. +h`QI+sb6ȭݱe1ʆ.@p*:tA'wKPDվ;nVV?2#+ws&B{04bۯ1b/ڽ,pAʾ@k6S8,p Ͱ XnRP(lsUelyp)oW2ە6변P@Y-iC.32AclU;V{8rdҽU cO;c;RXkXo366F3Jc"r%D凢t\K[#ysW;ZkH +1jWO?Y+N}}ܱHNkX5ONw";kPe{J:Mfk܏XtOT{%~ 7FZ u z)Ӥzh4Qؗx$rD dXvBT FgǷ퀋4:=)K숇{ꞽDb8a,uE"&w6 FBš^ꮫ=9b''ZݒΡ "@40$ƒ]5.(}˾D+ߍ[u#}"}F\}bQ;<)5@\ ײp;f#z +XebNxXhmſ&3يV@߆G!O;]"_fvǣ$ѷe+'=y>XK]Ͼ.Mg^v">1`O8hV\o޲ǦJ4L3V^m=\W7d.KwYw?nx%hzVtD к$QW5c9չ0}4>1k6vX|$U;YfOo&evpᩝZ#/hoE6i.YWwٟ]xxzC )/A"̅B> oHa߽@)g8#m2{@Iޝ9ܓ?6DA_ +~X7_y&\PmI~[,9ѨmK0x83g C+i@bb^- +%'d?P{xbb=)QT'T^P-بDFɰiUJAKwFIGڛS H9>aB^S|/$%Q(l4Vy\Ff[gͩafx?L@t0eeq%t2愠2PY`4=e9 6M-"< 1x`D]4Sq̄|)eBqiT8&Ց6?@q(UT&O5sRlX 5xUƁaƛkȰ1(i9N${@$wHN0Fmkh1h; +ύ@qt;Oˇ}5'0h:\^fs _ +:HO:V!,$3`z%v9_#4qP~xv۫v۫.vNH {zÉװ}lvk׽vk׽vk׽{^S"H*4n+.+ڃxA6|&nC`QI{7*:A~n 3^Mᔤ .yihi\zXNXkE2Lt6\,e%8Vw%m?5jx֭ӿm4T]S.~tMtv49#qBoQS$>l]0W@(<̓'@Ab,ex"It䶄=1Hv`$2T GHlȍʁK];&-9><;ICJ2s:eb\U!KP$7],9+u)F&uЪsTM|8$-MQ.\Sh5i.-Fk-U֒kflZ=="w`$.~\zX֨ϗYNboUv|;f*]gK3 Aa:[ 0A~,灥͡\,L^#FhOmu?gf:| ]?C4n9hsNN.|vgxCPp /A6U'pn^}KB)*"gj#G,@q)Y;pIW *}jǂ#ځ#(4"a7! ƃ(H)au,`xg,_Kh&KgDMpO%$ueUK{AlJC +Bd'~mv 1xCWx*~\zX֨ϗYN< 8 Y9ҿP|_ߪ$opNK HˁB{B '^Ӧk*x.C * &bG߀g9(JYaҌd;wc1Ŗ yv ? y`ishF<" 1ȭ0Z#SFGO_P\'qUE{suBu;=5x&H G:sSDĦǯ +yaj,)Xpp5E +d$J8 /;gG/aDyr0#I\ [k;w@ p 9/rb5EkU \)6ծe_fah-Մ2[dB޶D|V>kZg|ZguV|]"bSꋇLk`gxCPp pdJkt۶Mm3zm߶o-9>)B+'®\%\db.wdEӃf830e.O&R)ȍllfW[;+j h#'u.ןy3:@kt3?S/:Pqw` 񒨩 ]@y"3 endstream endobj 14 0 obj <>stream +HQo8?A_ڵ&mq~QI׻&G[Q?Z#9{Jr$Lğf8sjDo1z "h ^kMDД An? ?JSa69l5€OJNw j?~M}I2x#-a3Xs= Im)i(0h]xt¹SE񮗉3< km$0'(8ӊ/*5AZz8p8d0y1\|(3:ԛj*+#[lV.Fˉ>R?^ > =d1qF3Ъ՗2"BވhCL{jV,a5kj<xZF!lyX\KWzT`i +wGVds6!7dq$NdIpJM\ 0 l4+U+.<:㄄Kngz/dՌ,)Z`@Ќn NN&D'fV_G7 Hnp7ܷp a'GCω%Ϫj<~G|n.<&Wcޠ@?AS52Zjftkt~[:=j"&' Qwexwz E+n Q,Ji`=Lk0a w=o?&ƧDOa+Y`:˵:q*hD&^'a6OWƭL4\cp!/ +^4KXٻZ |SF!l#lɳ}1whUM~5)v&!ڿzaӿ`ޠ =ҍI`Kf,gXOw+G jL&Ƨ Q'Do W}"H}@ ~¹SG: `:iq>WY +ޫN47iC5gaSIn83).:>kA -FnOBͬ n]A(1no702OƏ KUx/ |zitEt r(0,;n%j +"O CtuMrU֮,$ɋC!5螸mË9<Ҫic<“pfR4]tREvљ;P3UV2w܍ÅAkPDG=x]¼cJgP"{N `Q`I]QCր͔pC=;+\D'^9, +؅&^vOu   >58D×hⴽT80wz؎wt|Gwt|Gwt|GwP<_I])V!Z>s( u3)zzA["~)B +UB$ 2>[i=r=^6./tYJ?6̮vT}cT up?N/e6 DW $ Ezt"XlIB`BgbYr;ov5m-)u6’P^Sn Ԩ,cݳJ˦!b֙PVJ{*psbC2} JڟȨE<.7 +jw 7/ qiK=,`^j +{LS ·)4BI#gTPu E@2T3Gq@S.d|XlD^w/_q'XvG =kI+F\7ӥRމ;;N[.mSrn,uqtu65Z>р#^o B,h_Sb8~1E$chF6hOUC:^f&=~- ,qNf$X>U~f9᳑KËAPBIh/mi{ +WIأ>"W[{V*waTp!v0ŘmwuO_fa;A( +QDZ3w +9fD+?< endstream endobj 15 0 obj <>stream +HWnT}HuwU_`İn &kx}NuU_, 8ލLMwu}So;?,'bzhrv<;ip|yd)~p^,g |wyqWYq׉7|)Ӱra~Ƀ=g·<wxx6_}K#?鯜rWjD\^ꅵ{r||զgG덽ǿoqlv4ԱS 8tN6>5 yrXoQkl}pb&&mw/hHݾ&9 al1[Nգj}[Ϥq[F?m|=ܫwn<:_?EwWecǨ3Gig6(/, Ljɥ'l}ڸ2./:|?=a֟L@O-7͝"Wtz~ZÓu>|iKDi3_7;ýo˿,Q)(OO5loby֝fxXr}e?7T^B\3"hB*bWc,qry+HhbKcGb⛟ϔST)9sI-w#e}MmdY*?|jGӈ@{1V(Ru5(BafƘ4fdR PRk5"cn/efP-)ޒΔ y+TyP'2I|$ CbKm#o^ʟHchZ~ {UM K]V>!ݭ{8дIJ 4K m.+lP*nPH/"\MhZiCJ! + R;x)VzQ2 +F̺ +ܫQYפd.leUTs5K'a3%8`U#Vd]E"`HpRY1[+ufdC\2纰:&y֣!!f{k! 2^$)4Ī>&ou.pOXzQAK,RtAm JmBs:ܹ;0ӫSh{sm\8׆͵As]\ 0׆˵rm\(׆Ӊ )t +S)66w`Ie8:ywuy39s^q3\u-\i]FG9VScPt dJ0UagZcC!id zL1h [sZ,$b֎w1-`BE/LV`_@W! vm[䳊CVdZ-ЁJPZH}T-hZ(r򦴊5fNb U ʥbva?,:[iT^ɶ +bzu鰍R)3ϺAzIN+'}B]p8Rh%͐;m@'OV+]}L5WSV核zR5־xg;aLrv?NB3*m0Q'G~v0f@}%׃D5N>V=8S72 l 9tN++v  ~]fa-B=]N"kcNb=MRDƫnWΣ>yH6\'\D B!eS]=Nlkgj&)p [CrJ#V1(]đD J!D}pb R>C9@h(O ڹ3^_ ]aTx=&oCt#Q`L &t^QDrI`Fx־F̠>\ҏa[dSI`CLEĪL^J?瑙[Kka3Wl*D( EABz<-8rb*!V08 +ɶpOְ8bxy4+j a`5DnV"@H(-6a[']dI ۇަf*v$1~&ȑ" ocQkP +dtI=B MsE&tZL&en.-_MEB<ީ\G7N#Y&~7%aNt<:$A܎JrQk)k: ibJ9%Fu(`X"+FjZP !j΃ɍc^jQz]=Y͋(軤3/}SۢJ1hG޳gmѷD$tU69C&{y|zx3HAJm:\L#"8^r(#$EAlu pj!=Pyfg fG6/,'uoT]`ם#5[4;AAl}|ԡȘqx ԑh0Z=*B! jrn6+A S2$+ +p ~3+es3e|9WI+=QU]ʛܷ .Y.y[Csב=StRlťH+ ⻂XPgAR[8Yn3lU +A ^{ ermS 5VP K"wf:!tvœ zbT#":AR acXkl^aQ&ьMPZSIe^&q5Dfu~QʵSD'(Tn4(.<;W,|Jrs +EX6V ETmm7$Y,ulk{Jm{Zq飖+labB63â.M_2QV0<&Mw+ e^6vZa7߀m(1\1]4N +1#&xJ+~My=zr7 gwݸk:f⋙8,Xc|xFU*j{e'?€|sG22<5Eb~v߰@6Q~8^aA ۜ홀dJ6 h͊skS65n =?&k GE+[)aA97|m3זd!p'}iB\TL!NwXh͑v44njG>zۥe %kr_K7>|3`10X]8n~& +K??×zs?\ryb+{OJI=/|/?zj`*>i   2AcZzf§gtd#l~XL7w#WO"c='CL䚇n1}k K'h/pT/ЛK̬N 3kfXB5ozm"t5?[|d_YN6x]hXA4 qS, !Čǩ9i0G?XuU4c;O1,؉ɹJl0&]P}y ݟV]-FIpI6)E^C$v*?KX`<9<XB"1 NX;rlY}jtĒ靭]]娵4`s01(MYN6b7܆< ;E_<*a!N'a:Yc2צ![BJP:l^/㱯ۇ딽ntGRe}w %Y&rIYx9^V#>1dic/5ߨxwK_]#R> IUq_,zFI_a,{I_P%97ww\{s \[='a6`q #!9j}gz]zi\ )2YX̖eσ +re8<\MyzNvB0!Xԯ5$a3[:'^X2%uq.QLQ6Yf{uoN{}][ԃXmA-T%iXB-r +~Vemй͐j{, K؋+ &w|'A`?)$\y)B"XdDeMjpFgb"_d[@)ks(5mo7%đ"Y2;9q2|s%;ߪC_Ռ9LE"1ɺyIJK>'met3 +^8!oqe#(D PJiL_Sv@5qAı<P>Z{ BTԋ +AaD$ʔ`gєG.S`W/ vw`Okֹ:psFnښ&cpP%rd!˿}wo~:~Wo߼|c%Lg>_o|B^^TOt|9 Kp6--{ +6Ye7Xqx_ ??=Kg%ϬB;t|m:^̓_| {w~_*ſz]p^36=NK.n~p2O k[Lk!Im`+~h}i2E@FkOfOxvN8̬ipmHLY# mM“<89KM0mnCZuo4/nzOIAQf#;y@ a6 zm~/1F E.[MNޠP;Yҡpvh>8[uJP .,ZyEx5xG*.l{ՃAOWue4aOi̙tJ\[͌9 +kfd4=9!L!&%د,0~+f~l(._W8F˥zg]+8R-\8ZQwgPS731J`=+s KaC@cnT5ڈjSP.=xy>źВ#2uyY]ْT.YEZy5N1NsXxe9,:9W[ `lȭǩ[ez0X,ia^^6Cg,0M00xB 4e:ܜQjk qˏVho5)'+̙bW8KfbPy]LmFa*78vK9q`3ߔQ">M(iud@if'egh2t~`H>d era F!0hr^qc涆qI۹~A0ٛˋW/}w}uv'sSx{zbm_芯$OA/TٴTDAq +zI/|)LG?wYݗ-A6oW!av-\}<.=n?vNEZtS` <ϸO,nɍhk^=V};/>{?uGNu_G#'{x^_􅲥쟾?Q?ESlNm{BO|λ T8_0  NvAE5664aqr #ڧOd.14RFYҸ)Sb  +.blc+)C6fRF"i515= ߗa:,xZ*auh砻ձ{2.["Ne,!֌}d"6_ rK: +y5ا~Ղµ * WzܖBw5{ʖjhˆqI9TL,)!mD9 +m9/Xm<=?[ۊS uXg}ɋ>bkȁKQՈ1gAze;"@w(B6"$A߆BJ3ϰkX&iKEf"c-ݵDjU#(KA1g`^ m\᪩aB)A2<BU#ƒ[*N\;ځ?үy_AC@H)b-AE%:cFjuW0a6?k 6c a=x +iQ,#j[n!̸%Nmw[p9P_8 iQ "Y"_Iy1V,g3]MT/ة-ps,;q6s|JCVmpxp%P\qBa5Eq3nqAK\*lEN~IJ\\AL 8H WԂ Ip/35=uCڢ$b F3׸7!v#jta3P9}\L$j=9`:kcSpA yu=nRMQ`|[nfVvF>[3i"^s+A 'EHJ}u^fr=O pN|\16j'U䔪.9w~~j%Vfq.W[Wm{pw^v{|uwW7m_^zF˃CRKLW)~CxFerϔ;[~(< * q-?#:8G+}-ɓu|z Onh{aaU!=d8d6^+dzWB^,ҹyyMmrwozRi^V7w.WG VB!L \k%=7J+/I =f42Pn4ZESbT6[!vMНmq iZny#eRJhղQ_e?җztq&[uH/`Iv]]]2i$dA[|m,M1 +$2/x鏀;/y4A'7bN)s]`yj + uACRЧ~Ͼb_Ѥ=\h@Ӡ +w`9ˉh`d=f1Ƌh9T ȍP|H;HaxsNj@=[?p $X5R@iU;0Boe=ArPe yp?ri\zתvK-dUaAk3)X*ΰVQANױ-:~ s_5ݵ%qާ9T&y]Zs_8 9jrJye߮7W~k-QiK ]c0 QxaЯ7Jn ˒m^CKQP3o5g ƹx$LUNq +!:w2dטgjr5V ̦50v$@RhݐX1O;R;.hR7$v M✞nLp>.N!I@`0P:R uZ.SG+u-<:=Zu5|ʗjaikObmN9Zðp›?98 v~]ӷ%mkJ`$&bDYKT0訽*֡wϴVEfM{i4q?>1Кb*~__]3>~Oo?!r-J?#Ӈ~_06L︆N3rSWܙ]:EԲr$QR +'بl+N(sR,*p/?(Sn`T^r,P}4HK>B]z*4 L\ tW~K S=~|8O.1 ޔAAr +/ڹVsP# +$;pmB6[׉!eT,OE˪$6N=U?`XX&r\Z IOH'.Wo*; yvy28̮ IK2wkwrS)P 5>TsXTVwڄ)\r yi6V)0zGšmZ)Y7XA5oy`v2v#YHrd;Qe"N4 y\Z1xk7{ʘMyWhE>_X\?S@npaa*P<'YQ$ـXX be8K*Loގ")L,+ RAB-ĕg@W5j٥!J\7O +%^?o]M>sybRN,3_XV Ǵz9-sMW8ms,hh7R~ FS9 qU@qH[Q5Mvy!vR1_𿊫flA=)΋vn'ͫW¸ p3T/PDp ZF 7ּVT5f,QPr l_)~Bn +6g5hRC"_QT P{"7TŃY + v9Y(;4M!*͐J{^Xk3\R9rSSg +*)\~OѼ;Ŝt^ tGf^)SaN. _DJubXhij^ TL 7]vחLtiE:2(=MnoS.;qcHªh=E5nYA)m"xf:T7S",)O1<8*5j,nac"IVJusTR&"B{gHv9@SN`9 ١`>C\!blҭ$&5ǵG=+Baű^fQA ho|00Imf<N+0FSb4hVl] 9>=oUVn.=1֋#삥A + :$`IS ]'`: I.WŠf6CC|Fs CyE"?ޚ |.XR[p#mݡ +‡X#Dk W0}OR8NcΝho4!,4Pj;aAmCDK\2^癧a+6siP72w P/`.t. +F +TAreCByn1N;/C_ĂnS1T h kc1~8Us"@A ,Szuп 53ZJRhIPHw6{DckEXGuʅ7#OIPF>j+Լ9l Ćb4Bk1. W/TjU\U%bJdr{8Df=PTI3*|yОرO%ͺcLƑN#bfls9}[NeX|59]tγ䊍OX7jq"qFtC2T,H,] Y5n lbGyXvt:{&zXMV4Rd Yf=;r(mہ(츠> o4#[QU#h}J2qvd;+Dt9Yl~haOG@jqh,Vrt/%b?f4an?zGX/Er'U#ܟ#ܞgg77~իopO>_.PXwl P#Jg}~@VKu=_kn~yB_Z_?Rszp%N?}HAOᗱ͡YE~^ljOL}T +yҒ' 7n IQ1's0QH!D84 Vh7BB/OiܑON W0e>rS7ʍv Jos1?V•HZ.ֺn:r4VF%!N!&hҊf 6vxpJ@ +cYusP(Sv0Ha"Ojƭ5a'Ma9*Ic!On{5 1d9VigY50jԝYl:ĵٽ ~*f嫗7rT%hA2`{\0F9mo۬(hZܐVZ.@e0evhߨCRJ>f*€ɡ-)G۰<#;haR.Q\إ߆Dȩ6d=}nw`|wo[='>Q?grҖIe3CsuzK]>.-|'Td'o*{a9[0rj!G;1c_A%1dYqRv36JFRN&<" |`7T%eYiv’W{Fȶ1Ʋڙ>\j5gy jGh]=N]xUmeH[UMFF\zDi>q"ƙE6"Q9#4j&=D$Q57Z[i=w1xT`w%(« !Ujm!ܳϥ,:"L.wu.Xji2K?}$퉨 (Hu׌h|D>t]G`- 3, +-Z:Ϟ:;*'q(=m]0DYk(,Fe/mB+u6*0"`0@qrp3 9bfCšpcԟ#q!]_3J~}xiKi-ې['ёu/xҒUJ!7{shU>F9G2fq/ӚƆ9;z9~5g1)"n΍3*E\kk(z+Di#>D,n49+\4FLf$qwS` #|n|V37lͱD5W.KD^cޢBkIr2 + f\58ǀc܇-201l0'<;6?6\|DXgE]a`ƲK4E(Y3Ō0ʊ!#W19UDn4M7\0UKNXsǾȵ-6Z}IþsD7OR^N3{֫nWۈʾR8o<ϬY[9k7PIt΀+ws7%ְt0mR,})8KSdDKԄ,LOQv` πѢu 6zkIdikqP|~*"'1r*b2!YCa0^4f?ځeV SA(!`g<pS78C:βSvZ<,E|(z$]Pgbpz99xn:]Yw!wRgC=iTY>};sӦ⻳i|Vb4..0YE=K;hGf,HMJ/jLv"ӣMNR:gl» ]To> (~S8JZR  yDC%"$UcܣGGXy?P١Se-m +Ō :cWn/<ȞL0:iMc^PGgSRP,OÕ~kߠ۝ۓ_w?v<~?ؾyuw-m +Oc'P ?`쟧 '=2=/~S}TհG){8˿{y_ciͻ/};afLwau +]I1 i8$$/ZY5e'X0M{gzPDcqAHN3kq M,BB)Z?@Z,83 *dyVIv Ige/$ˇ炜 oy.G'{zka]FȲSHzM[1"G|>tM{ªZAS ;F%((A˙mɳR4ײnV ]FFIJF**-К4|D)0}rKc bn!]a!~ + 1 p`It}obnǡSq#X2]yC~`u+Yf5hl&wa-]6OJLKڹh7Gŵ@۱eršnrPߤ#۔_X +4}XԽ7ݴWvN[qÐ醬 kuAdXv=b fҵ&VWa<0r?CY^"S%y#줲 VpQ[{w.H<1wY;dEC $9yhM&}cc/ F\`r̵<9r>T9!Vt(. +iR_qt)IYx=>_E <|yk_d玐œĶs*gE o}di]ڀ?M$KU#~bvcJހR4NvFHyX! h CM8I k"7DB&+FyV`,;!;Avf9jQA(}c¾]MD󛮷1.j=_=ϗ+{)=_MpOO?[Dyd]5fJP55EWla{n5ae +6o:PW03˸3H.|wHa$!~8T6'||Yޞƚa,}RJ:Y-F[X;(e6eY N= Sؼx"y9M^BIU Z/ Us)l[!+ !)Kd + ԑL v80^)*VYB=ʗ1yYIis8m>E*'BFm$Z&LHrbʺҖ̓?f=.82[ +/{՛ѹ"!TbR/c(ShЛS91n[-Fu&d֧ IJr0yuN+QTLaA7meR!<up\ho9/[]Kj\S]XVҤj!ٶ +M`QT2a)O\DG[^Ēuzl +lKsWu#b$00 (WĬ= 0h}}85n=->stream +HWn] % 29L+6E\n\aKJIg R ppH55-R>JZ~Tz*sōURu#wja,-Ke.H囃& hV $9dn0fx6f p]63pӤf!u!TF򓆋æKgܮaƎ-UTQXR,H9;pW?/Y6 o7tV B 9xc{ܹw}dtypq7W[B 3<ʔ ?SþCR zȣDq(C}laZx0NO^kLw??A:Y͡hm r̩g`{ɂ)s5>>^2j +)O|`Q)z­H|At^q7m\kkOO^|>{<,w~:]~:^}]ᗖow$!O|M_a֦?_X͘umZNH(LC{ҵ58F$̨7%KSO}vt\d'7kDݹGVF>|p||u|FTdH]UK +/4 LHKhJ?cI.*zZeWmtUoc̻md֌Q5#pWMvF&sH4MViz +DMp)+nlB箸|䊡5d7͛j! ){M2Q)k@^@#zo2z@{(h?@v#.v!gCPB ƜLi"54 郐XKJdB'٨P m&jNx.*Ԉժ.'w6XA;@)sl̔J8K6$HʚV2XeP-RMi KaaYQy\!j-mVT.udtV0R>h쮓Q2 7ˆsujQv22:jTT⃫q$c}a 5ehL+dڳBC9pNsێ[|Zbrr &yv"痘xdݛOĮvw?~x<_.P8%m^[iD3jN˩w1'!v,)wV;IGѸ9`.J?Тhꉴs44jqMXe3VŒ:Y$o^ݥLvFQPds*B̎ 4[uZo. }Vu_B'@x7f_#ꗝ$caCJ`\9b>؀YCe%kxcJpa;8Ez hQ^Ȭw]AZdhPBB=rF2x?B4֤ `$וc5YUk¿Ug2,Ӫ8gQаDJ+M[~vFеYV`77F923Sb$J2\|xsӁ S+@'/{C): e%<10`Jxc}J@,7,GunCd?hīM2 :BnLF硆I{3ZOAAZ)lPǻ? ʼr}&}ќz6-!t1$*ݥw1S쵕o<9jjdjDptα:<ڽrjM*PA;+Ľ)uv%f`TW'wd1C"mH&~átMtUKH@ГM +PbQ');jXxbP3%%] AHzp|)jTec~ݒ:{39jJEU cPLj* BU5U:Yp+0@Ø&!OiIH\Hz= +Y&z/qmrAT:dƔ` {e{&Fj*1*Ucn5ED t "_l4.%v6Ȧ_lUOw87Fy"8!881lI N4 vYî>22c!议jA5o-~>?`Z|j0Y,&s6з0dw7a ĪK cav{cB;xvnF/6^jf6Z-b4<"41Π-T$V /(IpPpae^&Th8dpv8]PzvLhA%Bu`yXQ}eK`ib #&{i]C< Y n:13q3`(0x!:M^Ƭt@`tj5PG?/ X},֦7Udp'}ND$(>8~.R-a7k"ő-NČMpz@0s_Dx`Ub {:6-84[rFqr& FYIq;NV4rЇNrzo~,w}a9r8??TܕBp{6P#qӑÑ8l[4Pԡs Lt +W Ҷ?F!&άVRϑ-yu ʑZ`"1+l/\SِyX> +U2zhqcۼvJDm>q,ieLҙ+O4'/?{ Py)%cSw xS; CcRꪑIOACQ0P;"P&`?\i|<~@Fr|,#)RjW`\Nٿ%oj k0DS Ht&;SڪbG$ Ճn5mlp,[qc}a$hjٯY^է=DTm[zanױ7&y 's J +\>&qBHc8:vyyk`sSK^ŽJDb{7!Wtm^>5߂Ip=Q5c{'7_?qonE͛^|߽~JOq/ɇ/߾~||՛ts/o_>^} `3}K@!Ͽw_XK7OW aITXIRgiCrZEj:#q(=)C^`lKEʒЁj`"2 Mœ: +EFT∘$>kc)ZO$h@ya1F '!RL {HD;u尯[b5`74N) ЮP=7[ĠcF/O̍ԲFib(d8%j 19˯g2wkEQWr +Z)gX4tsfRD@)J]Bޑ!kcx`¹y%|\50D(Wܯ5؇Ujc}N0廙uqu^:k=G`d|ed>dnfSŨv踑Lr$Fe(7p%Qai,T)̬E.Xe3fTggYJ.]Za;sw,+i`&'.:hޠ2s8)@%?qR'Hܼ(de >l t")38 v0huiUؿ}ŮËVR:^gqtA#3] E;3HDhirm@jۙ>Qk]C|CM5 7`cwHYďZG{LW瞪l8#.ټx[魢h&@/pQ}U+r&/([=2ի8wo@{H !( +Ȁ9yU+Y>>kXrOtcvvɈ8z @DgXLCaqN=qvur5UťCǎ[)Ѐ_|/T>)de"ّ^_8]&5-@KiG<5 +D%i ΄]@ 0 16~Ĝ$j@$:݆<%K$at=w2.~-"F!Rڣ& 4ʹ[MarZx^jy *513DQ)Lh=[,FrLI\1[ytMU4$2h9H[9Wr/.W!Y{xfc`H(Xi"ʼTl!״@p&Y,ݧ@3Mg {pT`qd\Vѐ4:P3H)Xmec8)̬^kdԦŝ~NpZ<==}C Ef׫fۇ?TnxyCpMj)!>oA5WP@-cc!S][mj$h{;~>jFK }/:)"bU݆f!*?@5RU~'nGQU!8Par2 NnL}& @4D6bL>2Q&ȫMexSR- {}@ ra\O1Zjd])CYjqywX2>49 E +YCW@¤rr݌.TeN<(CZgER,C;;pC<;g5'WZN(9jf/h!>b5py r0D BOiA*˸&;!QnYn4lgB[J;urYr!5Gq$ 43Ԥ(,{T(7,jxYXаʫD}B8jVoIϜyJ#=4?[C .gϪs9nw"BDG:J3SYQ"*0 CϧA-C=}዇wWO?{,>{u{OkWxɿ|ⱶ͏O޻Gϟ;?~|wO^Ʈ>/^=w}طw߻}wXwDrO^<~=<ه?W 5~0@kO,t;n}eƯUϜ*vmvQHI`ޗ1] 0H503#O])\kOzr"HiEWMh(YbLB@ `S&QfIn.1卷`D ++ZU}VI +p|1Ԑy?Pkk#TW:t{6ၥz^p/vKv\l"JҕFEVOTMgEʙ}ȠH*%@n +\U3 eRq[e&isuDUe9$^*Ym^ԯwTu| +pb(T2G3)T:2!:[ȑW|^HrgD>4 ʼkX`6:"C-Nl-Mjat*1/RMڠ*Jח7i~_QcʕR + +3,z Y̹ƒV2ϕL&iw+ cT{(۫uC4k1{$Z4PZO˹1CIZz R|sgцI2ft|ސ\&81 =d/ymzT!|hh M|"4gۡˡtg`u{-%H/˒"?Aٸ*;iEq#P0ooDFֹrzɮ>2#~ MC8M)i`pqH'm7 !~06.x($D.(OU!^>'ELɃ䰧` UFJԴ4~I!5 IaygEq;hb8A\05 &[jh%pg]f !jJDA (+78W-BPшq N9b}Rk@CROAUS,?j5<tjʘ CEM@4Ӛb-Ƽ0G0N;fI%`ߵ轢XL V9@l>^$8χD j1>G>+D@EkLxvEػޔIXr'ù rYւĄ6jK|3Q~G+qdɼc[tSԂట?޹sVg u +=R$u׳B3]!GtЉ{H%`Iv^4s@̳mwvAّ>2 `|R*X9^wГasf`W.Jt4Y]9܄_&`\1]3H'MAO1gdrm)u}s_?}P krg.]~hżADF突ҟ3ʝJ\ZZAEUz %@Y1@^KuهrytMk7U0裞b9:y'溾mUaxY-L ƨpR4#[s}3o~& bjˠɰxŃHa2*Q +! 2{-u88@٦Sw]tC5Xktr}C*,^L$D+r0iP0Mp96H]\Tmװ>D0hd-V#;j~{(3Ż ӵm!4q)f;ԞwEO.>dbFGgkǤk+v +"z2Wܚ-=BXMm{Z=!_HTwj, 3PbЄ$4wLś%E F1 SA7-V<1dT譂[WP*v +M*pR3c+(5ucC蘓>@ Y%[T /hMxVWU[u0ټ&)p? P'w9(nRS;.&cs1D05Khz>5"[&y`== %Sy Gxj +o*()otI4,sl3Q,~᳑n-(AMM5& b[[@`2梭}h[r/&~ +J\:83L*:ah /K 4CΰR~'am02bj}Y3ߝWUv^Z{h$}2 8[&mg}dqzKhXV2<_F2&!)~µݸ- nD:J@o&C9N zz1N[OhQ9!]C0U ^,ѧQwm#vVuiek&TƈhnD]U5җ=VkOEǖ=!b“uwM)Uvk:W3̢y[&1aqŀqy2YtOGCqtl /MiǯmbZh>@&ĔɆLGat*pѼXoYV] />8=Ԁ/,oވhWN  xP2` W\^N夣Ǔ&K=-R] 褫$y~_(_M7k6^)@Kp_bBfQq }՛ ']ev80GAkl-o5?PЃ띨ӆ̌y ܱ0(e`^#^]&Þlm>ƒ\?%%qʧ1ɾ [MZ>-*<;|ZT¸;Ul0̣;%dJLqlg{i[ Nt7hGW1c]N ysoA +M8ŕC^[ѫg:mP85hT p+ hHٟ.yEN+O1{4i(>q$"yk-vW-_ӿySa04kfX禔4gxʍk)}0tvQZr.cKBrxi3gZ{T-j Kkk*U +iߺ>x}CUfH^W=JY¬Ak`wt*yA+? +$[k$ l NNOE=!gj/\|:Ud>lW#a^TH1Ripwi\Z ֊{ԻCW|%cHU +'؄{HA_gBntl b6+Jmtjڽ1Y%ֽ6u=h2P' ڀEg3鷂]*k=O],+ưW^[9Sa[]ׄxKfl4Jz1^-*mR{18c;xE,ޛ -F15!U*,Jk L&t jDf#F+*twjZZ1mm3 @FvY'`0" +dyFH7uqV@9pNٵA p_ B $Pg5XC__ ! +sxOO;+2t˓?GvܱEײith{vp'p}y7+%Al޳p};sT# nq۠Q:}TujuM9ڥ%'`Ɨ0y:p[m^ ݐ~-HjE MQػ\Op;ԝcaDbm0HFޗB_Kk + ٬, ^h]{&QHeNjZ׀ta$KX M1$BjEz{w%QqѶ%<àlti͈(-pT+i/1Vz_(J͖o Vq=N|kÿkIs3Xa%ffrX5!:i2Q]q0C<DW7`܀Jj{8/[pUDkA !!^!. &FUl͵L'^{H.\Kx)o&&? \Q9)Gw43v֊u፭6sI`1  Ac6>6kr8JUR$s>>`kq?eAO=zMPlUlfGkHڕ GTU=*Q{(AdUy\*D.oJ?Z> +CE٢,kVXEJ4hf<)cWxæu] Ti8&hY%^ug4DJx0Ym>,T7pH@|6QT F +=VC~*{*j[쨢__PRYU0bޚD0ih[w\fB}YVլ9e%V 3R3yd|I,Z3!d̻$t >mj'P+ip3c]ұsԴnGEIⰶ n N^ƺOC/v9iC^GB;k-ƪiRE^S30|y\ݫ.x-2OZحb9`.^C p6+h0E{ ?L-WZ3$ߡ7X%;u^3[XЉUd4+- +㧟"9 (jOϡh,;'S3]ִa,Y!:B;A@BVOf"Iݹ `EO @mF ދ M7ͣ7zLp# Ι`SlCIp\qk~ya3Nvs> 7Vj%L i%Odzg2#a`ڷ/^$\'C) -J[EM+9 lb%q) O M鑷 G!NnLۊLu9G1Ӣ$HNhFFT~)5"zzZ孙ȶSizl1 B~0Skm8"9W 7p9+GҀq'lsp q+p<h ׂpg>r;DcSHX,Pv ](^zj@$E%M&4̳T +/\p%j LkA2vy4j VJL2t +0Șė1`iͷoTYpy +$sGcel# r~f +5mdCgbpi6aCWgDmsAm"h rI{N{r/Nѝ0:#wޘ~3Q.7& +M%+l:TA+b|#3KK'4By,ڣf8I| ,tbt&Fgq&wsMX%c_ח4ٺw&+#ܵh'^/966|#bɳg>q.qβkYb3SԁT}Ц @SNk<\NU5iv>y9):IIםۍ\{8Kq!Xyns976Ojqx8x[dpE ="r@3->` а CXS(bdTvxA.lX~ Z"ўnRuAZ#-'e-N`zs +F9Hut3 H֫ҋػzhiLh;ZC{Y3E;6gKR!Ik~O/;tk2c\8M}y$z_nVh)l! LJͻ]1ݟ Յ`(7޶8"70yڬC{(Q0Xy _p i r$4PմMNU:mW9i:0 4 fK;l1^GmkӒlw9WB{k8 tC~ 'G ~j _}7;;`Krk ShhDe,$ *,^Jdtp ”d]Ay9`Tp喵RBǾP\yڕZSӷSm7~k^^6i4p'6np"7ǹ_CQҐE5wTrنuxnz :3s0jʽ/a>eta?WhO[zIؠԬ̺n\/d嶺9 +;I> j#@n>;a5",T0Fp Ek{ +dں r0`+nS3S|t 1`D]Lp_%c(Ĕh0¤s mF>-\pk~u}/}ۿ~?7xݿOoG}.^.+GRN0_)>k}M^+(7Sͻ<~߿?7߽~>~ +O?l`__*xeIPJx2?iP}ྕ^ hiAǿ4.4THxK[f=A[ +Z ]dc~bH2O*CKLs;ڍC/oaؠӊ .`=z86#pDwrJAh}bEօ^o~6bK:VAfXHXtw937n_$%:Vź",T$Qw +"ߥ-[ RX[;>}cAH^ih%(1p>ڶ-@"z耀cPf7ݨuQ0, m2SP;uC*TԉT56hSb HO۴Q4dH=!d_a8[6Ke{\D/^!CFQѠW4YʵkЀfʧKR 3 +nmR'^qMJ::&~ԓ5~J@Hlu EcorLOrdLR zZׇJG*LéOcM !7р[=.=(RveU4 wёqF'Z1HN9/j34pJH m-ط |#‡ÜAMUvrձO|tv +{1ݣL&( j>צ8![>2Ŏ $qEֈynH 0O#h=lo|S&Mt=9#3;ޞ#ϵiFI+#A KV-2qP $"J,oQ {02(Jb kQ.x2#{: {!X3=C/"1C0`sɡ7OwE/e?PDon}+|Ta'_>C/szw~ûon| +o~~M#@ lx-^DQ"VG'RA) 8uJCJ)39,RxWO{Ż6rt^煋#c׳]9Frcx1͙~.]0Uu5cYjmVapd_S&D'4rdB HlkhzEZڤ!e w1nbn!_ J_|c4M@p} WG@;j$͹6,9 WB:@b5J hXQt\urI1#y̳SOk22Aiz'ق}m,Һ24YW 7 ji31CSc2KU{ l}1$7]Admt80Y=١)]Оݔ:K w}~4h2Ok +^qaWf03K> T@CVhПQݠaɿmDTbAy -ݐs^(a6W͇* +fgD򀈔-Fq(Nfs +4>S Qw>@Nm##бf+RC!C>9rk,«2QH"bRk%,}"-l5Sۥ=j˧m"nc{>8 )(C_2pynKO8#H~e3:B,UIޜz+(+ƬbuEu绔爑,k m(AgʡG!P,R\W&TރS +,)םn jKXvyBhB8DnEMXMYzG7`OFpߊ^`]%P aQVH.sԧ5QTDX_uWgE*8 +lJH(AgȿG3gYIJn1`@-X9 O WU;<Ұcro Nc +֡+75[Uhxp]Emǂe7 Ovm[cv;Uݬ駡'J6cx ʨ͓*GjqG%W VT`1+VߕahtaMjB/-윥ɝi#;ȴ)1ͪ~utYTB5GŦS!pw9shPG([ =/eGh9Rc0,abs06gX}zym. +l=sw9{mq~\Tu9S.6 !WO@wg ^vuI5Eo.q^#]4_(&>(ʒTJgl"v;2,DT.GS ߃q[#.+h?06+r,ⶵ EƼGE`JBy2o2 Fy}t,>.d|h3lVwoǏO79%淗o>|\|w|AϾ'?N]Hd &H2Jp]hx:9YO[,htu/SnVvBY7mJj[qk_T_# J+rJb*7SicjEJC^J)@4ڣo +Kh?F5hVkǞ*8)2%ZcS3O=p Wӗp$Ah]SgXr/BfIy,1Jt'q@>ƺ^^G0j Y+.b쾋cν=SȜ-Z*_,`Sڬ2$-Wcĝ2<ӿP\Bvw H\t婄un0ߕӁ!oH+QeKʁ6n%<l\ڝ;q>l)eF^^-kmA~0߄tUun]AXv +R;DzwVlYAA$8˵)vv9{kg}QiMAmIko>mJ6%ulTϧ`iXY5<LpyJcyM/ޯIČ4t۽hӡK<|YePht^nI`O|wv6SmAH B,Z`eDL2aݸAQz'p&P.40WuP &ޜPF ;jSPf@5>|=Nm0y)丫`08Hܢ{=@R\hjYO;N$Iva+ЉR*RQJKj߾kX(dXcԒJoaJyd#1zXх3'S{,BEԐPS]9Ě lGw6],wذBq?U[!ϛq~.@ѽ iqwֺ.L}6ҎJp{?KV^ &Tg\8LfިF^e4&TmMlky}ħ 8n&Kzv qD^yDED57T:%P`Ji06aﭭYh1nߦ?bX D()Vtigt7/Ǒz ?4Uv|3`.ۢ"W O\q5 X&J쓜_=nCku.idCl/á(@&` É͏O*Fxߞ> _|Q󛯾_}է˓/ÇϨ}'Wj  TMA^?_[pr{+^1fɕyL7 ӎ%u(evv fڷŎ>T[6` 9VɲbkHDZVx'@kOL$גɃE,- z RyAI SRF32+[{ҕBE3o{Lҧ8$H… Ê &:.6u*'I)*aL yӰHF 3f=R( ͛^ĸ1b*r5>:F!h1k4J\N X`|}8е=ZЙm5d3 ;@J Uӛq0l2No; +SX[*|I%-;GsөL0V|SS3 +έoA1C.guV.2@c5ȽGjӎDiHbAaNTKu &)߂pq3@V.2|:H@h!/ g;wuQ isC,TXtAQ(S[K=gS F{Vտv?_G'&zUfw}(`ǨYcRar_krUu|TlCgc>?ۆaQ-"Gc 73ƍ}~nĀ?&Lؚ4eh]c)lmȖpT#jM\|6jlh{wHW1Eڏ1XxfJ{n% VELLF3K"#:s&p,Jq-h V4L1wh 77vȭ ++c< avǖX_bp[Ƽ}*ou;ҫVOXz)w#H|L!FЦ9/("[x  9NMȬ !qM@0MpE&pKb> ZbJ޻[%Im'dpjl}t;KRE; da4ֹ C<ˁ{ +6yP!/ChhP`n6eR3ö! k)z AFH-+0NW/\V{ɂ]'nA?dؚ}M]VJS`KhFQ + ܋ +ȝ׉1 "Gb:Sл\b3t"Cn +y,cn}6#\6R`#U,)B]fC׀d ,%L%tAy+~Q -|Wvg: NOwX1h'cm7dc= O:]23nm"FȖ(U–ދ\#H~F%]"v'X9Q!0O`tb% U8fK]8 b}I㬸hN+|ee^0[LX z;*l+[_r3.O.&2o +1<13~/LS,SՃH9wzpiq٬G|;' endstream endobj 17 0 obj <>stream +HlW˵e|$@q&Ը@;3, B5~6xDpJc  f#n6T__ahB_["K +"JlFBBZ(ًѝFmVHУh9CDΜQvϽ)̨4wY\ꙙms̈́4ފ.%9\ h1־d(nH:SLmYk14peC(Dߤג<ŵiu DR~ES<O~ ,b$Œ7aB&:O| *o[7)ȩmAf,nڬ|y.#4߰/CyN*oGJs +yR9#VBidkI,3n>+%#/O}w0N 2S/,AM +q7e<>g^kpHʽUA /x0Ou1DZ3qاG$)GTݹ9 Ƨ('yN*`eIN!¤Fevj;;5(?m} KstyJ@);e&ǨL' 22άRlWO!4(=ma)+/8\V;7F3ߺTuwb쏒}rwE#ȖWȌ 4RSSZ} 6 Y $:|459 WopH#sc7o9Wv 82&B&R^KVEswP"߉J^8!:a2S\Ml$5'V 8Dki ?+ {KDd2| {䲧bRMhmB1@bI};i2Ϻ<)6+=+ QTb܅YC M^ e . 3qSbot_顤z:BO_9wv{PzUO. +9w|ԩ>ő&X +x(pȲbqKf-w!䉢ɜvN Z﹁W}U<*kA"N!APz.4vt%EgCSR wS#P+W.Q(u ;V 6jJѼ To rh;W=oc=yy5k} [&fsa+bheMK,ߢg.?ԯ\7z +EϬbz: Lg= ϼf>;4s !H,J_h ,O\dkcCQJ18&ck#&1\DmDeJ^H5$X,$/1CB:JƯ&V=KdW Y܆OkFk;ᦔ'Gɜi&|+e<,@A=jiwQ]Xft C,72;iuiQOj-J"!l{"Ai=v1_W"|xQi-,cPuHm=oʓհ,_@ttC6JYg͈tue^~8*FqSq_Q&%'[</Tdb"CZoQWom1Hks(aZ$*jgΙNzs 2HtVf(3u>N1y&wN5B??d?"CI sV> ee =D or ?X]q$֑F[`sEɂkVq*:7HP;]n< Ҡ9mj9n= +͝ʹ{g8Glo饋Z±Coܕw]tY߂C7⃍#tb⟗`T#`3IR,݉{(:e ߍi&,}捫i B5Ft56F鵕F;_O3zTL XG&]6|5IvtWw@u5,+gȢ4돋ܙXDEnyG+X~N "gpF7BWƴhI^t{<v,c.D[&} 2B)ٿ Rx}fW\xJvUIΜϹ620ϮԴ ז'][~QY/'M 7Tڤsr7gJݿE i-梗qOiȺ2cĻOPՋX6 +ϓ'b QR0Qk{-tm'ñ75x>n9qH Q~|IboDb[tqyQ\㦈RHs'|Xm,@II8bɷ*WDˮn*9v|*T:Tzh +g|;\fG>6[ S1,em +h> ޡIm4yviy:rЁH>n=\Z7<^G O#%oQ1 LuQ{D)wA]ʣF=VoV!iHb[ͿL?ȺŹ;&'jJ)q +7c"W$[hF6aZJJLº p[O^AZD7QAx6q0k3BCMUXrTqa%Y} e;ϟgKhY=߹B-sZ=^]&Zت2Ɗ@?FML St$ߟW$ +Mxΐt &OՒuH ڹٺ9𰋢:j ICW4UZp +PROlј'`?J2_yoN,-_EQ9w)~.qZgĥpvה mkO~~8K|*˜`NNZ$ X;k\iL \=HE!Ve2"gvc||s[hw11Cl&E%XшΏ.-t OASg:j뤉F;mZ\`qyҹ7l p_Tk Xx1Kja&/{Xo&ΨF-Ai\C)fN> hJ&U8Ԭyi2c:o|o쑘rͶ3|"ݬOD׺EN;saC%cqnj,4P`N-sR~; zJk`5rMq8 +$&>w6hF&?qцkɉ/B@-nT:vPvNn_fjUbVֽqӌi1M}_%FFs$`(H. (! +ʯeI oC|^b{zK' +>t)CdTޙsB̌l, +(Vۃ + Ӄ,hI/4tu0FdZ^ 2 %N(ڈLbiYٍͨģ)5GPK18U44sFw[K +HI).H +м6,( +zZ<hQ#r4ٺ =Af\-Mzf+ޫMGIIʳ1iҔfռVH-9]0ap Pʔp᧻_:S˺,bI3%Vp/ N!T1n ]䬜"{83C>pYR79O/ }LMɧ=h@w +RFg᪬G> +}`{q[hJ ˶&/T>ivV 2\9x0UҋPSw[Ni`7 K)57ax<1p}'56D+^x_>|`»ޖBd<{觧fh>5b0 +uӈYzWTQs6cǗy^.fa%.Al 9^\ɾ*eL&M:]yxvo{l#,>K#xie+¤{G30M +פfT\*c@(<1` ?$6K{$K[v(- ʼY=S1Kn@"XnrB8HUxXNaTA-cm w$̌ ԵAB5Pu{LP T(6٦o\KDZ8!wϡ.;P(`ڰr*9֝$WeYKplJ>  F~WyD 4:&,3 + ;P=J]Еqϳd,Ԇ96HRH1u 1yny?E. %,|vi] kS'eDYɘJX[(d!Sĥ@rl``~@ Yup4hyr\&Sۚ7Pfrh-;_29g\楠nyM$!;mxጂx %4ohӀB @af}q +λĺ:iDbUg S$p/IŸ@K& o#:)z >\ЬgQ̪@'-2:TܔPaxtIsiuӒ[^c5zJlmN6'pΟ?9I~`>|u}G莧adrph;PtGtIa &7ON]k4{xa~Q^,5ͮ$빵1/_W>巛vοߴG~֦x8V9 $/eM 912]˭[痢GݪC,M8* ZI <2Ϭqn$4tEN($kn`ԟ%n;ILUy;\;o p]0毽7ޗ4K:#_fIhxa]q'QYFdɘvOf2gŇ3?9 tO2j b)BdA_Al91JK^QV3ZcfWzkb̢đ/:i$> #GOe-\.! wk5ri6W#OmbLp .EǀB+ht$u^71|9i)*iT12^= +:[j4רU\Mn5x鼪]`g(rUtV~wyH8Qn" ^7kK1(q0L̇E$wV+F֪J6i5W_jqu6˔~FyB֌!W@[X!hM`jkIp\V&8͐V&8aYUh檥&ؑNeT.#T8:w 7N#?҅'P%{Lkklx0v^NpLY{Ej[hmn7鴣h$;d[I։uVi& +XT. +RMꤹD3=h42{k}rڪF Y"+$+60H-i~'UkhؔwQ>ꛬ?eX8sl!_/+o~ QqZx՜{bQxAՂ7<|3rvIs|.I`|4gE(\l&3,^XU>Lzۡ?̏S-ztM S/ 5 I~AH!\jk>őzt>UFg#׏.|^!.tv͹Š%W0ܑ1l.{ \EOK= +[pqz1a%̩p 2,3Qyb)VTmje +Do|DX*"/Xz p1kaTiCGÆT%ǣq=} XD( f2p*(r-Hqp\S +9*[!F H"v'z +/c}B$`ge`Mt:k<)C7-tkWşXB)%5d"\%U&ѤLGQ+XnZʄsXɖ%WU\ݢT*A^_'`)unGr!ZU1#H*7%'e  녓u~L3#;BKK)#u5";*H%ٺ8g3$&ln B$1"FXaAg"ng&<~w7jyly IJe՗4""ѡWc0es+b"|h)Fpf34OAnѤF(eYT5[W͜FG߽y%w3j$:q'b_g*9;+{ij~֞+)ϒDxa*alTNiQڮ8c^E`FV`Y{41ah߯'aaK S.dl<(olv( +o mbY/0"jã( HJYE p'^wat?8xAu^"N1cY7T [8?y } KhdEh51૘F3Kk[j:i]9\ڑT8ة Iq\A=r9ܷQf:½!I?G8 fE:#I-˖:.w d*Vz5ڽ{=[,5P+LOrRBZ[?_zWx*QljvZ;Mu&břpl !CTdE\q v!rc}`lily(V)3=bG}5G=4 o=mJlWhlHE?#x}NGRg+9eV7cIJ3Y܎4 +s:>VYrzGDkf68,y",6߹>BW%),xna@ aNhΓ5gW/nj9"@W>U EFݨR!Zi#˰ W$"9 Letm) 8щYC,,B#5]-tf\*>P:9f*LAυw15܇ |]=N6GhYLp(,x EH׎ZG'[# +X6Z#២ƨPx|KZbR-(5Rϝ;e9uJV<ښ4$ur-vХr[xT%NuR/~;v* +N>hiߧM֦°#+Lz77;;o= y=8P&WyǬ! 9jRM[8rwqpc O1qiр&[6]M{:TΤ~(\y2_R=ՃK}6.{jY-l>{S.fxP@$i +v93> +%,*i T,lDF &\~L1BݙJtkZ_,A0"/6inGAȏUL- iUjKUŸ@P(&ivP1Cӿ3uygYXsCO7%x|Nb@wZNA'7 \{=-ۿuNⴔ?Cs3*ꋨYp;ݓן5&M=.TU# xc@0_G_KL`b>WPP_#{j뚱^z˷8 XGsi.kqyj7=gic`(`*2guձllSG]/>5栿;PZW6~Z-lo|DQ>% bd*|S01y +)9S\0 d3Ml)&jSV5Y#~0R vB&ﮱ?[1\6`vMČG 8 c̱ U nVLY.rnU0͸LDg} +[&PXL5f-eޓ9 ɶb̃ߏ;=Wxa @K];Vt #ؼ,B7`%92}6m~?b9)F.\bsc yE"8l$Z92@;n}dӦ7~ !kV OPH@^~W? +> +mzAY* GI]p7W ӝ[*>P?Y+-jiw U+CB&DTt'MgbZ'M$ +Zw52\bLP-m^T˵ldVL$2lyrŮrΖ['vS'[)=UL\%D=q naV\L %p:g LsSbL;OϜ,_; +w-R BLk)V!%/Ҙ:”zl냭Ty% 'C Ć8S n b'&L +#x#X!z' :iYUwdqkzf +eo%c9^&my͵z[nN!,_XT n6(*9[mdRֳUFEujh%CH+l%:?nn-𠖸(/'2P5$*}_YAB CJ1!N ~F&7kL%J%"6B…!W Fl*ڕ]H\c\H>C0L-zcg@Wzn 7^1 7x‹jp1T #9S9Y8}QS)O:Kpjsy>G<vV]{ݑ7v>Oٗ[,qܫiO`V9#py2-kPjaxୋ>q M2Ac8f~õÐ#-/Nn:뿡c2{AH>N."3aJvkL%.궝t ąU^YJMz3Jqk%n|[LjIx@miяb +F:pթόKh)ԗFDpHƂ2H-OpϪ" P3(6A7[g`oΫzoM1m150^ܶ&l_n(Rs+D%!KEM}l+ncΕc.:ܹzv2Eikꠤ p} KnJ;PCy)FG-xuu*ZL⦻]n8?ofR'>/QlwrgC![Z,|bijtFDLz{݉AJܐѓjSa! eKe_n._EA97W!܃KäkE{N7uPZ"}R*e/[y"usPb89`f>k(54&CDXsbٳeJ4Y~s]p&OXy?ն*D a &DE@@5^4Jzy7ݫv+2LwH )MM2OOHN|T꾖O,>Upɖ1p `g͒@< tS$3Pd>e<>Bm#XTOg&lwVBF(d2gCEaiW]m/.o$3x%|E gʣgkNvOAҡ}O!ow~w8y+IvFZEԛvbl̢Sw3CfcuocGoR\ F"Kз$ ;%bg.#Wƶ7#/0 rDS2.8 )v +BX\bbiw">.,\F~~H +趔yd*Bs 8 O_A)CB TNXJ,I]0t:l3~2)ǤSiS;h ,TT@9k ?)G,}8Bm.Cb%ʋlpp?Ykwe18-xd߅08RKtQR\h-M&'f`"U}CjoT x NU^l75Djk3K:jǛhn$T`Wu]Z|./(,pAT!BiO8%u3{F?6>xއ߸;wgW06N1NT`zS|9 >$Zwzd90(En#jud ڹf2eXW2Y Q1}gW!&_lobN%Vxj=\I̻Xcu؅𨥅15n$4B辉΢43׌^-9Ur:6 :O{b}lnw'$3soھr*+jKOv7 + Mϑ~H]g8~(\r*5D h=yHԺpVR瞸uĈ^: ދ.>y㌣|D@u J\'Ys /YkނՑx܍bcvTj)9Sq/yZGńӁ/ƀ`zcTj> Ifȏ-b13o b"F F*'M6zsc07, +\h*R9Cq8ZFމZ*֊Y|!sP|B?`x`s endstream endobj 38 0 obj <> endobj xref 0 48 0000000003 65535 f +0000000016 00000 n +0000047811 00000 n +0000000004 00001 f +0000000020 00000 f +0000048074 00000 n +0000129852 00000 n +0000129924 00000 n +0000130307 00000 n +0000154490 00000 n +0000160188 00000 n +0000181053 00000 n +0000202901 00000 n +0000225104 00000 n +0000233450 00000 n +0000237159 00000 n +0000257233 00000 n +0000282454 00000 n +0000131230 00000 n +0000144831 00000 n +0000000000 00001 f +0000048049 00000 n +0000047862 00000 n +0000047933 00000 n +0000047964 00000 n +0000049662 00000 n +0000050302 00000 n +0000057587 00000 n +0000049775 00000 n +0000100574 00000 n +0000049969 00000 n +0000059456 00000 n +0000050678 00000 n +0000050806 00000 n +0000051129 00000 n +0000051287 00000 n +0000051532 00000 n +0000048483 00000 n +0000300546 00000 n +0000057847 00000 n +0000100850 00000 n +0000059723 00000 n +0000051601 00000 n +0000050831 00000 n +0000129291 00000 n +0000129339 00000 n +0000049242 00000 n +0000000148 00000 n +trailer <<252CDCE32BEB48F1A4AC1838A61EFD15>]>> startxref 300713 %%EOF \ No newline at end of file diff --git a/doc/pub/BM/html/figures/RBM.png b/doc/pub/BM/html/figures/RBM.png new file mode 100644 index 000000000..c8dbcdc3b Binary files /dev/null and b/doc/pub/BM/html/figures/RBM.png differ diff --git a/doc/pub/BM/html/figures/RMBenergy.dat b/doc/pub/BM/html/figures/RMBenergy.dat new file mode 100644 index 000000000..56aa19939 --- /dev/null +++ b/doc/pub/BM/html/figures/RMBenergy.dat @@ -0,0 +1,100 @@ +1 5.59097 +2 5.38551 +3 5.14253 +4 4.92049 +5 4.80505 +6 4.62185 +7 4.48617 +8 4.40662 +9 4.2445 +10 4.17527 +11 4.09137 +12 4.0624 +13 3.96858 +14 3.92182 +15 3.85881 +16 3.82252 +17 3.76908 +18 3.73743 +19 3.69007 +20 3.62217 +21 3.63773 +22 3.58399 +23 3.57401 +24 3.53176 +25 3.51544 +26 3.48965 +27 3.4685 +28 3.45745 +29 3.44185 +30 3.43143 +31 3.40337 +32 3.38956 +34 3.37394 +35 3.35488 +36 3.29924 +37 3.2945 +38 3.2913 +39 3.29587 +40 3.28508 +41 3.27126 +42 3.25836 +43 3.24323 +44 3.24687 +45 3.21526 +46 3.2367 +47 3.23167 +48 3.21595 +49 3.21003 +50 3.18076 +51 3.18035 +52 3.18534 +53 3.15874 +54 3.17502 +55 3.14463 +56 3.17313 +57 3.16107 +58 3.13238 +59 3.1367 +60 3.15066 +61 3.11037 +62 3.11367 +63 3.10958 +64 3.10312 +65 3.09725 +66 3.09705 +67 3.09602 +68 3.08657 +69 3.09206 +70 3.0703 +71 3.07878 +72 3.10305 +73 3.06263 +74 3.06851 +75 3.09004 +76 3.0673 +77 3.05662 +78 3.047 +79 3.04692 +80 3.06387 +81 3.06418 +82 3.06383 +83 3.04044 +84 3.06274 +85 3.04205 +86 3.04167 +87 3.04238 +88 3.04487 +89 3.02483 +90 3.05472 +91 3.02654 +92 3.03249 +93 .04819 +94 3.03152 +95 3.03445 +96 3.03407 +97 3.02488 +98 3.00511 +99 3.01687 +100 3.03151 +1001 3.03374 \ No newline at end of file diff --git a/doc/pub/BM/html/figures/RMBenergy.dat~ b/doc/pub/BM/html/figures/RMBenergy.dat~ new file mode 100644 index 000000000..f85552e62 --- /dev/null +++ b/doc/pub/BM/html/figures/RMBenergy.dat~ @@ -0,0 +1,100 @@ +5.59097 +5.38551 +5.14253 +4.92049 +4.80505 +4.62185 +4.48617 +4.40662 +4.2445 +4.17527 +4.09137 +4.0624 +3.96858 +3.92182 +3.85881 +3.82252 +3.76908 +3.73743 +3.69007 +3.62217 +3.63773 +3.58399 +3.57401 +3.53176 +3.51544 +3.48965 +3.4685 +3.45745 +3.44185 +3.43143 +3.40337 +3.38956 +3.37394 +3.35488 +3.29924 +3.2945 +3.2913 +3.29587 +3.28508 +3.27126 +3.25836 +3.24323 +3.24687 +3.21526 +3.2367 +3.23167 +3.21595 +3.21003 +3.18076 +3.18035 +3.18534 +3.15874 +3.17502 +3.14463 +3.17313 +3.16107 +3.13238 +3.1367 +3.15066 +3.11037 +3.11367 +3.10958 +3.10312 +3.09725 +3.09705 +3.09602 +3.08657 +3.09206 +3.0703 +3.07878 +3.10305 +3.06263 +3.06851 +3.09004 +3.0673 +3.05662 +3.047 +3.04692 +3.06387 +3.06418 +3.06383 +3.04044 +3.06274 +3.04205 +3.04167 +3.04238 +3.04487 +3.02483 +3.05472 +3.02654 +3.03249 +3.04819 +3.03152 +3.03445 +3.03407 +3.02488 +3.00511 +3.01687 +3.03151 +3.03374 \ No newline at end of file diff --git a/doc/pub/BM/html/figures/dnn.png b/doc/pub/BM/html/figures/dnn.png new file mode 100644 index 000000000..bf388bdf4 Binary files /dev/null and b/doc/pub/BM/html/figures/dnn.png differ diff --git a/doc/pub/BM/html/figures/figN2.pdf b/doc/pub/BM/html/figures/figN2.pdf new file mode 100644 index 000000000..ecc4f1267 Binary files /dev/null and b/doc/pub/BM/html/figures/figN2.pdf differ diff --git a/doc/pub/BM/html/figures/figN2.png b/doc/pub/BM/html/figures/figN2.png new file mode 100644 index 000000000..7fd4704a1 Binary files /dev/null and b/doc/pub/BM/html/figures/figN2.png differ diff --git a/doc/pub/BM/html/figures/figN6.pdf b/doc/pub/BM/html/figures/figN6.pdf new file mode 100644 index 000000000..a453c47c6 Binary files /dev/null and b/doc/pub/BM/html/figures/figN6.pdf differ diff --git a/doc/pub/BM/html/figures/figN6.png b/doc/pub/BM/html/figures/figN6.png new file mode 100644 index 000000000..21302b27f Binary files /dev/null and b/doc/pub/BM/html/figures/figN6.png differ diff --git a/doc/pub/BM/html/figures/perceptron.png b/doc/pub/BM/html/figures/perceptron.png new file mode 100644 index 000000000..1590ff9cc Binary files /dev/null and b/doc/pub/BM/html/figures/perceptron.png differ diff --git a/doc/pub/BM/html/figures/plot.py b/doc/pub/BM/html/figures/plot.py new file mode 100644 index 000000000..b9ea135e0 --- /dev/null +++ b/doc/pub/BM/html/figures/plot.py @@ -0,0 +1,14 @@ +import numpy as np +import matplotlib.pyplot as plt +from IPython.display import display + +data = np.loadtxt('RMBenergy.dat') +x = data[:,0] +y = data[:,1] +plt.plot(x, y,'ro') +plt.axis([0,101,3, 5.5]) +plt.xlabel(r'Iterations') +plt.ylabel(r'Energy') +plt.savefig('MLrbm.pdf') +plt.show() + diff --git a/doc/pub/BM/html/figures/plot.py~ b/doc/pub/BM/html/figures/plot.py~ new file mode 100644 index 000000000..bf33e2968 --- /dev/null +++ b/doc/pub/BM/html/figures/plot.py~ @@ -0,0 +1,14 @@ +import numpy as np +import matplotlib.pyplot as plt +from IPython.display import display + +data = np.loadtxt('RMBenergy.dat') +x = data[:,0] +y = data[:,1] +plt.plot(x, y,'ro') +plt.axis([0,101,3, 7]) +plt.xlabel(r'Iterations') +plt.ylabel(r'Energy') +plt.savefig('MLrbm.pdf') +plt.show() + diff --git a/doc/pub/BM/html/figures/plotEnergies.py b/doc/pub/BM/html/figures/plotEnergies.py new file mode 100644 index 000000000..14fe8730e --- /dev/null +++ b/doc/pub/BM/html/figures/plotEnergies.py @@ -0,0 +1,61 @@ +import sys + +import numpy as np +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes + +try: + dataFileName = sys.argv[1] +except IndexError: + print("USAGE: python plotEnergies.py 'filename'") + sys.exit(0) + +HFEnergy3 = 3.161921401722216 +HFEnergy6 = 20.71924844033019 + +numParticles = \ + int(dataFileName[dataFileName.find('N')+1:dataFileName.find('E')-1]) +hfenergyFound = False +if (numParticles == 2): + HFEnergy = 3.161921401722216 + hfenergyFound = True +elif (numParticles == 6): + HFEnergy = 20.71924844033019 + hfenergyFound = True +else: + hfenergyFound = False + +data = np.loadtxt(dataFileName, dtype=np.float64) +data[:,1] = np.sqrt(data[:,1]) + +n = len(data[:,0]) +x = np.arange(0,n) + +fig = plt.figure() + +if (hfenergyFound): + yline = np.zeros(n) + yline.fill(HFEnergy) + plt.plot(x, yline, 'r--', label="HF Energy") + +msize = 1.0 + +ax = fig.add_subplot(111) +plt.errorbar(x, data[:,0], yerr=data[:,1], fmt='bo', markersize=msize, label="VMC Energy") +plt.fill_between(x, data[:,0]-data[:,1], data[:,0]+data[:,1]) + +plt.xlim(0,n) +plt.xlabel('Iteration') +plt.ylabel('$E_0[a.u]$') +plt.legend(loc='best') + +minSub = 80 +maxSub = 120 +inset_axes(ax, width="50%", height=1.0, loc='right') +plt.errorbar(x[minSub:maxSub], data[minSub:maxSub,0], + yerr=data[minSub:maxSub,1], fmt='bo', markersize=msize, label="VMC " + "Energy") +plt.plot(x[minSub:maxSub], yline[minSub:maxSub], 'r--', label="HF Energy") + +plt.show() diff --git a/doc/pub/BM/html/figures/plotEnergies.py~ b/doc/pub/BM/html/figures/plotEnergies.py~ new file mode 100644 index 000000000..394649f06 --- /dev/null +++ b/doc/pub/BM/html/figures/plotEnergies.py~ @@ -0,0 +1,62 @@ +import sys + +import numpy as np +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid1.inset_locator import inset_axes + +try: + dataFileName = sys.argv[1] +except IndexError: + print("USAGE: python plotEnergies.py 'filename'") + sys.exit(0) + +HFEnergy3 = 3.161921401722216 +HFEnergy6 = 20.71924844033019 + +numParticles = \ + int(dataFileName[dataFileName.find('N')+1:dataFileName.find('E')-1]) +hfenergyFound = False +if (numParticles == 2): + HFEnergy = 3.161921401722216 + hfenergyFound = True +elif (numParticles == 6): + HFEnergy = 20.71924844033019 + hfenergyFound = True +else: + hfenergyFound = False + +data = np.loadtxt(dataFileName, dtype=np.float64) +data[:,1] = np.sqrt(data[:,1]) + +n = len(data[:,0]) +x = np.arange(0,n) + +fig = plt.figure() + +if (hfenergyFound): + yline = np.zeros(n) + yline.fill(HFEnergy) + plt.plot(x, yline, 'r--', label="HF Energy") + +msize = 1.0 + +ax = fig.add_subplot(111) +plt.errorbar(x, data[:,0], yerr=data[:,1], fmt='bo', markersize=msize, label="VMC Energy") +plt.fill_between(x, data[:,0]-data[:,1], data[:,0]+data[:,1]) + +plt.xlim(0,n) +plt.xlabel('Iteration') +plt.ylabel('$E_0[a.u]$') +plt.legend(loc='best') + +minSub = 80 +maxSub = 120 +inset_axes(ax, width="50%", height=1.0, loc='right') +plt.errorbar(x[minSub:maxSub], data[minSub:maxSub,0], + yerr=data[minSub:maxSub,1], fmt='bo', markersize=msize, label="VMC " + "Energy") +plt.plot(x[minSub:maxSub], yline[minSub:maxSub], 'r--', label="HF Energy") + +plt.show() +plt.save(rbm.pdf) diff --git a/doc/pub/BM/html/figures/w1.0_D2_N2_Energies.txt b/doc/pub/BM/html/figures/w1.0_D2_N2_Energies.txt new file mode 100644 index 000000000..6e29999a1 --- /dev/null +++ b/doc/pub/BM/html/figures/w1.0_D2_N2_Energies.txt @@ -0,0 +1,177 @@ +3.8718410926477924 0.0000147059038380 +3.6953233621413557 0.0000102929382114 +3.6044928743975535 0.0000079081842488 +3.5128938682886837 0.0000065801975909 +3.4305256282797747 0.0000054245263200 +3.3288413622175166 0.0000049216555869 +3.2749958564532178 0.0000040637553139 +3.1479572957101820 0.0000038378828037 +3.1166899087959297 0.0000033396470865 +3.1104374796656726 0.0000031163210772 +3.0606069933639453 0.0000030060257254 +3.0731542020730780 0.0000027733456045 +3.0717634285517534 0.0000026805679201 +3.0611410467603375 0.0000025875489649 +3.0665725439213904 0.0000024893399112 +3.0633403772301970 0.0000024700907123 +3.0698475324707268 0.0000027151319575 +3.0595655087047806 0.0000024720813897 +3.0553873289853177 0.0000028477207669 +3.0482899477099306 0.0000023673705900 +3.0542896266235471 0.0000023862592235 +3.0540749874587165 0.0000025012906406 +3.0576543799651414 0.0000026345634664 +3.0573563182115611 0.0000025360265151 +3.0538285550369504 0.0000024987295204 +3.0612964387462811 0.0000024534453275 +3.0549113307526508 0.0000021701370858 +3.0497337277819891 0.0000023035159445 +3.0358832197758638 0.0000019074339292 +3.0526087579258752 0.0000020906726490 +3.0375404267896444 0.0000018193957347 +3.0296868013420966 0.0000016988150204 +3.0340171364975270 0.0000017070755647 +3.0270393868514955 0.0000015323958444 +3.0335664276765724 0.0000016777245585 +3.0295458263713861 0.0000016859761512 +3.0362600723382949 0.0000016968640028 +3.0299695102215471 0.0000016519869787 +3.0307958844793799 0.0000015856243614 +3.0327702873766618 0.0000017547162663 +3.0368048878658098 0.0000016123312494 +3.0327812834421524 0.0000016199176026 +3.0291993280375706 0.0000015252728930 +3.0243017589539227 0.0000014941086534 +3.0388257490049781 0.0000015966548859 +3.0288937431672065 0.0000015402788000 +3.0332840884145367 0.0000014852116533 +3.0305388790845895 0.0000014087857225 +3.0160492528984681 0.0000013413147555 +3.0228315043770833 0.0000013108364236 +3.0319159622546947 0.0000014942838085 +3.0245994503305611 0.0000012819874421 +3.0245406110342263 0.0000011617983732 +3.0221149417268545 0.0000011861898809 +3.0266309203103892 0.0000010971382379 +3.0213956659444619 0.0000009815865090 +3.0266044839647375 0.0000008475062073 +3.0171339022137031 0.0000009491125221 +3.0137137665587970 0.0000009047766596 +3.0204243038235696 0.0000009204940437 +3.0149550294803293 0.0000007241831125 +3.0184897306036023 0.0000007608046522 +3.0174560678287494 0.0000007444663449 +3.0117358405691466 0.0000006697194350 +3.0137686357569442 0.0000006493989681 +3.0197874903595676 0.0000006594837851 +3.0211393564928861 0.0000005273643816 +3.0088502364778984 0.0000006750242945 +3.0141869057980486 0.0000006604497524 +3.0084178966040751 0.0000006011783643 +3.0103703343473431 0.0000006332729341 +3.0114501225948129 0.0000006078075993 +3.0112868967213990 0.0000005130309910 +3.0133892246029368 0.0000004850027332 +3.0127600060080049 0.0000005121383448 +3.0132033058749772 0.0000005202670392 +3.0174838683532705 0.0000004511805009 +3.0074649653881833 0.0000004767011548 +3.0147189641940666 0.0000005026414881 +3.0031494490708743 0.0000004068197790 +3.0127269836701625 0.0000003517622533 +3.0117160632855131 0.0000004807107729 +3.0104068668466173 0.0000004340980291 +3.0095190754722245 0.0000004525035764 +3.0083426819236312 0.0000003442988162 +3.0096297561121181 0.0000003509484677 +3.0084950447655525 0.0000003426881327 +3.0000334241795148 0.0000002822486656 +3.0074200494698378 0.0000002470051234 +3.0045168865889322 0.0000002979026886 +3.0088303350153422 0.0000002777889961 +3.0092362767849465 0.0000002481732395 +3.0036101232401404 0.0000002217541772 +3.0130254319442749 0.0000002113227663 +3.0074375628933665 0.0000002051131924 +3.0039215527299699 0.0000001812862961 +3.0039203843331075 0.0000001726295733 +3.0035107386928650 0.0000001519175758 +3.0052148548142990 0.0000001558437889 +3.0032679964994404 0.0000001249104454 +3.0029150927912411 0.0000001429330469 +3.0050978211203274 0.0000001190355909 +3.0025941745527387 0.0000001221198387 +3.0040359658796429 0.0000001232553598 +3.0037708875467368 0.0000001072262769 +3.0019741648816156 0.0000001005884615 +3.0027048136174459 0.0000001048064246 +3.0056791179955855 0.0000001004795678 +3.0053973663716054 0.0000000983704665 +3.0034105594872620 0.0000000952215313 +3.0040453907229576 0.0000000992197959 +3.0027300002454198 0.0000000817973448 +3.0035048664440449 0.0000000831022963 +3.0052055251459708 0.0000000689818501 +3.0021717615084489 0.0000000714786128 +3.0022585367578407 0.0000000643697570 +2.9999596965540722 0.0000000612636068 +3.0036454745975694 0.0000000611764064 +3.0042537057862164 0.0000000684805862 +3.0026231380135662 0.0000000556670465 +3.0019023156210940 0.0000000587920986 +3.0018312332595007 0.0000000525268288 +3.0046803565066358 0.0000000495684146 +3.0039420051045256 0.0000000517348120 +3.0023661582808066 0.0000000450910055 +3.0016773040560589 0.0000000475849908 +2.9989155310696156 0.0000000428850687 +3.0011295769327293 0.0000000474088904 +3.0011467393513471 0.0000000434068403 +3.0036140942752185 0.0000000431096735 +3.0016422267899725 0.0000000434176414 +3.0011370281054712 0.0000000409363393 +3.0027556596025762 0.0000000366148094 +3.0011199939040312 0.0000000358161799 +3.0031129504788021 0.0000000314366619 +3.0006091557288341 0.0000000313214127 +3.0021039093404744 0.0000000295876655 +3.0004037527984964 0.0000000291098892 +3.0024899558606202 0.0000000298367581 +3.0005867340853629 0.0000000278588439 +3.0003237974577956 0.0000000288483374 +3.0015755779735982 0.0000000282119872 +2.9996426017446152 0.0000000314252808 +3.0015175332214015 0.0000000255734646 +3.0029559835366615 0.0000000441114480 +3.0017055489141331 0.0000000252613320 +3.0004657536104569 0.0000000238440008 +3.0007308805814197 0.0000000229698724 +3.0005829294800797 0.0000000215497569 +3.0009965426322509 0.0000000256788947 +3.0006178214036017 0.0000000239245629 +3.0022985255473720 0.0000000218002184 +3.0006775587653833 0.0000000224134054 +3.0009719234649288 0.0000000216724793 +3.0009062774589368 0.0000000221097629 +3.0015732615498312 0.0000000193518707 +2.9996780242140377 0.0000000194629075 +3.0018716176896825 0.0000000191384773 +3.0010978534898918 0.0000000175640263 +3.0007862430756465 0.0000000177714381 +3.0010368837079127 0.0000000171020312 +3.0015116855075781 0.0000000200078325 +2.9999734295894744 0.0000000165663988 +2.9998274689286517 0.0000000181649371 +3.0002407706284853 0.0000000173203622 +3.0012417709345547 0.0000000169858376 +3.0026874674355941 0.0000000169332722 +3.0015445555953710 0.0000000145238279 +3.0012754992208737 0.0000000140892091 +3.0018092612361542 0.0000000128526873 +3.0011082128468711 0.0000000112858644 +3.0010617580509251 0.0000000103830880 +3.0000913072497983 0.0000000105323196 +3.0002018295376280 0.0000000103056312 +3.0016440395541517 0.0000000106149625 +3.0003337702616162 0.0000000113166999 +2.9999434766407251 0.0000000122985347 diff --git a/doc/pub/BM/html/figures/w1.0_D2_N6_Energies.txt b/doc/pub/BM/html/figures/w1.0_D2_N6_Energies.txt new file mode 100644 index 000000000..d3df019b6 --- /dev/null +++ b/doc/pub/BM/html/figures/w1.0_D2_N6_Energies.txt @@ -0,0 +1,164 @@ +26.3997295427311869 0.0000432234318622 +26.2385159782425141 0.0000438635333612 +22.3592885357977629 0.0000322373266503 +22.0244677358107417 0.0000263858363470 +21.9269310476547794 0.0000261200003468 +21.7144452787047122 0.0000248563043285 +21.3701604175061171 0.0000197056800652 +21.4787494084378210 0.0000203724059472 +21.3797187586678419 0.0000218583901955 +21.3246138745372207 0.0000131842522837 +21.0912701668367397 0.0000099065535238 +21.0119821084624938 0.0000133196077506 +21.1474890442610111 0.0000128070400784 +21.1233036931878431 0.0000121193291832 +20.9890540730367405 0.0000145890387069 +20.9761555691721604 0.0000151465441097 +20.8417860976805684 0.0000087264636813 +20.9350957491539447 0.0000103090474697 +20.9023936251027962 0.0000096787288490 +20.8319494237505687 0.0000081040741908 +20.8122652112419182 0.0000068364931517 +20.7704023573448886 0.0000059845585617 +20.7981112052692936 0.0000062674068241 +20.6419476231995098 0.0000053528692441 +20.6580103526388541 0.0000053238298005 +20.6520896222411814 0.0000057438491940 +20.6131109423281487 0.0000047682455278 +20.6544623892670423 0.0000065860795751 +20.6704139252605827 0.0000049330551523 +20.6346131185617203 0.0000047588540559 +20.5974811001915405 0.0000046113432124 +20.6229486203467758 0.0000044396925222 +20.6062468146155169 0.0000043703136466 +20.6148200900137475 0.0000040938622567 +20.5662287456182789 0.0000042234241009 +20.6114316677022487 0.0000035137276381 +20.6072329120355313 0.0000038647506648 +20.6210166040993137 0.0000042464577960 +20.6084269536897189 0.0000037357408530 +20.5752638954871649 0.0000037976090521 +20.5932650245921778 0.0000036239420656 +20.6067081280884459 0.0000037188745484 +21.0993654677212561 0.0000106878524495 +20.8026193126692078 0.0000074620982730 +20.6334950709818052 0.0000064732418627 +20.6853612089283594 0.0000068181326073 +20.5765440911259461 0.0000053864940205 +20.6122643088333071 0.0000062846246316 +20.6614753438880179 0.0000224939673674 +20.6175965199892985 0.0000057001323781 +20.6229701929922413 0.0000059517681708 +20.6146232259142899 0.0000053887117481 +20.5696458297736555 0.0000060004874845 +20.5946202339618587 0.0000057677261977 +20.6075008141421243 0.0000056070546714 +20.5829189176641663 0.0000064331033843 +20.5598253313843919 0.0000051962117495 +20.5550821424227195 0.0000062257775280 +20.6022472342768950 0.0000058265716231 +20.6004933121799034 0.0000055440389030 +20.6252361890981639 0.0000056473544815 +20.5561922547165032 0.0000066562438911 +21.2564436143909568 0.0000093659581145 +21.2399863198941539 0.0000093821903262 +21.1270071183716794 0.0000146940309869 +20.9857107263791427 0.0000112458549337 +20.7337913724704102 0.0000081536530550 +20.6619750735355225 0.0000062105770727 +20.6132756402740291 0.0000057985784831 +20.6133314363765479 0.0000048906485747 +20.6229830149404414 0.0000064571197197 +20.6159488288018196 0.0000050029211053 +20.6321315446391296 0.0000038519746625 +20.5762124469568128 0.0000038217569248 +20.5544932676653751 0.0000034541921715 +20.5677585574281601 0.0000042398557612 +20.5587696556494848 0.0000045083067127 +20.5382737230544130 0.0000031140849710 +20.5130839639107059 0.0000034759014745 +20.5371006423120619 0.0000035185936564 +20.5697692966231394 0.0000035847214896 +20.5741629862752511 0.0000036577053812 +20.5945859103316025 0.0000029491183283 +20.5750879016805754 0.0000032441567047 +20.5826087255368400 0.0000032788720747 +20.6141816588704856 0.0000031135335851 +20.5940682793037944 0.0000035973169533 +20.6210323256096153 0.0000030294005909 +20.6136564649873648 0.0000036305200322 +20.6053919341159641 0.0000034256261921 +20.6096732032146015 0.0000036157518351 +20.6046431292516345 0.0000047231934518 +20.6534729237593417 0.0000032264527930 +20.5968573790427918 0.0000025498884612 +20.6010537078066740 0.0000027953652814 +20.6296209353361988 0.0000033523977539 +20.6255158284164644 0.0000036537766466 +20.6117414296065924 0.0000031851026908 +20.6328648653271216 0.0000026694281725 +20.5588793626501634 0.0000027609851782 +20.5797653966173471 0.0000027935504847 +20.5740348746840063 0.0000028939972522 +20.5638785335988814 0.0000030962144476 +20.5642608753059477 0.0000029288281310 +20.5628008233625046 0.0000023714027674 +20.5367956985361850 0.0000025939719434 +20.5423169783295982 0.0000027501957673 +20.5455062233131081 0.0000029339440703 +20.5544437840613696 0.0000025895718660 +20.5545184112903421 0.0000025273486095 +20.5390997576117371 0.0000023601016132 +20.5449121020005521 0.0000023171332877 +20.5482014379555586 0.0000029098452243 +20.5458893550763406 0.0000023532957772 +20.5564278839372676 0.0000025821008989 +20.5405394158482970 0.0000034503967969 +20.5781084940649066 0.0000026378036663 +20.5620961581145920 0.0000024711566304 +20.5186335239220270 0.0000021890144216 +20.5779323788908854 0.0000027066770518 +20.5800468430124504 0.0000024226585928 +20.5697990124282306 0.0000028639734343 +21.7398048727299162 0.0000131946033440 +20.6982292363868083 0.0000065326814483 +20.6091911916732649 0.0000055382304768 +20.5834564036242895 0.0000045107353305 +20.5781003948228509 0.0000058091668757 +20.5659495070103162 0.0000048621584759 +20.5574168510810402 0.0000048395156425 +20.5382735167236490 0.0000042307200679 +20.5695976677201315 0.0000047019592801 +20.5992758321836824 0.0000057296171668 +20.5566263905080540 0.0000043802958160 +20.5942989619961843 0.0000050217297184 +20.5959440189899077 0.0000044689686265 +20.5931287019641331 0.0000042813489572 +20.5907194370727851 0.0000046975971827 +20.5586946014137339 0.0000049834716987 +20.5817563637642671 0.0000049879666945 +20.5643446819219413 0.0000044111101476 +20.5510734678465177 0.0000056017852816 +20.5973485546631139 0.0000046230146720 +20.5932253977651989 0.0000051582797571 +20.5779893368105640 0.0000055575343303 +20.6113993505314390 0.0000044383610056 +20.5987600829670221 0.0000048782939242 +20.5947873900366751 0.0000050856393350 +20.5588639054899929 0.0000050714799634 +20.5949536643329836 0.0000051099692616 +20.5704784711153508 0.0000042810288945 +20.5975137180971650 0.0000058391414790 +20.5452492022936930 0.0000046608725858 +20.5669439415781490 0.0000049830446496 +20.6335521716793480 0.0000046144492603 +20.5638810257340126 0.0000039096450386 +20.6051042593020171 0.0000050314968488 +20.5952826593208194 0.0000048466091870 +20.5840129254583317 0.0000049386436539 +20.5622424462287334 0.0000047054311204 +20.5364652378096295 0.0000054576819159 +20.6199917186743171 0.0000046400213180 +20.5850044296868262 0.0000045104364483 +20.6067500420065883 0.0000047907162541 +20.5942250212876736 0.0000045392646495 diff --git a/doc/pub/BM/html/reveal.js/.gitignore b/doc/pub/BM/html/reveal.js/.gitignore new file mode 100644 index 000000000..e7b4f216a --- /dev/null +++ b/doc/pub/BM/html/reveal.js/.gitignore @@ -0,0 +1,13 @@ +.idea/ +*.iml +*.iws +*.eml +out/ +.DS_Store +.svn +log/*.log +tmp/** +node_modules/ +.sass-cache +css/reveal.min.css +js/reveal.min.js \ No newline at end of file diff --git a/doc/pub/BM/html/reveal.js/.travis.yml b/doc/pub/BM/html/reveal.js/.travis.yml new file mode 100644 index 000000000..ec3b27d5d --- /dev/null +++ b/doc/pub/BM/html/reveal.js/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +node_js: + - 4 +before_script: + - npm install -g grunt-cli +after_script: + - grunt retire diff --git a/doc/pub/BM/html/reveal.js/CONTRIBUTING.md b/doc/pub/BM/html/reveal.js/CONTRIBUTING.md new file mode 100644 index 000000000..c2091e88f --- /dev/null +++ b/doc/pub/BM/html/reveal.js/CONTRIBUTING.md @@ -0,0 +1,23 @@ +## Contributing + +Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. + + +### Personal Support +If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). + + +### Bug Reports +When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. + + +### Pull Requests +- Should follow the coding style of the file you work in, most importantly: + - Tabs to indent + - Single-quoted strings +- Should be made towards the **dev branch** +- Should be submitted from a feature/topic branch (not your master) + + +### Plugins +Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines diff --git a/doc/pub/BM/html/reveal.js/Gruntfile.js b/doc/pub/BM/html/reveal.js/Gruntfile.js new file mode 100644 index 000000000..b257e8f32 --- /dev/null +++ b/doc/pub/BM/html/reveal.js/Gruntfile.js @@ -0,0 +1,140 @@ +/* global module:false */ +module.exports = function(grunt) { + var port = grunt.option('port') || 8000; + // Project configuration + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + meta: { + banner: + '/*!\n' + + ' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + + ' * http://lab.hakim.se/reveal-js\n' + + ' * MIT licensed\n' + + ' *\n' + + ' * Copyright (C) 2014 Hakim El Hattab, http://hakim.se\n' + + ' */' + }, + + qunit: { + files: [ 'test/*.html' ] + }, + + uglify: { + options: { + banner: '<%= meta.banner %>\n' + }, + build: { + src: 'js/reveal.js', + dest: 'js/reveal.min.js' + } + }, + + cssmin: { + compress: { + files: { + 'css/reveal.min.css': [ 'css/reveal.css' ] + } + } + }, + + sass: { + main: { + files: { + 'css/theme/darkgray.css': 'css/theme/source/darkgray.scss', + 'css/theme/beigesmall.css': 'css/theme/source/beigesmall.scss', + 'css/theme/cbc.css': 'css/theme/source/cbc.scss', + 'css/theme/default.css': 'css/theme/source/default.scss', + 'css/theme/beige.css': 'css/theme/source/beige.scss', + 'css/theme/night.css': 'css/theme/source/night.scss', + 'css/theme/serif.css': 'css/theme/source/serif.scss', + 'css/theme/simple.css': 'css/theme/source/simple.scss', + 'css/theme/sky.css': 'css/theme/source/sky.scss', + 'css/theme/moon.css': 'css/theme/source/moon.scss', + 'css/theme/solarized.css': 'css/theme/source/solarized.scss', + 'css/theme/blood.css': 'css/theme/source/blood.scss' + } + } + }, + + jshint: { + options: { + curly: false, + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + undef: true, + eqnull: true, + browser: true, + expr: true, + globals: { + head: false, + module: false, + console: false, + unescape: false + } + }, + files: [ 'Gruntfile.js', 'js/reveal.js' ] + }, + + connect: { + server: { + options: { + port: port, + base: '.' + } + } + }, + + zip: { + 'reveal-js-presentation.zip': [ + 'index.html', + 'css/**', + 'js/**', + 'lib/**', + 'images/**', + 'plugin/**' + ] + }, + + watch: { + main: { + files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ], + tasks: 'default' + }, + theme: { + files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ], + tasks: 'themes' + } + } + + }); + + // Dependencies + grunt.loadNpmTasks( 'grunt-contrib-qunit' ); + grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); + grunt.loadNpmTasks( 'grunt-contrib-uglify' ); + grunt.loadNpmTasks( 'grunt-contrib-watch' ); + grunt.loadNpmTasks( 'grunt-contrib-sass' ); + grunt.loadNpmTasks( 'grunt-contrib-connect' ); + grunt.loadNpmTasks( 'grunt-zip' ); + + // Default task + grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] ); + + // Theme task + grunt.registerTask( 'themes', [ 'sass' ] ); + + // Package presentation to archive + grunt.registerTask( 'package', [ 'default', 'zip' ] ); + + // Serve presentation locally + grunt.registerTask( 'serve', [ 'connect', 'watch' ] ); + + // Run tests + grunt.registerTask( 'test', [ 'jshint', 'qunit' ] ); + +}; diff --git a/doc/pub/BM/html/reveal.js/LICENSE b/doc/pub/BM/html/reveal.js/LICENSE new file mode 100644 index 000000000..c3e6e5fd6 --- /dev/null +++ b/doc/pub/BM/html/reveal.js/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2017 Hakim El Hattab, http://hakim.se, and reveal.js contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/doc/pub/BM/html/reveal.js/README.md b/doc/pub/BM/html/reveal.js/README.md new file mode 100644 index 000000000..f2ab6ca88 --- /dev/null +++ b/doc/pub/BM/html/reveal.js/README.md @@ -0,0 +1,1246 @@ +# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.svg?branch=master)](https://travis-ci.org/hakimel/reveal.js) Slides + +A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://revealjs.com/). + +reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [Markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). There's also a fully featured visual editor and platform for sharing reveal.js presentations at [slides.com](https://slides.com?ref=github). + +## Table of contents +- [Online Editor](#online-editor) +- [Instructions](#instructions) + - [Markup](#markup) + - [Markdown](#markdown) + - [Element Attributes](#element-attributes) + - [Slide Attributes](#slide-attributes) +- [Configuration](#configuration) +- [Presentation Size](#presentation-size) +- [Dependencies](#dependencies) +- [Ready Event](#ready-event) +- [Auto-sliding](#auto-sliding) +- [Keyboard Bindings](#keyboard-bindings) +- [Touch Navigation](#touch-navigation) +- [Lazy Loading](#lazy-loading) +- [API](#api) + - [Slide Changed Event](#slide-changed-event) + - [Presentation State](#presentation-state) + - [Slide States](#slide-states) + - [Slide Backgrounds](#slide-backgrounds) + - [Parallax Background](#parallax-background) + - [Slide Transitions](#slide-transitions) + - [Internal links](#internal-links) + - [Fragments](#fragments) + - [Fragment events](#fragment-events) + - [Code syntax highlighting](#code-syntax-highlighting) + - [Slide number](#slide-number) + - [Overview mode](#overview-mode) + - [Fullscreen mode](#fullscreen-mode) + - [Embedded media](#embedded-media) + - [Stretching elements](#stretching-elements) + - [postMessage API](#postmessage-api) +- [PDF Export](#pdf-export) +- [Theming](#theming) +- [Speaker Notes](#speaker-notes) + - [Share and Print Speaker Notes](#share-and-print-speaker-notes) + - [Server Side Speaker Notes](#server-side-speaker-notes) +- [Multiplexing](#multiplexing) + - [Master presentation](#master-presentation) + - [Client presentation](#client-presentation) + - [Socket.io server](#socketio-server) +- [MathJax](#mathjax) +- [Installation](#installation) + - [Basic setup](#basic-setup) + - [Full setup](#full-setup) + - [Folder Structure](#folder-structure) +- [License](#license) + +#### More reading +- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history. +- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own! +- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks. +- [Plugins](https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware): A list of plugins that can be used to extend reveal.js. + +## Online Editor + +Presentations are written using HTML or Markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [https://slides.com](https://slides.com?ref=github). + + +## Instructions + +### Markup + +Here's a barebones example of a fully working reveal.js presentation: +```html + + + + + + +

+
+
Slide 1
+
Slide 2
+
+
+ + + + +``` + +The presentation markup hierarchy needs to be `.reveal > .slides > section` where the `section` represents one slide and can be repeated indefinitely. If you place multiple `section` elements inside of another `section` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and will be included in the horizontal sequence. For example: + +```html +
+
+
Single Horizontal Slide
+
+
Vertical Slide 1
+
Vertical Slide 2
+
+
+
+``` + +### Markdown + +It's possible to write your slides using Markdown. To enable Markdown, add the `data-markdown` attribute to your `
` elements and wrap the contents in a ` +
+``` + +#### External Markdown + +You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file: the `data-separator` attribute defines a regular expression for horizontal slides (defaults to `^\r?\n---\r?\n$`, a newline-bounded horizontal rule) and `data-separator-vertical` defines vertical slides (disabled by default). The `data-separator-notes` attribute is a regular expression for specifying the beginning of the current slide's speaker notes (defaults to `note:`). The `data-charset` attribute is optional and specifies which charset to use when loading the external file. + +When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup). The following example customises all available options: + +```html +
+ +
+``` + +#### Element Attributes + +Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things. + +```html +
+ +
+``` + +#### Slide Attributes + +Special syntax (in html comment) is available for adding attributes to the slide `
` elements generated by your Markdown. + +```html +
+ +
+``` + +#### Configuring *marked* + +We use [marked](https://github.com/chjj/marked) to parse Markdown. To customise marked's rendering, you can pass in options when [configuring Reveal](#configuration): + +```javascript +Reveal.initialize({ + // Options which are passed into marked + // See https://github.com/chjj/marked#options-1 + markdown: { + smartypants: true + } +}); +``` + +### Configuration + +At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below. + +```javascript +Reveal.initialize({ + + // Display presentation control arrows + controls: true, + + // Help the user learn the controls by providing hints, for example by + // bouncing the down arrow when they first encounter a vertical slide + controlsTutorial: true, + + // Determines where controls appear, "edges" or "bottom-right" + controlsLayout: 'bottom-right', + + // Visibility rule for backwards navigation arrows; "faded", "hidden" + // or "visible" + controlsBackArrows: 'faded', + + // Display a presentation progress bar + progress: true, + + // Set default timing of 2 minutes per slide + defaultTiming: 120, + + // Display the page number of the current slide + slideNumber: false, + + // Push each slide change to the browser history + history: false, + + // Enable keyboard shortcuts for navigation + keyboard: true, + + // Enable the slide overview mode + overview: true, + + // Vertical centering of slides + center: true, + + // Enables touch navigation on devices with touch input + touch: true, + + // Loop the presentation + loop: false, + + // Change the presentation direction to be RTL + rtl: false, + + // Randomizes the order of slides each time the presentation loads + shuffle: false, + + // Turns fragments on and off globally + fragments: true, + + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + + // Flags if we should show a help overlay when the questionmark + // key is pressed + help: true, + + // Flags if speaker notes should be visible to all viewers + showNotes: false, + + // Global override for autoplaying embedded media (video/audio/iframe) + // - null: Media will only autoplay if data-autoplay is present + // - true: All media will autoplay, regardless of individual setting + // - false: No media will autoplay, regardless of individual setting + autoPlayMedia: null, + + // Number of milliseconds between automatically proceeding to the + // next slide, disabled when set to 0, this value can be overwritten + // by using a data-autoslide attribute on your slides + autoSlide: 0, + + // Stop auto-sliding after user input + autoSlideStoppable: true, + + // Use this method for navigation when auto-sliding + autoSlideMethod: Reveal.navigateNext, + + // Enable slide navigation via mouse wheel + mouseWheel: false, + + // Hides the address bar on mobile devices + hideAddressBar: true, + + // Opens links in an iframe preview overlay + // Add `data-preview-link` and `data-preview-link="false"` to customise each link + // individually + previewLinks: false, + + // Transition style + transition: 'slide', // none/fade/slide/convex/concave/zoom + + // Transition speed + transitionSpeed: 'default', // default/fast/slow + + // Transition style for full page slide backgrounds + backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom + + // Number of slides away from the current that are visible + viewDistance: 3, + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" + + // Number of pixels to move the parallax background per slide + // - Calculated automatically unless specified + // - Set to 0 to disable movement along an axis + parallaxBackgroundHorizontal: null, + parallaxBackgroundVertical: null, + + // The display mode that will be used to show slides + display: 'block' + +}); +``` + + +The configuration can be updated after initialization using the ```configure``` method: + +```javascript +// Turn autoSlide off +Reveal.configure({ autoSlide: 0 }); + +// Start auto-sliding every 5s +Reveal.configure({ autoSlide: 5000 }); +``` + + +### Presentation Size + +All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport. + +See below for a list of configuration options related to sizing, including default values: + +```javascript +Reveal.initialize({ + + ... + + // The "normal" size of the presentation, aspect ratio will be preserved + // when the presentation is scaled to fit different resolutions. Can be + // specified using percentage units. + width: 960, + height: 700, + + // Factor of the display size that should remain empty around the content + margin: 0.1, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.5 + +}); +``` + +If you wish to disable this behavior and do your own scaling (e.g. using media queries), try these settings: + +```javascript +Reveal.initialize({ + + ... + + width: "100%", + height: "100%", + margin: 0, + minScale: 1, + maxScale: 1 +}); +``` + +### Dependencies + +Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example: + +```javascript +Reveal.initialize({ + dependencies: [ + // Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/ + { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, + + // Interpret Markdown in
elements + { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + + // Syntax highlight for elements + { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, + + // Zoom in and out with Alt+click + { src: 'plugin/zoom-js/zoom.js', async: true }, + + // Speaker notes + { src: 'plugin/notes/notes.js', async: true }, + + // MathJax + { src: 'plugin/math/math.js', async: true } + ] +}); +``` + +You can add your own extensions using the same syntax. The following properties are available for each dependency object: +- **src**: Path to the script to load +- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false +- **callback**: [optional] Function to execute when the script has loaded +- **condition**: [optional] Function which must return true for the script to be loaded + +To load these dependencies, reveal.js requires [head.js](http://headjs.com/) *(a script loading library)* to be loaded before reveal.js. + +### Ready Event + +A 'ready' event is fired when reveal.js has loaded all non-async dependencies and is ready to start navigating. To check if reveal.js is already 'ready' you can call `Reveal.isReady()`. + +```javascript +Reveal.addEventListener( 'ready', function( event ) { + // event.currentSlide, event.indexh, event.indexv +} ); +``` + +Note that we also add a `.ready` class to the `.reveal` element so that you can hook into this with CSS. + +### Auto-sliding + +Presentations can be configured to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides: + +```javascript +// Slide every five seconds +Reveal.configure({ + autoSlide: 5000 +}); +``` +When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Alternatively, sliding can be paused or resumed by pressing »a« on the keyboard. Sliding is paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config. + +You can also override the slide duration for individual slides and fragments by using the ```data-autoslide``` attribute: + +```html +
+

After 2 seconds the first fragment will be shown.

+

After 10 seconds the next fragment will be shown.

+

Now, the fragment is displayed for 2 seconds before the next slide is shown.

+
+``` + +To override the method used for navigation when auto-sliding, you can specify the ```autoSlideMethod``` setting. To only navigate along the top layer and ignore vertical slides, set this to ```Reveal.navigateRight```. + +Whenever the auto-slide mode is resumed or paused the ```autoslideresumed``` and ```autoslidepaused``` events are fired. + + +### Keyboard Bindings + +If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option: + +```javascript +Reveal.configure({ + keyboard: { + 13: 'next', // go to the next slide when the ENTER key is pressed + 27: function() {}, // do something custom when ESC is pressed + 32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding) + } +}); +``` + +### Touch Navigation + +You can swipe to navigate through a presentation on any touch-enabled device. Horizontal swipes change between horizontal slides, vertical swipes change between vertical slides. If you wish to disable this you can set the `touch` config option to false when initializing reveal.js. + +If there's some part of your content that needs to remain accessible to touch events you'll need to highlight this by adding a `data-prevent-swipe` attribute to the element. One common example where this is useful is elements that need to be scrolled. + + +### Lazy Loading + +When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the `viewDistance` configuration option. + +To enable lazy loading all you need to do is change your "src" attributes to "data-src" as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible. + +```html +
+ + + +
+``` + + +### API + +The ``Reveal`` object exposes a JavaScript API for controlling navigation and reading state: + +```javascript +// Navigation +Reveal.slide( indexh, indexv, indexf ); +Reveal.left(); +Reveal.right(); +Reveal.up(); +Reveal.down(); +Reveal.prev(); +Reveal.next(); +Reveal.prevFragment(); +Reveal.nextFragment(); + +// Randomize the order of slides +Reveal.shuffle(); + +// Toggle presentation states, optionally pass true/false to force on/off +Reveal.toggleOverview(); +Reveal.togglePause(); +Reveal.toggleAutoSlide(); + +// Shows a help overlay with keyboard shortcuts, optionally pass true/false +// to force on/off +Reveal.toggleHelp(); + +// Change a config value at runtime +Reveal.configure({ controls: true }); + +// Returns the present configuration options +Reveal.getConfig(); + +// Fetch the current scale of the presentation +Reveal.getScale(); + +// Retrieves the previous and current slide elements +Reveal.getPreviousSlide(); +Reveal.getCurrentSlide(); + +Reveal.getIndices(); // { h: 0, v: 0 } } +Reveal.getPastSlideCount(); +Reveal.getProgress(); // (0 == first slide, 1 == last slide) +Reveal.getSlides(); // Array of all slides +Reveal.getTotalSlides(); // total number of slides + +// Returns the speaker notes for the current slide +Reveal.getSlideNotes(); + +// State checks +Reveal.isFirstSlide(); +Reveal.isLastSlide(); +Reveal.isOverview(); +Reveal.isPaused(); +Reveal.isAutoSliding(); +``` + +### Slide Changed Event + +A 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes. + +Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'slidechanged', function( event ) { + // event.previousSlide, event.currentSlide, event.indexh, event.indexv +} ); +``` + +### Presentation State + +The presentation's current state can be fetched by using the `getState` method. A state object contains all of the information required to put the presentation back as it was when `getState` was first called. Sort of like a snapshot. It's a simple object that can easily be stringified and persisted or sent over the wire. + +```javascript +Reveal.slide( 1 ); +// we're on slide 1 + +var state = Reveal.getState(); + +Reveal.slide( 3 ); +// we're on slide 3 + +Reveal.setState( state ); +// we're back on slide 1 +``` + +### Slide States + +If you set ``data-state="somestate"`` on a slide ``
``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide. + +Furthermore you can also listen to these changes in state via JavaScript: + +```javascript +Reveal.addEventListener( 'somestate', function() { + // TODO: Sprinkle magic +}, false ); +``` + +### Slide Backgrounds + +Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page backgrounds outside of the slide area by adding a ```data-background``` attribute to your ```
``` elements. Four different types of backgrounds are supported: color, image, video and iframe. + +#### Color Backgrounds +All CSS color formats are supported, like rgba() or hsl(). +```html +
+

Color

+
+``` + +#### Image Backgrounds +By default, background images are resized to cover the full page. Available options: + +| Attribute | Default | Description | +| :--------------------------- | :--------- | :---------- | +| data-background-image | | URL of the image to show. GIFs restart when the slide opens. | +| data-background-size | cover | See [background-size](https://developer.mozilla.org/docs/Web/CSS/background-size) on MDN. | +| data-background-position | center | See [background-position](https://developer.mozilla.org/docs/Web/CSS/background-position) on MDN. | +| data-background-repeat | no-repeat | See [background-repeat](https://developer.mozilla.org/docs/Web/CSS/background-repeat) on MDN. | +```html +
+

Image

+
+
+

This background image will be sized to 100px and repeated

+
+``` + +#### Video Backgrounds +Automatically plays a full size video behind the slide. + +| Attribute | Default | Description | +| :--------------------------- | :------ | :---------- | +| data-background-video | | A single video source, or a comma separated list of video sources. | +| data-background-video-loop | false | Flags if the video should play repeatedly. | +| data-background-video-muted | false | Flags if the audio should be muted. | +| data-background-size | cover | Use `cover` for full screen and some cropping or `contain` for letterboxing. | + +```html +
+

Video

+
+``` + +#### Iframe Backgrounds +Embeds a web page as a slide background that covers 100% of the reveal.js width and height. The iframe is in the background layer, behind your slides, and as such it's not possible to interact with it by default. To make your background interactive, you can add the `data-background-interactive` attribute. +```html +
+

Iframe

+
+``` + +#### Background Transitions +Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition. + + +### Parallax Background + +If you want to use a parallax scrolling background, set the first two config properties below when initializing reveal.js (the other two are optional). + +```javascript +Reveal.initialize({ + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto) + + // Number of pixels to move the parallax background per slide + // - Calculated automatically unless specified + // - Set to 0 to disable movement along an axis + parallaxBackgroundHorizontal: 200, + parallaxBackgroundVertical: 50 + +}); +``` + +Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://revealjs.com/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg¶llaxBackgroundSize=2100px%20900px). + + + +### Slide Transitions +The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute: + +```html +
+

This slide will override the presentation transition and zoom!

+
+ +
+

Choose from three transition speeds: default, fast or slow!

+
+``` + +You can also use different in and out transitions for the same slide: + +```html +
+ The train goes on … +
+
+ and on … +
+
+ and stops. +
+
+ (Passengers entering and leaving) +
+
+ And it starts again. +
+``` + + +### Internal links + +It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```
```): + +```html +Link +Link +``` + +You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide. + +```html + + + + + + +``` + + +### Fragments +Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://revealjs.com/#/fragments + +The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment: + +```html +
+

grow

+

shrink

+

fade-out

+

fade-up (also down, left and right!)

+

visible only once

+

blue only once

+

highlight-red

+

highlight-green

+

highlight-blue

+
+``` + +Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second. + +```html +
+ + I'll fade in, then out + +
+``` + +The display order of fragments can be controlled using the ```data-fragment-index``` attribute. + +```html +
+

Appears last

+

Appears first

+

Appears second

+
+``` + +### Fragment events + +When a slide fragment is either shown or hidden reveal.js will dispatch an event. + +Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'fragmentshown', function( event ) { + // event.fragment = the fragment DOM element +} ); +Reveal.addEventListener( 'fragmenthidden', function( event ) { + // event.fragment = the fragment DOM element +} ); +``` + +### Code syntax highlighting + +By default, Reveal is configured with [highlight.js](https://highlightjs.org/) for code syntax highlighting. To enable syntax highlighting, you'll have to load the highlight plugin ([plugin/highlight/highlight.js](plugin/highlight/highlight.js)) and a highlight.js CSS theme (Reveal comes packaged with the zenburn theme: [lib/css/zenburn.css](lib/css/zenburn.css)). + +Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present, surrounding whitespace is automatically removed. HTML will be escaped by default. To avoid this, for example if you are using `` to call out a line of code, add the `data-noescape` attribute to the `` element. + +```html +
+

+(def lazy-fib
+  (concat
+   [0 1]
+   ((fn rfib [a b]
+        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
+	
+
+``` + +### Slide number +If you would like to display the page number of the current slide you can do so using the ```slideNumber``` and ```showSlideNumber``` configuration values. + +```javascript +// Shows the slide number using default formatting +Reveal.configure({ slideNumber: true }); + +// Slide number formatting can be configured using these variables: +// "h.v": horizontal . vertical slide number (default) +// "h/v": horizontal / vertical slide number +// "c": flattened slide number +// "c/t": flattened slide number / total slides +Reveal.configure({ slideNumber: 'c/t' }); + +// Control which views the slide number displays on using the "showSlideNumber" value: +// "all": show on all views (default) +// "speaker": only show slide numbers on speaker notes view +// "print": only show slide numbers when printing to PDF +Reveal.configure({ showSlideNumber: 'speaker' }); + +``` + + +### Overview mode + +Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides, +as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks: + +```javascript +Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } ); +Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } ); + +// Toggle the overview mode programmatically +Reveal.toggleOverview(); +``` + + +### Fullscreen mode +Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode. + + +### Embedded media +Add `data-autoplay` to your media element if you want it to automatically start playing when the slide is shown: + +```html + +``` + +If you want to enable or disable autoplay globally, for all embedded media, you can use the `autoPlayMedia` configuration option. If you set this to `true` ALL media will autoplay regardless of individual `data-autoplay` attributes. If you initialize with `autoPlayMedia: false` NO media will autoplay. + +Note that embedded HTML5 `