<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3533395109779030309</id><updated>2024-10-04T19:14:41.399-07:00</updated><category term="matlab"/><category term="2 альпс"/><category term="cvxopt"/><category term="deux alpes"/><category term="downhill"/><category term="example"/><category term="least squares"/><category term="les 2 alpes"/><category term="lsqlin"/><category term="lsqnonneg"/><category term="numpy"/><category term="octave"/><category term="python"/><category term="snowpark"/><category term="sparse"/><category term="speed"/><category term="summer"/><category term="timing"/><category term="ле дез альпс"/><title type='text'>maggotroot</title><subtitle type='html'>https://github.com/visva89/</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://maggotroot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://maggotroot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>visva</name><uri>http://www.blogger.com/profile/15897971540914143113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3533395109779030309.post-6486136507985574912</id><published>2018-03-03T10:39:00.004-08:00</published><updated>2018-03-03T10:39:37.476-08:00</updated><title type='text'> Implementation of Variational Networks for image reconstruction in tensorflow</title><content type='html'>&lt;h1&gt;
Variational Networks for image reconstruction in tensorflow&lt;/h1&gt;
This is a generic implementation of Variational Network (loop unrolling) for MR image reconstruction, proposed by &lt;a href=&quot;https://arxiv.org/abs/1704.00447&quot; rel=&quot;nofollow&quot;&gt;Hammerick et al.&lt;/a&gt;.
MRI data used to train the network is introduced and described by &lt;a href=&quot;http://dev.ismrm.org/2017/3991.html&quot; rel=&quot;nofollow&quot;&gt;Johannes Schmidt and Sebastian Kozerke&lt;/a&gt;. The full code is available at github: &lt;a href=&quot;https://github.com/visva89/VarNetRecon&quot;&gt;https://github.com/visva89/VarNetRecon &lt;/a&gt;&lt;br /&gt;

&lt;h2&gt;
&lt;a class=&quot;anchor&quot; href=&quot;https://github.com/visva89/VarNetRecon#running-the-code&quot; id=&quot;user-content-running-the-code&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Running the code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Download 2D short axis cardiac MRI dataset &lt;a href=&quot;https://polybox.ethz.ch/index.php/s/E9FgAzi21iVJiF5&quot; rel=&quot;nofollow&quot;&gt;https://polybox.ethz.ch/index.php/s/E9FgAzi21iVJiF5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Inspect configuration of the network in &lt;code&gt;recon_model_300_066.py&lt;/code&gt;. We used:
&lt;ul&gt;
&lt;li&gt;10 layers&lt;/li&gt;
&lt;li&gt;7x7 filters&lt;/li&gt;
&lt;li&gt;30 filters per layer&lt;/li&gt;
&lt;li&gt;35 knots to parametrize activations&lt;/li&gt;
&lt;li&gt;cubic interpolation for activations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;example.sh&lt;/code&gt; for training, or use saved parameters &lt;code&gt;ckpts/model.ckpt&lt;/code&gt; and run &lt;code&gt;recon_model_300_066.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run matlab script &lt;code&gt;report_imgs.m&lt;/code&gt; for illustrations of reconstruction and learned parameters&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;a class=&quot;anchor&quot; href=&quot;https://github.com/visva89/VarNetRecon#demo&quot; id=&quot;user-content-demo&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Demo&lt;/h2&gt;
For training we used fully sampled 128x128 short axis MR images of 
the heart with artificially generated smooth phase offset.
The k-space was retrospectively undersampled to achieve acceleration 
factor of ~3.
Variational Network reconstruction was compared to total variation (TV) 
regularized reconstruction (with the optimal regularization weight).
&lt;a href=&quot;https://github.com/visva89/VarNetRecon/blob/master/imgs/img_ex.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;recons example&quot; src=&quot;https://github.com/visva89/VarNetRecon/raw/master/imgs/img_ex.png&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

Reconstruction for each layer of the network:
&lt;a href=&quot;https://github.com/visva89/VarNetRecon/blob/master/imgs/recon_by_layer.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;recons layers&quot; src=&quot;https://github.com/visva89/VarNetRecon/raw/master/imgs/recon_by_layer.png&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

Learned filters (real part):
&lt;a href=&quot;https://github.com/visva89/VarNetRecon/blob/master/imgs/filters.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;recons layers&quot; src=&quot;https://github.com/visva89/VarNetRecon/raw/master/imgs/filters.png&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

Learned activation functions (integral of activation, i.e. element-wise potentials):
&lt;a href=&quot;https://github.com/visva89/VarNetRecon/blob/master/imgs/pot_int.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;recons layers&quot; src=&quot;https://github.com/visva89/VarNetRecon/raw/master/imgs/pot_int.png&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

&lt;h2&gt;
&lt;a class=&quot;anchor&quot; href=&quot;https://github.com/visva89/VarNetRecon#important-notes&quot; id=&quot;user-content-important-notes&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Important Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;We are reconstructing smaller images compared to original work. Hence different filter sizes are used.&lt;/li&gt;
&lt;li&gt;Multi coil acquisition as well as coil sensitivity maps are not modeled.&lt;/li&gt;
&lt;li&gt;Batch size is fixed at configuration time.&lt;/li&gt;
&lt;li&gt;Cubic interpolation is used by default instead of RBF, since it is more memory efficient. You can choose &lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;cubic&lt;/code&gt;, or &lt;code&gt;RBF&lt;/code&gt; in the network configuration.&lt;/li&gt;
&lt;li&gt;Maximal estimated filter response is fixed for all layers.&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://maggotroot.blogspot.com/feeds/6486136507985574912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3533395109779030309/6486136507985574912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/6486136507985574912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/6486136507985574912'/><link rel='alternate' type='text/html' href='http://maggotroot.blogspot.com/2018/03/implementation-of-variational-networks.html' title=' Implementation of Variational Networks for image reconstruction in tensorflow'/><author><name>visva</name><uri>http://www.blogger.com/profile/15897971540914143113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3533395109779030309.post-9051450211051081211</id><published>2013-11-22T10:15:00.000-08:00</published><updated>2013-11-23T04:23:21.865-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cvxopt"/><category scheme="http://www.blogger.com/atom/ns#" term="least squares"/><category scheme="http://www.blogger.com/atom/ns#" term="lsqlin"/><category scheme="http://www.blogger.com/atom/ns#" term="lsqnonneg"/><category scheme="http://www.blogger.com/atom/ns#" term="matlab"/><category scheme="http://www.blogger.com/atom/ns#" term="numpy"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="sparse"/><title type='text'>Constrained linear least squares in Python using scipy and cvxopt. Matlabs lsqlin and lsqnonneg in Python with sparse matrices.</title><content type='html'>So &lt;tt&gt;Matlab&lt;/tt&gt; has handy functions to solve non-negative constrained linear least squares(&lt;tt&gt;lsqnonneg&lt;/tt&gt;), and optimization toolbox has even more general linear constrained least squares(&lt;tt&gt;lsqlin&lt;/tt&gt;). The great thing about these functions, is that they can efficiently solve problems with large &lt;it&gt;sparse&lt;/it&gt; matrices. Well, &lt;tt&gt;Python&lt;/tt&gt; has 
&lt;a href=&quot;http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.nnls.html&quot;&gt;&lt;tt&gt;scipy.optimize.nnls&lt;/tt&gt;&lt;/a&gt; that can handle non-negative least squares as well, but there is no built-in &lt;tt&gt;lsqlin&lt;/tt&gt; alternative, and &lt;tt&gt;nnls&lt;/tt&gt; can&#39;t handle sparse matrices. However, you can formulate it as quadratic programming problem, and use &lt;tt&gt;scipy.optimize.fmin_slsqp&lt;/tt&gt; to solve it, but &lt;tt&gt;scipy&lt;/tt&gt; SLSQP implementation can&#39;t solve the problem  for &lt;it&gt;sparse&lt;/it&gt; matrices as well. Luckily there is really great optimization package for &lt;tt&gt;Python&lt;/tt&gt;, called &lt;tt&gt;&lt;a href=&quot;http://cvxopt.org/&quot;&gt;CVXOPT&lt;/a&gt;&lt;/tt&gt;, that can solve quadratic programming problems with sparse matrices. Let&#39;s wrap it all up, and even add $\ell_2$ regularization.&lt;br /&gt;
The problem of constrained linear least squares is usually stated in following way:
&lt;p align = &quot;left&quot;&gt;
$$\min_x \; \frac12\|Cx-d\|_2^2 + \lambda \|x\|_2^2, $$
$$s.t. \;\; Ax \leq a, \;\;\; Bx = b. $$
&lt;/p&gt;
using the fact that $\|x\|_2^2 = x^\top x$:
$$\frac12\|Cx-d\|_2^2 + \lambda \|x\|_2^2 = \frac12 (Cx - d)^\top(Cx-d) + \lambda x^\top x =$$
$$=\frac12(x^\top C^\top - d^\top)(Cx-d) + \lambda x^\top I x = \frac12 x^\top (C^\top Cx + \lambda I)x - d^\top Cx + \frac12 d^\top d.$$

While minimizing over $x$ we don&#39;t care about $d^\top d$, taking $Q = C^\top C + \lambda I$, and $r=d^\top C$ we can rewrite our initial optimization problem as follows:
&lt;p align = &quot;left&quot;&gt;
$$\min_x \; \frac12 x^\top Qx + rx, $$
$$s.t. \;\; Ax \leq a, \;\;\; Bx = b. $$
&lt;/p&gt;
Now it is obvious, that we have formulated a &lt;a href=&quot;http://en.wikipedia.org/wiki/Quadratic_programming&quot;&gt;quadratic program&lt;/a&gt;, that can be solved by &lt;tt&gt;&lt;a href=&quot;http://cvxopt.org/userguide/coneprog.html#quadratic-programming&quot;&gt;cvxopt.solvers.qp&lt;/a&gt;&lt;/tt&gt;. Stacking box inequality constraints(&lt;tt&gt;Matlab&lt;/tt&gt; notation &lt;tt&gt;lb&lt;/tt&gt; and &lt;tt&gt;ub&lt;/tt&gt; such that &lt;tt&gt;lb&lt;=x&lt;=ub&lt;/tt&gt;) to matrix $A$ and vector $a$, we can fully emulate &lt;tt&gt;lsqlin&lt;/tt&gt; and &lt;tt&gt;lsqnonneg&lt;/tt&gt; with sparse and dense matrices.

&lt;p/&gt;
Testing &lt;tt&gt;lsqnonneg&lt;/tt&gt;:
&lt;br/&gt;Here is &lt;tt&gt;Matlab&lt;/tt&gt; reference code:
&lt;pre&gt;
C = [0.0372, 0.2869; 0.6861, 0.7071; ...
     0.6233, 0.6245; 0.6344, 0.6170];
d = [0.8587, 0.1781, 0.0747, 0.8405]&#39;;
x = lsqnonneg(C, d)
% output:
% x = [0, 0.6929]
&lt;/pre&gt;
And here is &lt;tt&gt;Python&lt;/tt&gt; code:
&lt;pre class=&quot;brush: python&quot;&gt;
import lsqlin
import numpy as np
C = np.array([[0.0372, 0.2869], [0.6861, 0.7071], \
              [0.6233, 0.6245], [0.6344, 0.6170]]);
d = np.array([0.8587, 0.1781, 0.0747, 0.8405]);
ret = lsqlin.lsqnonneg(C, d, {&#39;show_progress&#39;: False})
print ret[&#39;x&#39;].T
#output:
#[ 2.50e-07  6.93e-01]
&lt;/pre&gt;
So it works perfectly! Disregard tiny value of &lt;tt&gt;x[0]=2.5e-07&lt;/tt&gt; this can be fixed, by imposing small regularization.

&lt;p/&gt;
Testing &lt;tt&gt;lsqlin&lt;/tt&gt;:
&lt;br/&gt;&lt;tt&gt;Matlab&lt;/tt&gt; reference code:
&lt;pre&gt;
C = [0.9501    0.7620    0.6153    0.4057
     0.2311    0.4564    0.7919    0.9354
     0.6068    0.0185    0.9218    0.9169
     0.4859    0.8214    0.7382    0.4102
     0.8912    0.4447    0.1762    0.8936];
d = [0.0578, 0.3528, 0.8131, 0.0098, 0.1388]&#39;;
A =[0.2027    0.2721    0.7467    0.4659
    0.1987    0.1988    0.4450    0.4186
    0.6037    0.0152    0.9318    0.8462];
b =[0.5251, 0.2026, 0.6721]&#39;;
lb = -0.1*ones(4,1);
ub = 2*ones(4,1);
x = lsqlin(C, d, A, b, [], [], lb, ub)
% output:
% x = [-0.1000, -0.1000, 0.2152, 0.3502]
&lt;/pre&gt;

&lt;tt&gt;Python&lt;/tt&gt; code:
&lt;pre class = &quot;brush: python&quot;&gt;
import lsqlin
import numpy as np

C = np.array(np.mat(&#39;&#39;&#39;0.9501,0.7620,0.6153,0.4057;
0.2311,0.4564,0.7919,0.9354;
0.6068,0.0185,0.9218,0.9169;
0.4859,0.8214,0.7382,0.4102;
0.8912,0.4447,0.1762,0.8936&#39;&#39;&#39;))

A = np.array(np.mat(&#39;&#39;&#39;0.2027,0.2721,0.7467,0.4659;
0.1987,0.1988,0.4450,0.4186;
0.6037,0.0152,0.9318,0.8462&#39;&#39;&#39;))
d = np.array([0.0578, 0.3528, 0.8131, 0.0098, 0.1388])
b =  np.array([0.5251, 0.2026, 0.6721])
lb = np.array([-0.1] * 4)
ub = np.array([2] * 4)

ret = lsqlin.lsqlin(C, d, 0, A, b, None, None, \
         lb, ub, None, {&#39;show_progress&#39;: False})
print ret[&#39;x&#39;].T
# output:
# [-1.00e-01 -1.00e-01  2.15e-01  3.50e-01]
&lt;/pre&gt;
Seems to work fine as well.
&lt;p/&gt;
For sparse matrices in my case(about hundreds columns, tens thousands rows, 3 non-zero elements in each row) both &lt;tt&gt;Matlab&lt;/tt&gt; and &lt;tt&gt;Python&lt;/tt&gt; provided same solutions, and &lt;tt&gt;Python&lt;/tt&gt; implementation seemed to work a bit faster. However I can not provide any timings or memory consumption test. Just hope it can help somebody someday.
&lt;p/&gt;
&lt;tt&gt;lsqlin.py&lt;/tt&gt; can be downloaded from &lt;a href=&quot;http://pastebin.kde.org/puiie6gfw&quot;&gt;here&lt;/a&gt;, or just copypasted from below. You can use &lt;tt&gt;numpy&lt;/tt&gt; dense matrices, &lt;tt&gt;scipy&lt;/tt&gt; sparse matrices or &lt;tt&gt;cvxopt&lt;/tt&gt; matrices as inputs. Module is documented:
&lt;pre class = &quot;brush: python&quot;&gt;
#!/usr/bin/python

# See http://maggotroot.blogspot.ch/2013/11/constrained-linear-least-squares-in.html for more info
&#39;&#39;&#39;
    A simple library to solve constrained linear least squares problems
    with sparse and dense matrices. Uses cvxopt library for 
    optimization
&#39;&#39;&#39;

__author__ = &#39;Valeriy Vishnevskiy&#39;
__email__ = &#39;valera.vishnevskiy@yandex.ru&#39;
__version__ = &#39;1.0&#39;
__date__ = &#39;22.11.2013&#39;
__license__ = &#39;WTFPL&#39;

import numpy as np
from cvxopt import solvers, matrix, spmatrix, mul
import itertools
from scipy import sparse


def scipy_sparse_to_spmatrix(A):
    coo = A.tocoo()
    SP = spmatrix(coo.data, coo.row.tolist(), coo.col.tolist())
    return SP

def spmatrix_sparse_to_scipy(A):
    data = np.array(A.V).squeeze()
    rows = np.array(A.I).squeeze()
    cols = np.array(A.J).squeeze()
    return sparse.coo_matrix( (data, (rows, cols)) )

def sparse_None_vstack(A1, A2):
    if A1 is None:
        return A2
    else:
        return sparse.vstack([A1, A2])

def numpy_None_vstack(A1, A2):
    if A1 is None:
        return A2
    else:
        return np.vstack([A1, A2])
        
def numpy_None_concatenate(A1, A2):
    if A1 is None:
        return A2
    else:
        return np.concatenate([A1, A2])

def get_shape(A):
    if isinstance(C, spmatrix):
        return C.size
    else:
        return C.shape

def numpy_to_cvxopt_matrix(A):
    if A is None:
        return A
    if sparse.issparse(A):
        if isinstance(A, sparse.spmatrix):
            return scipy_sparse_to_spmatrix(A)
        else:
            return A
    else:
        if isinstance(A, np.ndarray):
            if A.ndim == 1:
                return matrix(A, (A.shape[0], 1), &#39;d&#39;)
            else:
                return matrix(A, A.shape, &#39;d&#39;)
        else:
            return A

def cvxopt_to_numpy_matrix(A):
    if A is None:
        return A
    if isinstance(A, spmatrix):
        return spmatrix_sparse_to_scipy(A)
    elif isinstance(A, matrix):
        return np.array(A).squeeze()
    else:
        return np.array(A).squeeze()
        

def lsqlin(C, d, reg=0, A=None, b=None, Aeq=None, beq=None, \
        lb=None, ub=None, x0=None, opts=None):
    &#39;&#39;&#39;
        Solve linear constrained l2-regularized least squares. Can 
        handle both dense and sparse matrices. Matlab&#39;s lsqlin 
        equivalent. It is actually wrapper around CVXOPT QP solver.

            min_x ||C*x  - d||^2_2 + reg * ||x||^2_2
            s.t.  A * x &lt;= b
                  Aeq * x = beq
                  lb &lt;= x &lt;= ub

        Input arguments:
            C   is m x n dense or sparse matrix
            d   is n x 1 dense matrix
            reg is regularization parameter
            A   is p x n dense or sparse matrix
            b   is p x 1 dense matrix
            Aeq is q x n dense or sparse matrix
            beq is q x 1 dense matrix
            lb  is n x 1 matrix or scalar
            ub  is n x 1 matrix or scalar

        Output arguments:
            Return dictionary, the output of CVXOPT QP.

        Dont pass matlab-like empty lists to avoid setting parameters,
        just use None:
            lsqlin(C, d, 0.05, None, None, Aeq, beq) #Correct
            lsqlin(C, d, 0.05, [], [], Aeq, beq) #Wrong!
    &#39;&#39;&#39;
    sparse_case = False
    if sparse.issparse(A): #detects both np and cxopt sparse
        sparse_case = True
        #We need A to be scipy sparse, as I couldn&#39;t find how 
        #CVXOPT spmatrix can be vstacked
        if isinstance(A, spmatrix):
            A = spmatrix_sparse_to_scipy(A)
            
    C =   numpy_to_cvxopt_matrix(C)
    d =   numpy_to_cvxopt_matrix(d)
    Q = C.T * C
    q = - d.T * C
    nvars = C.size[1]

    if reg &gt; 0:
        if sparse_case:
            I = scipy_sparse_to_spmatrix(sparse.eye(nvars, nvars,\
                                          format=&#39;coo&#39;))
        else:
            I = matrix(np.eye(nvars), (nvars, nvars), &#39;d&#39;)
        Q = Q + reg * I

    lb = cvxopt_to_numpy_matrix(lb)
    ub = cvxopt_to_numpy_matrix(ub)
    b  = cvxopt_to_numpy_matrix(b)
    
    if lb is not None:  #Modify &#39;A&#39; and &#39;b&#39; to add lb inequalities 
        if lb.size == 1:
            lb = np.repeat(lb, nvars)
    
        if sparse_case:
            lb_A = -sparse.eye(nvars, nvars, format=&#39;coo&#39;)
            A = sparse_None_vstack(A, lb_A)
        else:
            lb_A = -np.eye(nvars)
            A = numpy_None_vstack(A, lb_A)
        b = numpy_None_concatenate(b, -lb)
    if ub is not None:  #Modify &#39;A&#39; and &#39;b&#39; to add ub inequalities
        if ub.size == 1:
            ub = np.repeat(ub, nvars)
        if sparse_case:
            ub_A = sparse.eye(nvars, nvars, format=&#39;coo&#39;)
            A = sparse_None_vstack(A, ub_A)
        else:
            ub_A = np.eye(nvars)
            A = numpy_None_vstack(A, ub_A)
        b = numpy_None_concatenate(b, ub)

    #Convert data to CVXOPT format
    A =   numpy_to_cvxopt_matrix(A)
    Aeq = numpy_to_cvxopt_matrix(Aeq)
    b =   numpy_to_cvxopt_matrix(b)
    beq = numpy_to_cvxopt_matrix(beq)

    #Set up options
    if opts is not None:
        for k, v in opts.items():
            solvers.options[k] = v
    
    #Run CVXOPT.SQP solver
    sol = solvers.qp(Q, q.T, A, b, Aeq, beq, None, x0)
    return sol

def lsqnonneg(C, d, opts):
    &#39;&#39;&#39;
    Solves nonnegative linear least-squares problem:
    
    min_x ||C*x - d||_2^2,  where x &gt;= 0
    &#39;&#39;&#39;
    return lsqlin(C, d, reg = 0, A = None, b = None, Aeq = None, \
                 beq = None, lb = 0, ub = None, x0 = None, opts = opts)


if __name__ == &#39;__main__&#39;:
    # simple Testing routines
    C = np.array(np.mat(&#39;&#39;&#39;0.9501,0.7620,0.6153,0.4057;
    0.2311,0.4564,0.7919,0.9354;
    0.6068,0.0185,0.9218,0.9169;
    0.4859,0.8214,0.7382,0.4102;
    0.8912,0.4447,0.1762,0.8936&#39;&#39;&#39;))
    sC = sparse.coo_matrix(C)
    csC = scipy_sparse_to_spmatrix(sC)

    A = np.array(np.mat(&#39;&#39;&#39;0.2027,0.2721,0.7467,0.4659;
    0.1987,0.1988,0.4450,0.4186;
    0.6037,0.0152,0.9318,0.8462&#39;&#39;&#39;))
    sA = sparse.coo_matrix(A)
    csA = scipy_sparse_to_spmatrix(sA)

    d = np.array([0.0578, 0.3528, 0.8131, 0.0098, 0.1388])
    md = matrix(d)

    b =  np.array([0.5251, 0.2026, 0.6721])
    mb = matrix(b)

    lb = np.array([-0.1] * 4)
    mlb = matrix(lb)
    mmlb = -0.1

    ub = np.array([2] * 4)
    mub = matrix(ub)
    mmub = 2

    #solvers.options[show_progress&#39;] = False
    opts = {&#39;show_progress&#39;: False}

    for iC in [C, sC, csC]:
        for iA in [A, sA, csA]:
            for iD in [d, md]:
                for ilb in [lb, mlb, mmlb]:
                    for iub in [ub, mub, mmub]:
                        for ib in [b, mb]:
                            ret = lsqlin(iC, iD, 0, iA, ib, None, None, ilb, iub, None, opts)
                            print ret[&#39;x&#39;].T
    print &#39;Should be [-1.00e-01 -1.00e-01  2.15e-01  3.50e-01]&#39;
    
    #test lsqnonneg
    C = np.array([[0.0372, 0.2869], [0.6861, 0.7071], [0.6233, 0.6245], [0.6344, 0.6170]]);
    d = np.array([0.8587, 0.1781, 0.0747, 0.8405]);
    ret = lsqnonneg(C, d, {&#39;show_progress&#39;: False})
    print ret[&#39;x&#39;].T
    print &#39;Should be [2.5e-07; 6.93e-01]&#39;


&lt;/pre&gt;

&lt;link href=&quot;http://alexgorbatchev.com/pub/sh/current/styles/shCore.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&gt;&lt;/link&gt; 
&lt;link href=&quot;http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&gt;&lt;/link&gt; 
&lt;script src=&quot;http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt; 
&lt;script src=&quot;http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt; 
&lt;script language=&quot;javascript&quot;&gt; 
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = &#39;http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf&#39;;
SyntaxHighlighter.all();
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://maggotroot.blogspot.com/feeds/9051450211051081211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3533395109779030309/9051450211051081211' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/9051450211051081211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/9051450211051081211'/><link rel='alternate' type='text/html' href='http://maggotroot.blogspot.com/2013/11/constrained-linear-least-squares-in.html' title='Constrained linear least squares in Python using scipy and cvxopt. Matlabs lsqlin and lsqnonneg in Python with sparse matrices.'/><author><name>visva</name><uri>http://www.blogger.com/profile/15897971540914143113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3533395109779030309.post-2954451115786677354</id><published>2013-10-11T13:00:00.001-07:00</published><updated>2013-10-11T14:12:54.144-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="matlab"/><category scheme="http://www.blogger.com/atom/ns#" term="octave"/><category scheme="http://www.blogger.com/atom/ns#" term="speed"/><category scheme="http://www.blogger.com/atom/ns#" term="timing"/><title type='text'>Pairwise distances in Matlab and Octave</title><content type='html'>It is always rewarding, to spend some time vectorizing computations in &lt;tt&gt;matlab&lt;/tt&gt;:
code runs faster, you are happy to see how all these ugly &lt;tt&gt;for&lt;/tt&gt;-cycles
roll up and turn into elegant linear algebra formulas,
sometimes you even can exploit hidden logic in your computations(see covariance matrix estimation).

&lt;p/&gt;
Of course you shouldn&#39;t be too fanatic about it: code can come less readable, 
memory consumption can grow unproportionally: see &lt;tt&gt;ndgrid&lt;/tt&gt; example below, or recall some &lt;tt&gt;repmat&lt;/tt&gt; constructions.
I would like to have &lt;tt&gt;octave&lt;/tt&gt; and &lt;tt&gt;python&lt;/tt&gt; -style &lt;a chref=&quot;http://www.gnu.org/software/octave/doc/interpreter/Broadcasting.html&quot;&gt;broadcasting&lt;/a&gt; 
implemented in &lt;tt&gt;matlab&lt;/tt&gt;,
but they claim, that &lt;tt&gt;bsxfun&lt;/tt&gt;, &lt;tt&gt;arrayfun&lt;/tt&gt;, and &lt;tt&gt;JITA&lt;/tt&gt; loops implementation are fast enough. I strongly disagree.

&lt;p/&gt;
Anyway. Suppose you want to compute table of pairwise distances for two set of vectors in $d$-dimensional space:
$$(P)_{ij} = \|x_i - y_j\|^2_2, \;\; i=1,\dots,n_1,\; j = 1,\dots,n_2, \text{ and } P\in\mathbb{R}^{n_1\times n_2}.$$
We store $x_i$ and $y_i$ as columns in matrices $X$ and $Y$ respectively:
$$X = \left[ x_1, \dots, x_{n_1}\right] \in \mathbb{R}^{d\times n_1},$$
$$Y = \left[ y_1, \dots, y_{n_2}\right] \in \mathbb{R}^{d\times n_2}.$$

We can expand $\ell_2$-norm:
$$(P)_{ij} = \|x_i - y_j\|^2_2 = x_i^\top x_i + y_j^\top y_j - 2 x_i^\top y_j,$$
now expression for &lt;it&gt;matrix&lt;/it&gt; $P$ can be written using matrix multiplications:
$$P = a\mathbb{1}_{(n_2\times 1)}^\top + \mathbb{1}_{(n_1\times 1)} b - 2 X^\top Y,$$
where $a$ and $b$ are vectors containing $\ell_2$ norms for every vector $x_i$ and $y_j$:
$a_i = \|x_i\|_2^2, \;\; a\in\mathbb{R}^{n_1\times 1}$, and 
$b_j = \|y_j\|_2^2, \;\; b\in\mathbb{R}^{n_2\times 1}$.
&lt;br/&gt;
$\mathbb{1}_{(m\times 1)} =  \left[1, \dots, 1\right]^\top \, \in \mathbb{R}^{m\times 1}.$
&lt;br/&gt;

Finally, this formula can be written in vectorized &lt;tt&gt;matlab&lt;/tt&gt; expression:
&lt;pre&gt;
a = sum(X.^2, 1);
b = sum(Y.^2, 1);
P = a&#39; * ones(1, N2)  + ones(N1, 1) * b - 2 * (X&#39; * Y); 
&lt;/pre&gt;
&lt;p/&gt;
This is quite fast and elegant implementation, that has quite the same(can be twice faster, can be twice slower) running time, as &lt;tt&gt;matlab&lt;/tt&gt;s built-in &lt;tt&gt;pdist2&lt;/tt&gt;. 
And it is much faster and more memory efficient, than &lt;tt&gt;ndgrid&lt;/tt&gt;-based(see below) pairwise distance computation. Take a look at code, comparing 3 different implementations
for this problem. Notation is consistent with formulas above.

&lt;pre&gt;
%generate data
d = 100; % dimensionality
N1 = 500; % number of vectors
N2 = 400; % number of vectors
X = rand(d, N1);
Y = rand(d, N2);

%built-in
tic();
pd = pdist2(X&#39;, Y&#39;);
fprintf(&#39;&quot;built-in&quot;:\t%.5f seconds\n&#39;, toc());

%ndgrid
tic();
[gx, gy] = ndgrid(1 : N1, 1 : N2);
P_grid = reshape(sqrt(sum( (X(:, gx) - Y(:, gy)).^2, 1)), [N1, N2]);
t = toc();
fprintf(&#39;&quot;ndgrid&quot;:\t%.5f seconds. Max err: %e\n&#39;, t, max(max(abs(P_grid - pd))));

%matrix
tic();
a = sum(X.^2, 1);
b = sum(Y.^2, 1);
%I use abs to get rid of small(1e-15) negative diagoanl values, 
%produced by computational errors
P =  abs(a&#39; * ones(1, N2)  + ones(N1, 1) * b - 2 * (X&#39; * Y)); 
P = sqrt(P); %to be consistent with pdist2
t = toc();
fprintf(&#39;&quot;matrix&quot;:\t%.5f seconds. Max err: %e\n&#39;, t, max(max(abs(P - pd))));
&lt;/pre&gt; 

Output on my machine:
&lt;pre&gt;
&quot;built-in&quot;: 0.02721 seconds
&quot;ndgrid&quot;: 0.67575 seconds. Max err: 0.000000e+00
&quot;matrix&quot;: 0.01662 seconds. Max err: 1.243450e-14
&lt;/pre&gt;


</content><link rel='replies' type='application/atom+xml' href='http://maggotroot.blogspot.com/feeds/2954451115786677354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3533395109779030309/2954451115786677354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/2954451115786677354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/2954451115786677354'/><link rel='alternate' type='text/html' href='http://maggotroot.blogspot.com/2013/10/pairwise-distances-in-matlab-and-octave.html' title='Pairwise distances in Matlab and Octave'/><author><name>visva</name><uri>http://www.blogger.com/profile/15897971540914143113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3533395109779030309.post-3290182503306867868</id><published>2010-02-14T13:20:00.001-08:00</published><updated>2011-03-09T16:09:21.598-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2 альпс"/><category scheme="http://www.blogger.com/atom/ns#" term="deux alpes"/><category scheme="http://www.blogger.com/atom/ns#" term="downhill"/><category scheme="http://www.blogger.com/atom/ns#" term="les 2 alpes"/><category scheme="http://www.blogger.com/atom/ns#" term="snowpark"/><category scheme="http://www.blogger.com/atom/ns#" term="summer"/><category scheme="http://www.blogger.com/atom/ns#" term="ле дез альпс"/><title type='text'>Летняя поездка в Les Deux Alpes с велосипедами и лыжами</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4AlNyXe6rqA7sorkljs6xdTOPd6XzgI7FEeuRCXHFzZEwaFtGYnI8pUfjXexjMhQxvqw5v421FyvVp_e2Qe7rK2sPBnrGJ_3DyT3jnovqxhSSS0UVYGlqppXzFm_YqWysMCzJvF2Cqy0/s1280/P1030509.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 337px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4AlNyXe6rqA7sorkljs6xdTOPd6XzgI7FEeuRCXHFzZEwaFtGYnI8pUfjXexjMhQxvqw5v421FyvVp_e2Qe7rK2sPBnrGJ_3DyT3jnovqxhSSS0UVYGlqppXzFm_YqWysMCzJvF2Cqy0/s1280/P1030509.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Летом 2009-го года мы решили съездить в горы с велосипедами. После весенней поездки на Домбай в бордический лагерь, где весь поселок половину отдыха провел в сортирах, где парковый подъемник еле работал, первая очередь раб&lt;a href=&quot;http://lh3.ggpht.com/_AjdJlqDSJVY/Sn8h-UsOJKI/AAAAAAAAC1A/lvCmjW7GUZ8/s1440/P1030605.JPG&quot;&gt;&lt;/a&gt;отаал через день, а сам парк редко шейпили, да и еще все это вышло нихуя не дешево. Так я решил больше не мучать себя подобными поездками по России. Надеюсь что дальнейший рассказ поможет кому-то с подготовкой подобной поездки. Все планирование поездок проходило без участия турфирм.&lt;/span&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Итак, напомню, что главной целью было покатать даунхилл на великах в горах. Я считал, что такая поездка обойдется недешево: иначе почему я не знаю почти никого, кто катался на байке в европе? Но оказалось, что по деньгам все может выйти дешевле обычной зимней поездки в альпы на лыжах. Вообще, почти каждый европейский курорт предлагает летом катание на велосипеде. Это и Ле Дез Альпс, и Ле Же, Майрхофен... Знаю только, что Шамони принципиально на это не идет -- все же приходится портить ландшафт зимних трасс. Уже не помню почему, но мой выбор пал на франуцузский поселочек Les Deux Alpes(далее л2а). Видимо из-за того, что там есть и даунхильные трассы, и байк-парк, и ледник со снежным парком. Летнее катание на леднике уже есть далеко не везде, знаю пару мест в Норвегии, Австрии, например, ледник Hintertux, что недалеко от Майрхофена.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Вот с какими проблемами мы столкнулись: перелет из Москвы с велосипедом и лыжами, трансфер из аэропорта в поселок, бронирование апартаментов. Ехали мы втроем на 2 недели: конец июля начало августа. Обсудим все по порядку.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:large;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Собираем вещи&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Сперва надо было придумать как везти весь инвентарь с собой. Ну как обычно: вещи в чемодан, лыжи в соответствующий чехол, а вот велосипед... Можно купить велосумку, но они либо не приспособлены для транспортировки даунхильного байка, либо стоят нехилых денег. Просто так обмотать тряпкой раму нельзя. Можно использовать коробки, в которых сами велосипеды доставляют по магазинам(гоу в соколя, попросите коробку в магазине, или просто покопайтесь на свалке), но мне больше подошла коробка от плазменного телика. С байка были сняты: оба колеса, амортизатор, вилка, тормоза, переклюк, &lt;/span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;педали&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;(это обязательно требование авиакомпаний). Также в коробку были кинуты всякие запасные детали, инструменты. В итоге коробка весила ~35 кг, лыжный чехол ~15 кг, чемодан ~25 кг. Примерно 75 кило... И кто нас довезет?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:large;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Летим из Москвы&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Так как никакие турфирмы не занимаются поездками на велосипедах, приходилось смотреть, какие авиалинии наиболее лояльно относящиеся к спортинвентарю, могли нас закинуть поближе к л2а. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Аэрофлот шел нааахуй сразу: сам билет не дешевый и ограничение 20 кило, если бы мы платили за каждый лишний килограмм, то мне билет стоил бы тысяч 60. Однако возможны варианты, если у вас есть всякие аэрофлотовские бонусы и вы возьмете бизнес-класс, где ограничение 30 кг. Смотрите тут &lt;/span&gt;&lt;a href=&quot;http://wwww.aeroflot.ru/templates/before_and_after_fly/sverh_bagazh.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://wwww.aeroflot.ru/templates/before_and_after_fly/sverh_bagazh.html&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://wwww.aeroflot.ru/templates/before_and_after_fly/sverh_bagazh.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://wwww.aeroflot.ru/templates/before_and_after_fly/sverh_bagazh.html&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Air France. Не выгоден из-за того, что у нас были лыжи. Пришлось бы платить 240 евро в каждую сторону (80 лыжи + 2х80 за байк). &lt;/span&gt;&lt;a href=&quot;http://www.airfrance.com/RU/en/common/guidevoyageur/pratique/bagage_equipement_sport_airfrance.htm&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://www.airfrance.com/RU/en/common/guidevoyageur/pratique/bagage_equipement_sport_airfrance.htm&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Swiss Air. Ими то мы и полетели в Женеву. Лыжи можно всегда провозить бесплатно, велик стоит 70 евро в каждую сторону(на сайте написано что он должен быть не тяжелее 23 кг, но они на это не смотрели). + был дешевый билет: мы взяли за 14000, но если бы подсуетились на неделю раньше, то были билеты где-то за 9000. Ну и каг бы свисс эир несравним с говнофлотом. И я просто не могу не отметить, что они дают &lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;железные &lt;/span&gt;&lt;/i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;вилки и ножи и халявное вино. Сразу видно, что пацаны не очкуют: чего стоят запреты на минареты.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:large;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Едем из аэропорта в горы&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsScnLL51Bzg8TnYxaFKYCEh71jfY4FTXAhjMKryro475g3YBHf4TRLrO-cK_D-WXCE9M7LXG4gLmXmpb3WxFwj7szn18wtHuYQXwAWGaCCoqQ79g4QH5kj0QO8c-Lyf16c8VCXMdU4v0/s1600-h/route.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsScnLL51Bzg8TnYxaFKYCEh71jfY4FTXAhjMKryro475g3YBHf4TRLrO-cK_D-WXCE9M7LXG4gLmXmpb3WxFwj7szn18wtHuYQXwAWGaCCoqQ79g4QH5kj0QO8c-Lyf16c8VCXMdU4v0/s400/route.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5438185925524660882&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;br /&gt;Если вы посмотрите на карту, то увидите, что из Женевы  до л2а 212 километров. Рейс был вечерний и мы прилетали где-то в 20:00. Поезда и автобусы уже не ходили. Так что было 3 варианта:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Ночевать в Женеве, а потом на поездах, автобусах, через Гренобль ехать в л2а. Но сама ночь в Женеве стоила денег, нам надо было со всеми коробками доехать до отеля, а потом как то с таким грузом ехать на поезде, а поезда по Европе не особо дешевые. Да еще терялся день катание и все это жутко выматывало. Так что не вариант.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Взять машину на прокат в Женеве, довезти вещи до л2а, а потом сдать ее в Гренобле. Но нам не было 22-х лет, а следовательно, мы не могли забронировать машину, на которой могли поехать 3 человека, 3 чемодана, 2 велика, лыжи и борд)). Да и сам прокат машины в Швейцарии заметно дороже, чем во франции. Ну и сам факт бронирования большого автомобиля из Москве не очень то гарантирует, что по прилету вас будет ждать машина похожего класса. Тоже не вариант.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Заказать такси(в нашем случае микроавтобус). Это стоило 470 евро. Да, конечно не дешево платить по 300 евро за трансфер(470 туда и столько же обратно), но это оказался оптимальный для нас вариант.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;На самом деле, это были два самых сложных вопроса, которые нам надо было решить. Остальное было просто&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:large;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Проживание, виза, подъемники&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Бронируете по кредитке апартаменты\отель через официальные сайты ( &lt;/span&gt;&lt;a href=&quot;http://www.les2alpes.com/&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://www.les2alpes.com/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://2alpes.com/&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://2alpes.com/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; ). Вообще, проживание летом на порядок дешевле, чем зимой. Мы взяли 4-х местные апартаменты(Cote Brune) на 2 недели за 600 евро и жили в трехстах метрах от подъемника. (Но втроем в них было уже чуток тесно -- ох эти французы... ). Связываетесь с ними по мейлу\телефону, вам высылают приглашение. С приглашением и билетом на самолет идете в консульство и получаете визу. В нашем случае нам дали визу за 2 дня на 1 год. Покупаете в какой-нибудь турфирме страховку(берите самую дорогую, это где-то 30 евро).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Подъемники мы брали каждый день отдельно: нам нужен был и велосипедный и лыжный скипас, но далеко не каждый день мы ездили кататься на лыжах. Расценки на подъемы можно посмотреть на официальном сайте курорта.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Давайте примерно прикинем стоимость такой двухнедельной поездки:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;12000 р перелет +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;140 евро за перевес +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;300 евро трансфер +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;15-30 евро в день на подъемник (в зависимости  от того весь ли день вы катаетесь, едите ли на ледник)+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;15 евро в день на еду (это уже все индивидуально, недавно я ездил в Альпы и некоторые тратили по 5 евро в день на еду)+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;200 евро за проживание.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Получается примерно 60000 с человека. Но не забывайте, что можно сэкономить на еде, перелете, или трансфере (например лететь эир фрэнсом до Леона или Гренобля). Вообще имеет смысл поехать в Les Gets: это совсем не далеко от Женевы, сами трассы там вроде бы более качественные, но нету ледника, и перепад высот меньше.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Даже не знаю, стоит ли рассказывать про впечатления от поездки. Они непередаваемы. Минус был только один: огромные очереди на подъемнике в сноупарк, но об это позже. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;В л2а есть все: даунхилл с перепадом 2500 метров, кросскантри, байк-парк, сноупарк, банджи-джампинг с огромнейшей высоты, горные озера у велосипедных трасс, гонрое озеро с пляжем в самом поселке, бассейн, скалы по близости и стена для скалолазания в самом поселке, там есть каток, горная речка с рафтингом, парк развлечений, параглайдинг, батуты, скейтпарк, гольф, стрельба из лука, маленький халфпайп и батут почти у каждого отеля, можно погулять по горам, в конце концов... И все это в маленьком поселочке Les Deux Alpes на высоте 1600 метров, который вытянулся в длину на 2 километра и в ширину не более 400 метров.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhud1EzcVG2KeclxG1G1VWcDOPrTbzXdL8h37uO3BNfK3AjcWxcnbIpWUlJjMj5jknLmNPT6NfNHkuu5rg_bz8MWei1x60FK4VZduThrWiOFMbxgvmOUcVT9oj60GOFuIRy1UVL0gjK7kY/s720/P1030521.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 450px; height: 800px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhud1EzcVG2KeclxG1G1VWcDOPrTbzXdL8h37uO3BNfK3AjcWxcnbIpWUlJjMj5jknLmNPT6NfNHkuu5rg_bz8MWei1x60FK4VZduThrWiOFMbxgvmOUcVT9oj60GOFuIRy1UVL0gjK7kY/s720/P1030521.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:large;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Про катание на байке&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Актуальную карту склонов можно посмотреть на официальном сайте. Кабинка закидывает нас к подножье ледника на высоту 2800 метров. Откуда, первые метров 600 по вертикали нас ждут каменистые хардкорные трассы, напоминающие Марс или Луну. Далее появляется травка и деревья. Трассы становятся грунтовыми, на них появляется жутко неприятная тормозная гребенка перед поворотами. Еще чуть ниже появляются деревья и норт-шоры. При спуске в поселок нас встречает кучей дропов( от 1 до 10 метров) байк-парк. Спустившись в поселок можно поехать вниз до Веноска по одной из самых запоминающихся трасс с вертикальным перепадом 900 метров: это достаточно сложно сделать на одном дыхании)) &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh63QBXwCuLnbB426PWIzVKtNAyr0W0tsL6-Bak4Z4_eOvu4eTCRqhqPhYMzwAKS1CQIeOPAe7viVyDbj6vncxVvX3swWr3AFsx1c830tUBzA68A8MpinTQON2cdCgU-gYNlls4zt3QgOk/&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600; height: 337px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh63QBXwCuLnbB426PWIzVKtNAyr0W0tsL6-Bak4Z4_eOvu4eTCRqhqPhYMzwAKS1CQIeOPAe7viVyDbj6vncxVvX3swWr3AFsx1c830tUBzA68A8MpinTQON2cdCgU-gYNlls4zt3QgOk/&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Хочется отметить, что классификация даунхильных и лыжных трасс по цветам имеет мало общего: по красной трассе уже просто сложно съехать, по черной трассе я только 1 раз смог съехать без падений и долгих остановок на отдых))) Несколько советов: запаска, инструменты, шестигранник всегда при себе, мягко настройте вилку, одевайте всю защиту. Я редко там видел людей без шлема(вообще не видел), полной голени и полного бодиармора. Кстати, прокат байка с защитой стоит от 20(приличный подвес подвес) до 50(топовая кона стинки\сантакруз) евро за весь день, можно брать на пол дня.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZPF9NDjY05ReoVkIFQFPkDUuh25cDaet-TqSBFehVYvn-df_R6c1nlYdq9KtOI7OAVuyaqedfoLFQdNRThMmkD47_X5DZ8X-q4BaMYD-Jep8EcCmbGrnpvu1vm-EYDJGWar_10DtoIvw/&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 337px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZPF9NDjY05ReoVkIFQFPkDUuh25cDaet-TqSBFehVYvn-df_R6c1nlYdq9KtOI7OAVuyaqedfoLFQdNRThMmkD47_X5DZ8X-q4BaMYD-Jep8EcCmbGrnpvu1vm-EYDJGWar_10DtoIvw/&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:large;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Про катание в парке на леднике&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Подъемник начинает работать с 7 утра, все закрывается где-то в 14:00. Но прыгать нормальные серии становится сложно где-то к 13:00. Если ночью было холодно, то иногда приходится ждать часов до 10, пока приземы растают от льда. Но в общем-то ходов хватало и приземы становились очень мягкими. И все было бы просто супер, если бы не было кууучи итальянцев и испанцев, приехавших в бордические лагеря. Они устраивали очереди на подъемниках(10-15 минут надо было ждать каждый подъем), и их &quot;про&quot; постоянно не докручивали 540 на борде и стесывали кантами приземления больших кикеров до льда. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Вообще там была фан серия, состоящая из джибинга и мелких недокикеров, 2 огромных пайпа, 1 огромная пирамида. Паблик лайн: 12 и 15 метров кикеры первая полка,  8 и 10 метров вторая полка. Про лайн: 18 и 22 метра первая полка, 10 и 15 метров вторая полка. К концу поездки паблик лайн тупо снесли: перестало хватать ходов. Самый вменяемый трамплин -- это 22-х метровый бигэир: его тщательнее всего шейпили. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9eCt-7SqtdktKG0zQseP_uzFDgfZVGplU62fPzLUm-H0jYedyzkg28rl5jrTr6s4Nt2dsCsdOHZSGmIl5h_nEA8ZRUN6FQXuBINT2qlrZVFtZsCe9IsEaSRfSj0mnqF4H4szbehpX7uc/s1024/DSC01718.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 450px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9eCt-7SqtdktKG0zQseP_uzFDgfZVGplU62fPzLUm-H0jYedyzkg28rl5jrTr6s4Nt2dsCsdOHZSGmIl5h_nEA8ZRUN6FQXuBINT2qlrZVFtZsCe9IsEaSRfSj0mnqF4H4szbehpX7uc/s1024/DSC01718.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Вот фотографии&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://picasaweb.google.com/MaGGoTroot/Les2alpes#&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://picasaweb.google.com/MaGGoTroot/Les2alpes#&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Вот видео из сноупарка&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=8B6ykipzCPU&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://www.youtube.com/watch?v=8B6ykipzCPU&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=t1TnZKSrnPA&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://www.youtube.com/watch?v=t1TnZKSrnPA&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;Еще видео и фото катания на байке в л2а можно найти на &lt;/span&gt;&lt;a href=&quot;http://pinkbike.com/&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;http://pinkbike.com&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt; по тегам 2alpes, deux alpes... &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family:&#39;times new roman&#39;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maggotroot.blogspot.com/feeds/3290182503306867868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3533395109779030309/3290182503306867868' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/3290182503306867868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3533395109779030309/posts/default/3290182503306867868'/><link rel='alternate' type='text/html' href='http://maggotroot.blogspot.com/2010/02/les-deux-alpes_14.html' title='Летняя поездка в Les Deux Alpes с велосипедами и лыжами'/><author><name>visva</name><uri>http://www.blogger.com/profile/15897971540914143113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4AlNyXe6rqA7sorkljs6xdTOPd6XzgI7FEeuRCXHFzZEwaFtGYnI8pUfjXexjMhQxvqw5v421FyvVp_e2Qe7rK2sPBnrGJ_3DyT3jnovqxhSSS0UVYGlqppXzFm_YqWysMCzJvF2Cqy0/s72-c/P1030509.JPG" height="72" width="72"/><thr:total>2</thr:total></entry></feed>