Last active
December 18, 2015 11:48
-
-
Save pilipolio/5777914 to your computer and use it in GitHub Desktop.
Exercise 1 from chapter 2 of Gaussian Processes book
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "GaussianProcesses" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Predictive _a posteriori_ in the function-space\n", | |
"\n", | |
"Exercise 1 based on :\n", | |
"\n", | |
" - equation 2.16 which introduces the Squared Exponential covariance function between pairs of random variable. Note that the covariance between _outputs_ is a function of the _inputs_. \n", | |
"\n", | |
"$$ \\text{cov}\\big(f(x_p), f(x_q)\\big) = k(x_p, x_q) = \\text{exp} \\big(- \\frac{1}{2} |x_p - x_q|^2 \\big)$$\n", | |
"\n", | |
" - equation 2.19 which identify the a posteriori distribution of $f$ as a gaussian process\n", | |
"\n", | |
"$$ f_{\\star} | X_{\\star}, X, f \\sim \\mathcal{N}\\big( \\bar{f} _ \\star, \\text{cov}(f_\\star) \\big) $$\n", | |
"\n", | |
"$$ \\bar{f} _ \\star = K(X_{\\star}, X) K(X, X)^{-1} f $$\n", | |
"\n", | |
"$$ \\text{cov}(f_\\star) = K(X_\\star , X_\\star ) \u2212 K(X_\\star , X) K(X, X)^{\u22121} K(X, X_\\star ) \\big) $$\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Let's first generate $n$ inputs uniformly distributed and calculate the covariance matrix $\\mathbf{\\Sigma} \\in \\mathcal{M}_{n,n}$ where $\\mathbf{\\Sigma} _{p,q} = k(x_p, x_q)$." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"n = 5\n", | |
"x_n = np.sort(np.random.uniform(0,1, n))\n", | |
"dist_n_n = np.array([[x_q - x_p for x_q in x_n] for x_p in x_n])\n", | |
"print 'x_n = \\n {} \\n'.format(x_n)\n", | |
"\n", | |
"print 'dist_n_n = \\n {} \\n'.format(dist_n_n)\n", | |
"\n", | |
"cov_n_n = np.exp(-.5 * np.power(dist_n_n, 2))\n", | |
"print 'cov_n_n = \\n {}'.format(cov_n_n)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"x_n = \n", | |
" [ 0.00427239 0.30364347 0.41879805 0.76506937 0.82418712] \n", | |
"\n", | |
"dist_n_n = \n", | |
" [[ 0. 0.29937108 0.41452566 0.76079698 0.81991473]\n", | |
" [-0.29937108 0. 0.11515459 0.4614259 0.52054365]\n", | |
" [-0.41452566 -0.11515459 0. 0.34627132 0.40538907]\n", | |
" [-0.76079698 -0.4614259 -0.34627132 0. 0.05911775]\n", | |
" [-0.81991473 -0.52054365 -0.40538907 -0.05911775 0. ]] \n", | |
"\n", | |
"cov_n_n = \n", | |
" [[ 1. 0.95617768 0.91767153 0.74870815 0.71453015]\n", | |
" [ 0.95617768 1. 0.99339164 0.89901377 0.87329414]\n", | |
" [ 0.91767153 0.99339164 1. 0.94180982 0.92111522]\n", | |
" [ 0.74870815 0.89901377 0.94180982 1. 0.99825407]\n", | |
" [ 0.71453015 0.87329414 0.92111522 0.99825407 1. ]]\n" | |
] | |
} | |
], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now let's generate an observation from the centered gaussian process with that covariance function.\n", | |
"\n", | |
"In order to [draw values](http://en.wikipedia.org/wiki/Multivariate_normal_distribution#Drawing_values_from_the_distribution) from the multivariate gaussian distribution $\\mathcal{N}(0, \\Sigma)$, it is needed to find the matrix $A \\in \\mathcal{M} _{n,n}$ so that $A A^T = \\Sigma$. This can be achieved by decomposing eigen-vectors decomposition of $\\Sigma$ :\n", | |
"\n", | |
"$$\n", | |
"\\mathbf{\\Sigma} = \\mathbf{U} \\mathbf{\\Lambda} \\mathbf{U}^T = (\\mathbf{U} \\mathbf{\\Lambda}^{1/2}) (\\mathbf{\\Lambda}^{1/2} \\mathbf{U}^T)\n", | |
"$$\n", | |
"\n", | |
"Let $\\mathbf{x} =(\\mathbf{x} _i) _{i=1, \\ldots, n}$ be a vector of $n$ i.i.d. values drawn from a centered and scaled normal distribution :\n", | |
"\n", | |
"$$\n", | |
"(\\mathbf{x} _i) _{i=1, \\ldots, n} \\sim \\mathcal{N}(0, 1) \n", | |
"$$\n", | |
"\n", | |
"$$\n", | |
"\\mathbf{U} \\mathbf{\\Lambda}^{1/2} \\mathbf{x} + \\mu \\sim \\mathcal{N}(\\mu, \\Sigma)\n", | |
"$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# First perform Eigen vectors decomposition on cov_n_n\n", | |
"lambda_n, U_n_n = np.linalg.eigh(cov_n_n)\n", | |
"\n", | |
"print 'lambda_n = \\n {} \\n'.format(lambda_n)\n", | |
"print 'U_n_n = \\n {} \\n'.format(U_n_n)\n", | |
"\n", | |
"# Then generate n iid centered and scaled normal observations\n", | |
"iid_n = np.random.normal(loc=0, scale=1, size = n)\n", | |
"\n", | |
"print 'iid_n = \\n {} \\n'.format(iid_n)\n", | |
"\n", | |
"# Then multiply by U Lambda^1/2\n", | |
"np.dot(np.dot(U_n_n, np.diag(np.sqrt(lambda_n))), iid_n)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"lambda_n = \n", | |
" [ 5.96878939e-07 5.23633322e-05 1.22147687e-02 3.96788007e-01\n", | |
" 4.59094426e+00] \n", | |
"\n", | |
"U_n_n = \n", | |
" [[ 0.05353598 -0.13791018 0.59412317 -0.66848651 -0.42220625]\n", | |
" [-0.46091879 0.56213139 -0.44156714 -0.25473786 -0.460097 ]\n", | |
" [ 0.56473718 -0.38789862 -0.55545861 -0.07453153 -0.46531426]\n", | |
" [-0.55460338 -0.52486943 0.11707407 0.4505374 -0.44747836]\n", | |
" [ 0.39771192 0.4889129 0.36027143 0.52886246 -0.43965713]] \n", | |
"\n", | |
"iid_n = \n", | |
" [ 0.00456681 0.05748879 0.1451394 -0.22152869 2.08054321] \n", | |
"\n" | |
] | |
}, | |
{ | |
"output_type": "pyout", | |
"prompt_number": 3, | |
"text": [ | |
"array([-1.77938614, -2.02235819, -2.07298117, -2.05601382, -2.02775131])" | |
] | |
} | |
], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def calculate_cov(x_n, x_m=None, l=1):\n", | |
" \"\"\" Return the n x m covariance matrix Sigma[p,q] = k(x_m[p], x_m[q]) \"\"\"\n", | |
" x_m = x_n if x_m is None else x_m\n", | |
" dist_n_m = np.array([[x_q - x_p for x_q in x_m] for x_p in x_n])\n", | |
" cov_n_m = np.exp(-.5 * np.power(dist_n_m / l, 2))\n", | |
" return cov_n_m\n", | |
" \n", | |
"def draw_gaussian_vector(cov_n_n, m, l=1):\n", | |
" n = cov_n_n.shape[0]\n", | |
" # use np.linalg.eigh because matrix symmetrical, but needs to replace nan returned by sqrt by 0 \n", | |
" lambda_n, U_n_n = np.linalg.eigh(cov_n_n)\n", | |
" sqrt_lambda_n = np.sqrt(lambda_n)\n", | |
" sqrt_lambda_n[np.isnan(sqrt_lambda_n)] = 0\n", | |
" iid_n = np.random.normal(loc=0, scale=1, size = (n, m))\n", | |
" y_m_n = np.dot(np.dot(U_n_n, np.diag(sqrt_lambda_n)), iid_n)\n", | |
" return np.transpose(y_m_n)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 60 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# Now sampling repeatedly m samples to estimate empirically the 95% confidence interval\n", | |
"n = 100\n", | |
"m = 1000\n", | |
"x_n = np.sort(np.random.uniform(0, 1, n))\n", | |
"cov_n_n = calculate_cov(x_n, l=.1)\n", | |
"y_m_n = draw_gaussian_vector(cov_n_n, m=m, l=.1)\n", | |
"\n", | |
"plt.fill_between(x_n,\n", | |
" y1=np.percentile(y_m_n, 2.5, axis=0),\n", | |
" y2=np.percentile(y_m_n, 97.5, axis=0),\n", | |
" color='grey', alpha=.25);\n", | |
"\n", | |
"plt.plot(\n", | |
" x_n, y_m_n[np.random.randint(0, m),:],\n", | |
" x_n, y_m_n[np.random.randint(0, m),:],\n", | |
" x_n, y_m_n[np.random.randint(0, m),:]\n", | |
");" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"png": "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\n" | |
} | |
], | |
"prompt_number": 78 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Predictive a posteriori distribution of $f_\\star$ with free noise observations\n", | |
"\n", | |
"- $X_\\star \\in [0;1]^m$ : $m$ test points where we want to predict $f_\\star$\n", | |
"- $X \\in [0;1]^n$ : $n$ training points we obseved $f$\n", | |
"- $K(X_\\star, X) \\in \\mathcal{M}_ {m,n}$ where $K(X_\\star, X) _{i,j} = k ( {X _ \\star} _ i, {X _ \\star} _ j)$\n", | |
"- $K(X, X) \\in \\mathcal{M}_ {n,n}$\n", | |
"\n", | |
"Could be drawn from the prior and keeping only functions...\n", | |
"$$\n", | |
"\\mathbb{E}[f_\\star | X_{\\star}, X, f] = K(X_{\\star}, X) K(X, X)^{-1} f\n", | |
"$$\n", | |
"\n", | |
"$$\n", | |
"\\text{Var}[f_\\star | X_{\\star}, X, f] = K(X_\\star , X_\\star ) \u2212 K(X_\\star , X) K(X, X)^{\u22121} K(X, X_\\star )\n", | |
"$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# Train set data points, for the sake of the example observed values f are iid sampled from a normal distribution \n", | |
"n = 4\n", | |
"x_n = np.sort(np.random.uniform(0, 1, n))\n", | |
"cov_n_n = calculate_cov(x_n, l=.1)\n", | |
"f_n = np.random.normal(size=n)\n", | |
"\n", | |
"# Predicted test data points\n", | |
"m = 100\n", | |
"x_star_m = np.linspace(0,1,m)\n", | |
"k_x_star_x_observed = calculate_cov(x_n=x_star_m, x_m=x_n,l=.1)\n", | |
"cov_x_star_m_m = calculate_cov(x_n=x_star_m, l=.1)\n", | |
"#np.dot(, f_n)\n", | |
"\n", | |
"# Estimate the predicted f for the m test points\n", | |
"f_star_m = np.dot(np.dot(k_x_star_x_observed, np.linalg.inv(cov_n_n)), f_n)\n", | |
"\n", | |
"# Estimate the variance of f for the m test points\n", | |
"var_f_star_m = np.diag(cov_x_star_m_m - np.dot(np.dot(k_x_star_x_observed, np.linalg.inv(cov_n_n)), k_x_star_x_observed.T))\n", | |
"\n", | |
"plt.plot(x_n, f_n, 'ko', label='$f$');\n", | |
"plt.plot(x_star_m, f_star_m, 'k', label='$\\mathbb{E}[f_\\star]$');\n", | |
"plt.fill_between(x_star_m, y1=f_star_m-1.96*var_f_star_m, y2=f_star_m+1.96*var_f_star_m, color='grey', alpha=.25);\n", | |
"plt.legend();" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"png": "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\nSKQAAAAASUVORK5CYII=\n" | |
} | |
], | |
"prompt_number": 63 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"More reallistically, we model an additive i.i.d. gaussian noise $\\epsilon$ of variance $\\sigma_n$ on the observed values $y = f(\\mathbf{x}) + \\epsilon$. This changes equation (2.19) by an additional conditionning term $\\sigma_n^2 I$ added to the observed values covariance matrix $K(X, X)$.\n", | |
"\n", | |
"$$ \\bar{f} _ \\star = K(X_{\\star}, X) ( K(X, X)^{-1} + \\sigma_n^2 I)f $$\n", | |
"\n", | |
"$$ \\text{cov}(f_\\star) = K(X_\\star , X_\\star ) \u2212 K(X_\\star , X) (K(X, X) + \\sigma_n^2 I )^{\u22121} K(X, X_\\star ) \\big) $$\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# Estimate the predicted f for the m test points\n", | |
"sigma_squared_n = .15\n", | |
"inversed_cov_n_n = np.linalg.inv(cov_n_n + np.diag(np.repeat(sigma_squared_n, n)))\n", | |
"\n", | |
"f_star_m = np.dot(np.dot(k_x_star_x_observed, inversed_cov_n_n), f_n)\n", | |
"\n", | |
"# Estimate the variance of f for the m test points\n", | |
"var_f_star_m = np.diag(cov_x_star_m_m - np.dot(np.dot(k_x_star_x_observed, inversed_cov_n_n), k_x_star_x_observed.T))\n", | |
"\n", | |
"plt.plot(x_n, f_n, 'ko', label='$f + \\epsilon$');\n", | |
"plt.plot(x_star_m, f_star_m, 'k', label='$\\mathbb{E}[f_\\star]$');\n", | |
"plt.fill_between(x_star_m, y1=f_star_m-1.96*var_f_star_m, y2=f_star_m+1.96*var_f_star_m, color='grey', alpha=.25);\n", | |
"plt.legend();" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"png": "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\n" | |
} | |
], | |
"prompt_number": 65 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### The kernel trick\n", | |
"\n", | |
" - Feature space\n", | |
" - explicit feature space formulation versus alternative formulation\n", | |
" - Function-space view and choice of a basis function\n", | |
" - The Gram matrix $K$\n", | |
" - Andrew Ng courses on Kernels [1](https://class.coursera.org/ml/lecture/preview_view/74) and [2](https://class.coursera.org/ml/lecture/preview_view/75) \n", | |
"\n", | |
"Linear model in the input space of dimensionnality $D$ : $ f(\\mathbf{x}) = \\mathbf{x}^T \\mathbf{w} $\n", | |
"\n", | |
"- $\\mathbf{x}, \\mathbf{w} \\in \\mathbb{R}^D$\n", | |
"\n", | |
"This strong linear assumption can be relaxed by _mapping_ input observations into a _feature space_ of dimensionality $N >> D$ :\n", | |
"\n", | |
"- $\\phi(\\mathbf{x}): \\mathbb{R}^D \\rightarrow \\mathbb{R}^N$\n", | |
"- $\\phi(\\mathbf{x}), \\mathbf{w} \\in \\mathbb{R}^N$\n", | |
"\n", | |
"The linear model in this feature space is now : $ f(\\mathbf{x}) = \\phi(\\mathbf{x})^T \\mathbf{w} $.\n", | |
"\n", | |
"The ordinary least squares solution for $\\mathbf{w}$ is applicable by replacing the original $D \\times n$ _design matrix_ $X$ by its $N \\times n$ counter part in the _feature space_ $\\Phi = \\Phi(X)$:\n", | |
"\n", | |
"$$ \\hat{\\mathbf{w}} = \\underset{\\mathbf{w}}{\\text{arg min}} \\ || y - \\phi(\\mathbf{x})^T \\mathbf{w}||_2$$\n", | |
"\n", | |
"$$ \\hat{\\mathbf{w}} = (\\Phi \\Phi^T )^{-1} \\Phi \\mathbf{y} $$\n", | |
"\n", | |
"The prediction of _test data_ $f_\\star$ with inputs $X_\\star$ is: \n", | |
"$$ \\hat{f_\\star} = \\Phi_\\star^T (\\Phi \\Phi^T )^{-1} \\Phi \\mathbf{y} $$\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# 1D example with a polynomial basis\n", | |
"def unknown_function(x):\n", | |
" return .1 + x ** x - 1.5 ** x + 1\n", | |
"\n", | |
"n = 10\n", | |
"sigma_n = .05\n", | |
"\n", | |
"x_n = np.sort(np.random.uniform(0, 1, n))\n", | |
"y_n = unknown_function(x_n) + np.random.normal(scale=sigma_n, size=n)\n", | |
"\n", | |
"plt.plot(x_n, y_n, 'bx',)\n", | |
"plt.plot(np.linspace(0,1,100), unknown_function(np.linspace(0,1,100)), 'k--',)\n", | |
"plt.legend(['$f(\\mathbf{x}) + \\epsilon$', '$f$']);" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"png": "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\nYII=\n" | |
} | |
], | |
"prompt_number": 137 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def build_design_matrix(x_d_n, )\n", | |
"# d = 2 (linear + constant terms)\n", | |
"X_d_n = np.vstack((np.repeat(1, n), x_n))\n", | |
"hat_w_d = np.dot(\n", | |
" np.dot(\n", | |
" np.linalg.inv(np.dot(X_d_n, X_d_n.T)),\n", | |
" X_d_n),\n", | |
" y_n)\n", | |
"print hat_w_d\n", | |
"\n", | |
"def predicted_function(x_n, hat_w_d):\n", | |
" X_d_n = np.vstack((np.repeat(1, len(x_n)), x_n))\n", | |
" return np.dot(X_d_n.T, hat_w_d)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"[ 0.86467012 -0.41651876]\n" | |
] | |
} | |
], | |
"prompt_number": 140 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"plt.plot(x_n, y_n, 'bx',)\n", | |
"plt.plot(np.linspace(0,1,100), unknown_function(np.linspace(0,1,100)), 'k--',)\n", | |
"plt.plot(np.linspace(0,1,100), predicted_function(np.linspace(0,1,100), hat_w_d), 'r-', lw=2)\n", | |
"\n", | |
"plt.legend(['$f(\\mathbf{x}) + \\epsilon$', '$f$', '$\\hat{f}$']);" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD9CAYAAABHnDf0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8THf+P/BXbtUIInGrXFxyaYIQSgQpolosrTsx+/va\nFrW2qqXd3my6K7HLstptFX1QVVusQZVGXYZlM6ouCaGUpOqSkESEkAtBLpPP74/PJpPIbTKZmTOZ\nvJ6PRx7MOWfOeee0eeXjM5/z+dgJIQSIiMim2CtdABERmR7DnYjIBjHciYhsEMOdiMgGMdyJiGwQ\nw52IyAbVGu7Tp09Hu3bt0L179yr3//vf/0ZwcDB69OiBsLAwnDt3zuRFEhFR3dQa7tOmTYNGo6l2\nv4+PD3744QecO3cOf/7zn/H73//epAUSEVHd1RruAwcOhJubW7X7+/fvD1dXVwBAaGgo0tLSTFcd\nEREZxaR97uvWrcPIkSNNeUoiIjKCo6lOFBsbi6+++gpHjx6tcr+dnZ2pLkVE1KgYM0uMSVru586d\nw8yZM7Fr164au3CEEPwSAgsWLFC8Bmv54r3gveC9qPnLWPUO9+vXr2P8+PHYtGkT/Pz86ns6IiIy\ngVq7ZVQqFQ4fPoysrCx4e3sjOjoaRUVFAIBZs2Zh4cKFyM7OxmuvvQYAcHJyQnx8vHmrJiKiGtmJ\n+rT763IhO7t6/RPDlmi1WoSHhytdhlXgvdDjvdDjvdAzNjsZ7kREVszY7DTZaBkialzc3d2RnZ2t\ndBk2w83NDXfv3jXZ+dhyJyKj8GfatKq7n8beZ04cRkRkgxjuREQ2iOFORGSDGO5ERDaI4U5EZIMY\n7kTUKCUnJ9e4PyMjAw8ePLBQNabHcCeiRufq1as4ceJEjce0adMG//jHPyxUkekx3Imo0VmzZg1U\nKlWNxzg6OmLUqFHYsGGDhaoyLYY7EZnUnj1ATk7FbTk5crsl3l+dTz75BJGRkfjss8/g7e1t0HtC\nQkJw8ODBWo9btWpV/YozA4Y7EZlUWBgQGakP6Jwc+ToszDLvr0pubi62bduGMWPG4N69exgyZIjB\n723Tpg0uX75c4zFZWVnGF2cmDHciMqmWLYFFi2Qgp6TIPxctktst8f6qxMXFoWfPnujbty9OnjyJ\nrl27lu1buHAh3N3d4evrix07dsDV1RW/+93vyvYHBwcjISHB+IsrhBOHEZHJtWwJvPsu0LkzkJxc\n92Cu7/vLi4uLw/Lly+Hp6YmdO3fiwYMHFZb9/Mtf/gIPDw/Mnz8fqamp+OSTTzB9+vSy/W5ubvj1\n11+Nvv6ZM2fw1VdfITg4GGFhYejSpYvx30wdMNyJyORycoBly2QwL1tW95Z3fd9fXmhoKJydnTF3\n7lx069YNK1eurHTMjBkzsHbtWqxduxbnz5+vsM/Z2RmFhYUVtiUlJVX4oPXHH3/Eo0ePyl4PHDgQ\nI0eORFpaGsaNG4eEhAS0atXKuG/AWMJCLHgpIrKA6n6ms7OFmD1b/lnV69rU9/1V6dq1qygpKRFC\nCDFs2LAqj5k2bZp44oknREJCQoXt27dvF6tXr67x/FFRUVVu//jjj0W/fv3E6tWrxYYNG2o8R3X3\n09jsZJ87EZnU0aMVW9qlfehHj1rm/Y/LzMxE69aty7pinnrqKdy/f7/CMRqNBn5+fnj55ZcxZ86c\nCvsyMjKMXh/a3d0dY8aMwaxZszB16lTjvgEjMdyJyKRGjarchdKypdxuifc/Li4uDmHlhtoMHjy4\nwjrP77zzDqZOnQoXFxd06NABJ06cwPDhw3Hr1i0AwE8//VTh/XVRGug7d+7Ed999h9zcXOO+CWPU\n1rSfNm2aaNu2rQgKCqpyf1JSkujXr59o0qSJ+Oijj6o9jwGXIqIGxNp/pk+dOiVmzZol5s+fL376\n6aey7dnZ2SIyMtKgczx8+FC89dZbtR63dOlSo+ssVd39NPY+19pynzZtGjQaTbX7W7VqhRUrVuCd\nd94x2S8cIqL6cnBwgJeXF1q3bo3g4OCy7S1btkTr1q0NGpu+ZcsWzJo1q9bj3nvvvXrVag61jpYZ\nOHAgUlJSqt3fpk0btGnTBnvq+/gYEZEJ9ezZEz179qxy39y5c/Hll19i5syZ1b4/NTUVbm5uCAgI\nMFeJZsWhkETU6NjZ2dUY7ADg7e1t8DQF1sii4R4VFVX29/DwcISHh1vy8kREVk+r1UKr1db7PBYN\n9w8//BCOjvzHAhFRdR5v+EZHRxt1HpMNhZQf6tbs7NmzprocERHVoNZmtEqlwuHDh5GVlQVvb29E\nR0ejqKgIADBr1izcvHkTISEhyMvLg729PZYvX47ExEQ0a9as0rkOHz6M3r17m/67ICKiCuyEIU1u\nU1zIzg6jR49GTEyMJS5HRGZmZ2dn0L/YyTDV3U9j77NFn1B94403LHk5IqJGy6Itd/6WJ7Id/Jk2\nrQbdciciIstguBMR2SAOOieiRuGTTz5BVlYWOnToYNB8MQ0dw52IbF7pAtnLly+Hi4uL0uVYhMXD\n/a9//Ss8PDwwY8YMS1+aiBqp8gtkNxYW73P39PTEwYMHLX1ZIlJAVFQU7OzsKn2Vn2eqpuOrO64u\nShfILi4uxs6dO+t9vobC4kMhr127hpCQEKSnp8PJyckSlyYiM2hIQyEnTpyI6OhodOvWTelSqtXg\nh0J27NgRPj4+OHTokKUvTUSNVFJSErp27ap0GRalyFDI3/72t9i8ebMSlyaiRubxBbIbC0XCffLk\nyUhISEBJSYkSlyeiRuTxBbIbC8WmHxBCNLrfpES2xNr73BMSErB27Vq4u7sjIiKiwjqq1sjUfe6K\njXNnsBOROZUukN20aVOrD3Zz4MRhRGQU/kybVoMfLUNERObHcCciskGKh/vatWuRkZGhdBlERDZF\n8XA/deoUvvzyS6XLICKyKbWG+/Tp09GuXTt079692mPefPNN+Pv7Izg4GGfOnKlTAa+//jrWrFlT\ntug2ERHVX63hPm3aNGg0mmr37927F5cvX8alS5fwxRdf4LXXXqtTAT169ICPjw8XziYiMqFaw33g\nwIFwc3Ordv+uXbvw8ssvAwBCQ0ORk5ODzMzMOhUxZ84crFy5sk7vISKi6tX7Iab09HR4e3uXvfby\n8kJaWhratWtX6djy03eGh4cjPDwcADBu3DjMmzcPv/zyCwIDA+tbEhFRg6XVaqHVaut9HpM8ofr4\nAPvqnj6tbm5mJycnnDx5Eh4eHqYoh4gIAPDw4UPY2dnhySefVLoUg5Vv+AJAdHS0Ueepd7h7enoi\nNTW17HVaWho8PT2NOg8RkanodLqyBuXf//532NsrPjjQour93Y4ePRobNmwAAJw4cQItW7asskuG\niMiStFot/vjHP+Ktt95CbGys0uVYXK1zy6hUKhw+fBhZWVlo164doqOjy4Ytlq4gPmfOHGg0Gri4\nuGD9+vV45plnKl+I81AQ2RT+TJuWqeeW4cRhRGSUhvYz/cknnyArKwsdOnQoa5haE5ufOKywsBBL\nly6FTqdTuhQishG5ubnYtm0bxowZg2effVbpcixCsfncq+Pk5ITvvvsOPj4+mDRpktLlEJENiIuL\nQ8+ePdG3b1+lS7EYq2u529nZITIyEosWLWpQ/+QjosfY2Znmq57i4uKwfPlyFBcXY+fOnSb4xhoG\nqwt3ABg1ahSEENi7d6/SpRBRAxcaGgpnZ2fMmzcP48aNU7oci7HKcLezs8Of/vQntt6JGjIhTPNl\nAklJSejatatJztVQWGW4A8DEiRORl5eH06dPK10KETVgmZmZaN26daNbt9nqPlAt5eDggPj4eDRt\n2lTpUoioAYuLi0NYWJjSZVic1YY7AAY7ERktISEBa9euhbu7OyIiIpQux+KsOtyJiIzl4OAALy8v\nNG3aFMHBwUqXY3E284Tqnj1AWBjQsqV+W04OcPQoMGqU2S5L1Gg1tCdUrZ3NP6Fak5q+wbAwIDJS\nBjog/4yMlNuJiBqbBhPuX3/9NebPn1/t/pYtgUWLZKCnpMg/Fy2q2JInImosGky3TGZmJoKCgnDk\nyJEaV2tKSQE6dwaSk4FOnYy+HBHVgt0yptVou2XatWuHyMhIvPHGG9V+ozk5wLJlMtiXLdN30RAR\nNTYNJtwB4PXXX0dGRkaV80OU9rEvWiRb7KVdNAx4ImqMGky3TKnY2FhMmzYNiYmJFcbBc7QMkWWx\nW8a0uFgHgLVr12Ly5MlwdXU1yfmIqO7c3d2RnZ2tdBk2w83NDXfv3q20vVGFOxFRY2HzH6gSEZHh\nag13jUaDwMBA+Pv7Y+nSpZX2Z2dnY9y4cQgODkZoaCguXLhglkKJiMhwNYa7TqfDnDlzoNFokJiY\nCLVajaSkpArHLF68GM888wzOnj2LDRs2YO7cuWYtmIiIaldjuMfHx8PPzw+dOnWCk5MTpkyZgpiY\nmArHJCUlYciQIQCAgIAApKSk4Pbt2+ar+DHp6el4++232Z9PRFROjbNCpqenw9vbu+y1l5cX4uLi\nKhwTHByMHTt24Nlnn0V8fDyuXbuGtLQ0tGnTptL5oqKiyv4eHh6O8PDw+lUPoG3bttBqtVi3bh1e\nffXVep+PiEhJWq0WWq223uepMdwNWbnkgw8+wNy5c9GrVy90794dvXr1goODQ5XHlg93U3FycsLG\njRvLfln4+fmZ/BpERJbyeMM3OjraqPPUGO6enp5ITU0te52amgovL68KxzRv3hxfffVV2evOnTvD\nx8fHqGKM1a1bN3z44YeYOnUqjhw5AkdHTlNPRI1bjX3uffr0waVLl5CSkoLCwkJs3boVo0ePrnBM\nbm4uCgsLAciHiwYPHoxmzZqZr+JqvPHGG2jWrBmWLFli8WsTEVmbGpu4jo6OWLlyJYYPHw6dTocZ\nM2agS5cuWLNmDQBg1qxZSExMxCuvvAI7OzsEBQVh3bp1Fin8cfb29li/fj3++9//KnJ9IiJrwidU\niYisGJ9QJSKiMgx3IiIbZPPhrtPplC6BiMjiLBvuGzYAeXkWu1xqaip69epV5TSaRES2zLLh/vLL\nQLt2wMSJwPbtwMOHZr2ct7c3nn/+eahUKrbgiahRsexomUGDgCNHgNJLNm8OjB0LqFTA888DTk4m\nv25xcTGGDx+OkJAQjoEnogan4SzWkZYGbN0KqNVAQoL+gFatgEmTgClTgIEDAXvT/aMiKyurLNwj\nIiJMdl4iInNrOOFe3qVLwJYtMujLTyXs6QlERMgWfe/egAFz3NTmp59+wtixYyutvVoe12ElImvT\nMMO9lBDAuXMy5LdsAa5d0+/z95eteZUK6NKlXjXcv3+/xqkRcnKAyEhg0SIZ8I+/JiKytIYd7uUJ\nAZw4IYN+2zYgM1O/LzhYhvyUKUDHjmapszTQ330XWLaMwU5EyrKdcC+vuBjQamXQf/stkJur3zdg\ngAz5yZPlCBwTSkkBOncGkpOBTp1MemoiojqxzXAvr6AA2L9fBn1MjH4Ypb098NxzskU/fny9m9ls\nuRORNbH9cC/v/n3g++9l0Gs0QFGR3P7EE8CIETLoX3oJcHGp8TQxMTG4dOkS3nnnHQDscyci69O4\nwr28u3eBHTtk0MfG6sfQu7gAo0fLoB8+XAb/Y9LT0/Hss89iwYIFeOWVVzhahoisTuMN9/IyMoBv\nvpFBf+KEfrubGzBhggz6wYOBcssAXrx4EeHh4fjiiy/w0ksvmbc+IqI6Yrg/7upVOaxyyxbg55/1\n2596Sn4Iq1IBoaGAnR3i4+MxatQobN++HYMHD7ZcjUREtWC41+TCBdmaV6tl6Jfq3LlsDP1/b9/G\nH/7wB/z8889o0qSJMnUSET2G4W4IIYBTp2TIb90K3Lih39etGwonTMATv/sd4OurXI1EROUw3OtK\np5OTmKnVcobK8tMCh4TIbpuICMDDQ7kaiajRM9syexqNBoGBgfD398fSpUsr7c/KysKIESPQs2dP\nBAUF4V//+ledi1CEgwMQHg6sWQPcvCknlvm//wOaNQNOngTefhvw8gKGDJHH3LmjdMVERAarseWu\n0+kQEBCAgwcPwtPTEyEhIVCr1ehSbo6XqKgoFBQU4O9//zuysrIQEBCAzMxMODo6VryQtbXcq/Pg\ngQx6tRrYu1c+PAUAjo7AsGGyRT9mjJyumIjIzMzSco+Pj4efnx86deoEJycnTJkyBTExMRWOad++\nPfL+t7pSXl4eWrVqVSnYG5SmTeXUwzt2IPXUKcx1dUXegAGyv37vXmDqVDndweTJwM6dwKNHSldM\nRFRJjSmcnp4Ob2/vstdeXl6Ii4urcMzMmTPx3HPPwcPDA/fu3cO2bduqPV9UVFTZ38PDwxEeHm5c\n1RbiHRSEQevWwX/2bOzZtQt9UlJki/7HH+V4+m++AVq0AMaNky36oUNlC5+IyEharRZarbbe56kx\niewMmEd98eLF6NmzJ7RaLa5cuYIXXngBZ8+eRfMqui3Kh3tDMWHCBDg7O2PkK69ArVZj6JEjwPXr\n+gVHzpwBvv5afrVpI1v9KpWc2MyEC44QUePweMM3OjraqPPUmD6enp5ITU0te52amgovL68Kxxw7\ndgyTJk0CAPj6+qJz5864ePGiUcVYq5EjR2L79u1QqVT4/vvvgQ4d5Mxip08Dv/wCREUBTz8N3L4N\nfP45MHAgSjp20h8jBHJyZFc+EZEl1PiBanFxMQICAnDo0CF4eHigb9++lT5Qffvtt+Hq6ooFCxYg\nMzMTvXv3xrlz5+Du7l7xQg3lA9UaJCQkwN7eHr169aq8Uwjgp58AtRol6i2wT9P/UtT5PQ2NmwoD\nV6nQIiTAghUTUUNntnHu+/btw7x586DT6TBjxgzMnz8fa9asAQDMmjULWVlZmDZtGq5fv46SkhLM\nnz8fv/3tb01WYINUUoJ7+4/h9Htb8GzGNjjcua3f16uXfgx9hw7K1UhEDQIfYrJCKSmAX+dipG34\nL56K3SIXHPnfyCIAcgpKlUr207dtq1idRGS9zPYQE9WuqHQ++XJycuRiH5eTHfHXE8OQ88+v5JKB\nO3bIYZTOznIu4Tlz5FOww4cD//pXxdWmiIiMxJZ7PR05cgRvvvkmvv/++7IPmw1a9OPePWDXLjni\nZv9+uaQgADRpAowcKVv0L74ofwkQUaPFbhmFCCGwbNkyfPbZZ4iJiUHv3r3rvujHnTuyy0atBg4f\n1i840qwZMHasnLly2DDAycki3xMRWQ+Gu8J27NiBWbNmYdWqVZg8ebLxJ0pPB7Ztk0F/8qR+u7s7\nMHGiDPpBgyosOEJEtovhbgXOnDmDcePG4e2338abb75Z/xNeuSIXG1Gr5Zz0pTw89AuOhIQABjxs\nRkQNE8PdSty6dQs5OTl4+umnTXvin3/WB31ysn67r2/ZgiPo1s201yQixTHcGwshgPh4/YIjN2/q\n9wUFyZCfMgXw8VGuRiIyGYZ7Y6TTyQ9g1Wr5gWx2tn5faKgM+smTgfbtlauRiOqF4W7lNm/ejAkT\nJphvfdbCQuDAARn0MTFAfr7cbmcnFyVRqYAJE+QHs0TUYDDcrVhhYSFUKhVSUlKwdetW+Pn5mfeC\n+fnA7t0y6Pftk8EPyKGUw4fLoB89Wg61JCKrxnC3ckIIrFq1CtHR0Vi5ciUiIiIsc+GcHLmoiFoN\nHDoElJTI7U2bAi+9JIN+xAj58BQRWR2GewNx+vRpREREYNCgQVi+fDmaWbL1nJkpFxhRq4Fjx/Tb\nW7YExo+XH8QOGcIFR4isCMO9Abl//z4WL16MyMhIuLi4KFNESop+wZGzZ/Xb27bVj6Hv359j6IkU\nxnAn4yUlyZBXq4HLl/XbO3aUrfkpU4DgYAY9kQIY7lR/QsiVo9Rq+cBUerp+X2CgbM2rVIC/v3I1\nEjUyDHcbkJ+fD7VajenTp8Ne6fVXS0rkQuBqteynv3NHv693b/2CI48tu0hEpsVwtwHp6emYPHky\n7O3tsW7dOtNPYWCsoiI50katliNv7t2T2+3sgIEDZbfNxIlygXAiMimGu43Q6XRYtWoVFi5ciA8+\n+ADz5s2DozWNXnn4ENi7Vwb97t1AQYHc7uAAvPCCDPpx44AWLZStk8hGMNxtzNWrVzFz5kzk5uYi\nNjYWzZs3V7qkyvLygO++k/3zBw7I6RAAOWZ+1CjZdTNqFBccIaoHs4W7RqMpWyD71Vdfxfvvv19h\n/0cffYR///vfAIDi4mIkJSUhKysLLcuvVFGPAhszIQRiY2Px3HPPKV1K7bKygO3bZYv+hx/025s3\nlwuOqFTA889zwRGiOjJLuOt0OgQEBODgwYPw9PRESEgI1Go1unTpUuXxu3fvxqeffoqDBw+arEBq\ngNLS9GPoExL021u1kouBq1TAs88CSn9oTNQAmGWB7Pj4ePj5+aFTp05wcnLClClTEBMTU+3xmzdv\nhkqlqnMRVHd5eXlKl1A9Ly/gj38ETp0Cfv0VWLgQ6NJFjrhZvRoYPFiOoX/nHXkMf+kTmVyNn9Sl\np6fD29u77LWXlxfi4uKqPPbBgwfYv38/Pv/882rPFxUVVfb38PBwhIeH161aAiCDPTAwEDNnzsT7\n77+Ppk2bKl1S9fz9gT//GfjwQ+DcOf0Y+mvXgI8/ll9+fvox9NX8q5CosdBqtdBqtfU+T43dMt9+\n+y00Gg3Wrl0LANi0aRPi4uKwYsWKSsdu3boVmzdvrrZlz24Z07p+/Tree+89HD9+HMuWLcOkSZNg\n11CeIBUCOH5chvy2bXLOm1LBwfqnYjt1UqxEImthlm4ZT09PpKamlr1OTU2FVzUPrWzZsoVdMhbU\noUMHbNmyBRs3bsTixYsxaNAg/PLLL0qXZRg7O2DAAOCzz2T//H/+A0yfDri6ynlu5s8HOneWx6xY\nUTH8icggNbbci4uLERAQgEOHDsHDwwN9+/at8gPV3Nxc+Pj4IC0tDc7VDHtjy918dDod1q9fj2HD\nhqFDhw5Kl2O8ggJAo5Et+l27gAcP5HZ7e+C552S3zfjxchZLokbCbEMh9+3bVzYUcsaMGZg/fz7W\nrFkDAJg1axYA4Ouvv8b+/fuxefNmkxdIjdT9+8D338s+eo1GPiULAE88IeefV6nkfPRKzapJZCF8\niImqlJGRATc3Nzz55JNKl2K8u3eBHTtk0MfG6kfXNG0KjBkj++dHjJDBT2RjzNLnTg1f6Rw1X375\nJYpKW78Njbs78Oqrcn6b9HRg+XKgXz/ZbaNWy4Bv105/TOmTskSNGFvujcCJEycQGRmJ69evIzo6\nGhEREXBwcFC6rPpLTtY/LHXunH77U0/pFxwJDeU89NSgsVuGanXo0CH85S9/gU6nw/HjxxvO0ElD\nJCbqFxy5ckW/vXNn/dDK7t0Z9NTgMNzJIEIIpKSkoHPnzkqXYh5CyKde1WrZqr9xQ7+va1f9w1K+\nvsrVSFQHDHeix+l0wJEjMui3b5cfzJYKCdEvOOLhoVyNRLVguFO9CCEwceJEDBw4EK+++iqaNWum\ndEmmVVgoH5baskVOU3z/vtxuZyfnuildcKRVK2XrJHoMw53q7dSpU1iyZAkOHz6M2bNn4/XXX0fb\ntm2VLsv0HjwA9uyRLfq9e/ULjjg6AsOGyRb9mDFyumIihTHcyWQuXryIf/7zn9i2bRvmzp1bYcI3\nm5ObK1vyajVw8KB+GKWzM/Dii7JFP3Ik0JCfE6AGjeFOJnfr1i1cuXIF/fv3V7oUy7h1S7/gyI8/\n6re3aCGXDlSpgKFDZQufyEIY7mRRQgjbGkr5uOvX5WibLVuA06f129u00S84MmAAFxwhs2O4k8UI\nIdC3b18MGDAAs2fPRkBAgNIlmdfFizLk1Wr591Le3nK0jUoF9OpldWPo9+wBwsIqzrOWkwMcPSqX\ntqWGgdMPkMXY2dnh22+/hYuLCwYNGoShQ4fim2++QWFhodKlmUdAALBgAZCUJFvx774rgz01Ffjo\nI6B3byAwEIiKqhj+CgsLAyIjZaAD8s/ISLmdjLdnj/6elsrJkdutCVvuVC8FBQXYuXMnVq9eDRcX\nF+yxtv/DzaWkRC44olbLBUdu39bv69VL/1SswlMwlwb6u+8Cy5YBixZxxuT6Kr2npffy8demxm4Z\nUlx+fj5cFJ6CV5GuiOJi4L//lUG/YwdQfn3bsDDZbTNpEqDQsNKUFDkLQ3IyF7cyFUv+0jQ6O4WF\nWPBSZGW2bNkifvzxR1FSUmL2a2VnCzF7tvyzqtdm9/ChEDt2CDF5shDOzkLICRGEcHAQYtgwIdav\nFyInx0LF6L//5GQL34dGIDlZ/qdNTjbvdYzNToY7md3nn38uAgMDha+vr1iwYIG4dOmSWa9nNYGW\nlyfEpk1CjBolhKOjPuifeEKIsWOF2LpViPx8s11e8V90NsyS/48x3MmqlZSUiJMnT4o333xTtG3b\nVgwYMEAUFhaa7XqWalUZLCtLiDVrhAgPF8LOTh/0zZoJ8f/+nxC7dwtRUGDSS+7eXTl0srPldjKe\npX9pGpud7HMniysqKkJCQgL69etnlvNb/YeIN27ID2HVaiA+Xr/d3R2YMEH20Q8aBNjCnPs2yNKf\n6/ADVbIJp0+fxunTpzF27Fi0bt26zu+39EiGertyRT+G/sIF/fb27fVj6ENCrG4MPVmO2ca5azQa\nBAYGwt/fH0uXLq3yGK1Wi169eiEoKAjh4eF1LoKolE6nw4EDB+Dn54ehQ4di1apVSEtLM/j9R49W\nDPKWLeXro0fNVHB9+frK3z7nzwM//wz86U9yaEtGBvDpp3IlKX9/4MMP5TFEBqqx5a7T6RAQEICD\nBw/C09MTISEhUKvV6NKlS9kxOTk5CAsLw/79++Hl5YWsrKwqW1xsuVNdPHz4EPv378fOnTuxe/du\nfPHFF5gwYYLSZVmGELK7pnTBkZs39fuCgmRrfsoUwMdHuRrJYszSLXP8+HFER0dDo9EAAJYsWQIA\n+OCDD8qO+fzzz3Hz5k0sXLjQLAUSFRUVQafT4ckqZmbU6XS2sR5sdXQ64Icf9AuOZGfr94WGypCP\niJDdOGRTSkpKYG9vb3R21ji9XXp6Ory9vctee3l5IS4ursIxly5dQlFREYYMGYJ79+5h7ty5mDp1\napXnKz9lnZfIAAAR2ElEQVR1bHh4OLtwyCBOTk5wcnKqtL2kpAQ+Pj4ICgrCiBEjMGLECPj5+dnW\nhGYODsCQIfJr5UrgwAEZ9DExQFyc/Hr7bSA8XLboJ0yQH8xSgyOEwLlz5/Dpp59Co9GgR48e9ZqR\ntcZwN+SHpKioCKdPn8ahQ4fw4MED9O/fH/369YO/v3+lY216XnCyOHt7e/z00084cOAANBoNlixZ\ngiZNmmDMmDH45JNPlC7P9J54Qs4x/+KLQH4+sHu3DPp9+4DYWPn1+uvA8OEy6EePBmxtRS0bdOnS\nJXz22WfYtWsXHBwcMHr0aGzduhVhYWFwcHBAdHS0UeetMdw9PT2Rmppa9jo1NRVeXl4VjvH29kbr\n1q3h7OwMZ2dnDBo0CGfPnq0y3IlMzc3NDREREYiIiIAQAhcuXEBiYqLSZZmfi4vsjomIkEOCdu6U\nQX/okAz93bvlgiOjR8uum9/8BmjSROmqqQqFhYVo37499u7di65du5ruX541DYIvKioSPj4+Ijk5\nWRQUFIjg4GCRmJhY4ZikpCQxdOhQUVxcLPLz80VQUJC4cOGCyQbiE5nKd999JwYMGCDmz58vNBqN\nyMvLU7ok07t5U4gVK4QYMED/oBQghKurENOmCXHggBBFRUpX2ajk5OSImJgYERUVZdT7jc3OGodC\nOjo6YuXKlRg+fDi6du2KiIgIdOnSBWvWrMGaNWsAAIGBgRgxYgR69OiB0NBQzJw5E127djXNbx4i\nE3rhhRcQFRUFR0dHLF68GO3bt0efPn2wdetWpUsznXbtgDlz5NjPlBRgyRIgOFguJ7h+vVwj1tMT\neOMN4NgxObslmdzBgwcRGRmJ/v37w8vLCytWrMCTTz4JXekyjhbAh5io0Xr06BESEhLQokULdO/e\nvdL+GzduwM3NDc7OzgpUZ2JJSfJhqc2bgcuX9ds7dJDdNiqV/CVgSx9GK2jq1Kno2LEjnnvuOQwY\nMKDKkV6G4hOqRCY2b948fPHFF+jSpQtCQkLQu3dv9OnTB0FBQVWO3jGE4qsjCSEXHCkdQ1/+AbHA\nQBnyKpV8cIoq0el0+OWXX3D8+HEcP34cs2fPRu/evc16TYY7kRk8fPgQZ86cwalTp5CQkIBTp05h\n3bp1Rs+LY1XTI5SUyN8qajXwzTdAVpZ+3zPPyJCPiJCrTjVyGzduxLp163D69Gm0a9cO/fr1Q//+\n/TFu3Di0N/MzBgx3IoWFh4ejWbNmCAoKQrdu3RAUFISAgAA0bdq0wnFWObFZUZEcaaNWy5E39+7p\n9w0cKIN+4kS5QLgNys/PR2JiIlxcXKr8zPDYsWO4f/8++vTpA3cLP0fAcCdS2OXLl3H+/PmyrwsX\nLuDy5cu4desWmjdvXuFYuTqSQHKynfWtjvTwIbB3rwz63buBggK53cEBeOEF2Uc/bhzQooWyddbD\nuXPnoFarkZiYiPPnzyMjIwNPP/003nzzTUyfPl3p8ipguBNZoaqmR8jJAd5//yE2bmyNJ5/shNBQ\nXwQE+MDHxwe+vr4YZZHOdwPl5QHffSc/jD1wQE6HAMgx86NGyRb9qFFyTL0VEELg7t27SE5OxtWr\nV9GsWTOMHDmy0nHx8fHYv38/unTpgu7du8PX1xeOjjU+9qMYhjtRA1C+j93R8T7Onr2Kv/3tMsLC\nkpGRcRW5ubnYtGlTpffl5eXh008/haenJ9q3bw8PDw889dRTaNOmjeXm1snKAr79Vrbof/hBfjgL\nAM2bA2PHyqB//nnAyA+bayOEwMOHDyt1cwFAXFwcZsyYgWvXrsHR0RGdOnWCr68vhg0bht///vdm\nqcdSGO5EDYCxo2Xu3r2Ljz/+GBkZGbhx4wZu3LiBmzdvolWrVkhKSqp0/J07d7Bhwwa4ubnBzc0N\nrq6uaNmyJVq1alVhviijpaXpFxw5dapsc2GLVhATJqLJyyrZV29vX+n7E0Lg0aNHyMvLQ1FRUaWn\n3gHg6tWr+Otf/4rbt28jMzMTmZmZuHXrFsLCwnDo0KFKx+fm5uLatWvo2LEjXF1d6//9WRGGO1Ej\nVDpz4OMyMjKwdOlS3L17F9nZ2cjNzUVubi48PDywb9++SsdfvHgRkydPRpMmTdCkSRM8+eSTcHJy\ngr+/P5YvX17p+GvXruHDDz+EEAJtcnPRLyUFA65dg3f5D2I9PfFobASWZ6owcF4TTJw0HPfv30d+\nfj6cnJzQokULhIaG4vvvv690/tu3b2P37t1o1aoV2rVrh3bt2qFt27ZVttptHcOdiIz28OFDXLx4\nEQUFBSgoKMCjR49QVFQEFxeXKmdvvXv3Lvbs2QNATuDm6OgIB3t7eGdnIzgpGffXbUHreyllxwtf\nX9x78UXYqVRw7t3bavu3rRHDnYisRkqygMrnBPa/rEYLzTYgM1O/s0cP/YIjVjdUyPqYbZk9IqK6\nyMkBln1kB3Vyf8x3+Qw559OA//wHmDFDfthw7hwwf75cTnDAAGDFioqrTZFJsOVORCZT6xO4BQVy\nSOXmzcCuXcCDB/KN9vZyQRKVChg/HnBzU/T7sCbsliEixdVpNFB+vgx4tRrQaORTsoBclGTECBn0\nL70k565vxBjuRNRwZWcDO3bIoI+N1U9F3LSpXHBEpZKB/8QTytapAIY7EdmGmzf1Y+hPnNBvb9lS\nrhGrUsk1Y215YfRyGO5EZHuSk+XUxGq1/CC21FNPAZMnyxE3/frZ9Dz0DHcism2JiTLk1WrgyhX9\n9k6d9AuOdO9uc0HPcCeixkEIOeXBli2yVZ+ert/Xtat+DL2fn3I1mpDZxrlrNBoEBgbC398fS5cu\nrbRfq9XC1dUVvXr1Qq9evfC3v/2tzkUQkXXas0eOdikvJ0duV4ydHRASAnz8MXD9OqDVArNmAa1a\nydb9n/8sV5IKCQH++c+K4d+Y1LR6dnFxsfD19RXJycmisLBQBAcHi8TExArHxMbGipdeeqmm04j/\n/eug1mOIyLpkZwsxe7b8s6rXVqWwUIg9e4T4v/8TolkzIWQbXwg7OyEGDxZi9WohsrKUrrLOjM3O\nGlvu8fHx8PPzQ6dOneDk5IQpU6YgJiamql8QZvrVQ2Q6VtkKtXItW8oHkCIj5QIjii0JaAgnJ2Dk\nSGDjRuDWLbl04Pjxcvjk4cPAH/4gP4gdNQrYtKnialM2qMZwT09PrzA9qJeXF9If+yeOnZ0djh07\nhuDgYIwcORKJiYnmqZSonsLCZDiVBnzp05NhYcrWZe1atpRLAnbuLP+0ymB/nLOzXBbw22/lvDb/\n+hcwfLhsy+/dC0ydCrRtC0yaJMfXP3qkdMUmV+PUbHYGfOr8zDPPIDU1FU2bNsW+ffswduxY/Prr\nr1UeGxUVVfb38PDwKmebIzKX8q1Qq1q/1Mrl5Mh7lZzcQO+Zqyvw8svy69Yt/YIjR44A27fLrxYt\n5NKBU6bIBUcUnLVSq9VCq9XW/0Q19dkcP35cDB8+vOz14sWLxZIlS2rs5+nUqZO4c+eOyfqNiEwt\nOVl2xSYnK12J9WtQfe51df26EMuWCfHMM/r+eUCI1q3lN3nkiBA6ndJVGp2dNb6rqKhI+Pj4iOTk\nZFFQUFDlB6o3b94UJSUlQggh4uLiRMeOHU1aIJEplYZTcrINhZQZ7d5d+R5lZ8vtNuXiRSGiooQI\nCKgY9N7eQrzzjhAJCUL8L+cszSzhLoQQe/fuFU8//bTw9fUVixcvFkIIsXr1arF69WohhBArV64U\n3bp1E8HBwaJ///7i+PHjJi2QyFRsuhVKplFSIsSZM0K8954QHTpUDPqnnxZiwQIhfvnFoiUZm518\niIkaDWPXL6VGqqQEOH5c9s9v2wbcvq3f17On/mGpDh3MWgafUCUiMpfiYjlbpVotR9fk5ur3hYXJ\noJ80SY7AMTGGOxGRJRQUAPv2yaD//nvg4UO53cEBGDpUBv24cXKUjgkw3ImILO3ePRnwpQuOFBfL\n7U88IR+oUqmAF1+U89IbieFORKSku3f1Y+i1WvkxLAA0awaMGSOD/oUX6rzgCMOdiMha3LihX3Ak\nPl6/3d1dv+DIoEEGLTjCcCciskZXr8rpidVq4Px5/fb27YGICBn0ISHVzkPPcCcisnbnz+sXHElO\n1m/38dEvOBIUVOEtDHciooZCCODkSRnyW7cCGRn6fUFB+jH0Pj4MdyKiBkmnA374QQb99u1AdrZ+\nX2go7OLiGO5ERA1aYSFw4IAM+pgYID8fdjBuzQyGOxGRNcrPB3bvht2UKQx3IiJbY7YFsomIqOFh\nuBMR2SCGOxGRDWK4ExHZIIY7EZENYrgTEdkghjsRkQ2qNdw1Gg0CAwPh7++PpUuXVnvcyZMn4ejo\niB07dpi0QFuk1WqVLsFq8F7o8V7o8V7UX43hrtPpMGfOHGg0GiQmJkKtViMpKanK495//32MGDGC\nDyoZgP/j6vFe6PFe6PFe1F+N4R4fHw8/Pz906tQJTk5OmDJlCmJiYiodt2LFCkycOBFt2rQxW6FE\nRGS4GsM9PT0d3t7eZa+9vLyQnp5e6ZiYmBi89tprAOSjskREpCzHmnYaEtTz5s3DkiVLyuY/qKlb\nhsGvFx0drXQJVoP3Qo/3Qo/3on5qDHdPT0+kpqaWvU5NTYWXl1eFYxISEjBlyhQAQFZWFvbt2wcn\nJyeMHj26wnHsiycispwaZ4UsLi5GQEAADh06BA8PD/Tt2xdqtRpdunSp8vhp06bhpZdewvjx481W\nMBER1a7GlrujoyNWrlyJ4cOHQ6fTYcaMGejSpQvWrFkDAJg1a5ZFiiQiojoSJrZv3z4REBAg/Pz8\nxJIlS6o85o033hB+fn6iR48e4vTp06YuwWrUdi82bdokevToIbp37y4GDBggzp49q0CVlmHI/xdC\nCBEfHy8cHBzEt99+a8HqLMeQ+xAbGyt69uwpunXrJgYPHmzZAi2otntx+/ZtMXz4cBEcHCy6desm\n1q9fb/kiLWTatGmibdu2IigoqNpj6pqbJg334uJi4evrK5KTk0VhYaEIDg4WiYmJFY7Zs2eP+M1v\nfiOEEOLEiRMiNDTUlCVYDUPuxbFjx0ROTo4QQv6P3pjvRelxQ4YMEaNGjRLbt29XoFLzMuQ+ZGdn\ni65du4rU1FQhhAw4W2TIvViwYIH44IMPhBDyPri7u4uioiIlyjW7H374QZw+fbracDcmN006/YAh\n4+J37dqFl19+GQAQGhqKnJwcZGZmmrIMq2DIvejfvz9cXV0ByHuRlpamRKlmx+clJEPuw+bNmzFh\nwoSygQutW7dWolSzM+RetG/fHnl5eQCAvLw8tGrVCo6ONfYkN1gDBw6Em5tbtfuNyU2Thruh4+If\nP8YWQ82Qe1HeunXrMHLkSEuUZnF8XkIy5D5cunQJd+/exZAhQ9CnTx9s3LjR0mVahCH3YubMmbhw\n4QI8PDwQHByM5cuXW7pMq2FMbpr016ChP5DisQE6tviDXJfvKTY2Fl999RWOHj1qxoqUY+rnJRoq\nQ+5DUVERTp8+jUOHDuHBgwfo378/+vXrB39/fwtUaDmG3IvFixejZ8+e0Gq1uHLlCl544QWcPXsW\nzZs3t0CF1qeuuWnScDdkXPzjx6SlpcHT09OUZVgFQ+4FAJw7dw4zZ86ERqOp8Z9lDZkpn5doyAy5\nD97e3mjdujWcnZ3h7OyMQYMG4ezZszYX7obci2PHjiEyMhIA4Ovri86dO+PixYvo06ePRWu1Bkbl\npsk+ERBCFBUVCR8fH5GcnCwKCgpq/UD1+PHjNvshoiH34tq1a8LX11ccP35coSotw5B7Ud4rr7xi\nk6NlDLkPSUlJYujQoaK4uFjk5+eLoKAgceHCBYUqNh9D7sVbb70loqKihBBC3Lx5U3h6eoo7d+4o\nUa5FJCcnG/SBqqG5adKWuyHj4keOHIm9e/fCz88PLi4uWL9+vSlLsBqG3IuFCxciOzu7rJ/ZyckJ\n8fHxSpZtFnxeQjLkPgQGBmLEiBHo0aMH7O3tMXPmTHTt2lXhyk3PkHvxpz/9CdOmTUNwcDBKSkrw\nj3/8A+7u7gpXbh4qlQqHDx9GVlYWvL29ER0djaKiIgDG52aNT6gSEVHDxJWYiIhsEMOdiMgGMdyJ\niGwQw52IyAYx3ImIbBDDnYjIBv1/KYJGvfgUI0IAAAAASUVORK5CYII=\n" | |
} | |
], | |
"prompt_number": 142 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"import itertools\n", | |
"#print for itertools.combinations_with_replacement(range(2), 2))\n", | |
"print X_d_n.shape\n", | |
"d = X_d_n.shape[0]\n", | |
"p_degree = 1\n", | |
"#range(p_degree+1)\n", | |
"[powers_d for powers_d in itertools.product(*itertools.repeat(range(p_degree+1), d))]" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"(2, 10)\n" | |
] | |
}, | |
{ | |
"output_type": "pyout", | |
"prompt_number": 166, | |
"text": [ | |
"[(0, 0), (0, 1), (1, 0), (1, 1)]" | |
] | |
} | |
], | |
"prompt_number": 166 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [] | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment