def test_allows_use_of_different_kernel(self):
     a = neo.SpikeTrain(sp.array([1.0, 2.5, 6.5]) * pq.s, t_stop=7.0 * pq.s)
     b = neo.SpikeTrain(
         sp.array([1.2, 5.7, 8.0, 9.0]) * pq.s, t_stop=10.0 * pq.s)
     kernel = sigproc.TriangularKernel(1.0 * pq.s, normalize=False)
     expected = sp.array(
         [[1.0, 0.29166666666666663], [0.29166666666666663, 1.0]])
     actual = stm.hunter_milton_similarity([a, b], kernel=kernel)
     assert_array_almost_equal(expected, actual)
 def test_returns_correct_hunter_milton_similarity(self):
     a = neo.SpikeTrain(sp.array([1.0, 2.5, 6.5]) * pq.s, t_stop=7.0 * pq.s)
     b = neo.SpikeTrain(
         sp.array([1.2, 5.7, 8.0, 9.0]) * pq.s, t_stop=10.0 * pq.s)
     c = neo.SpikeTrain(sp.array([2.1, 2.0, 5.0]) * pq.s, t_stop=10.0 * pq.s)
     tau = 2.0 * pq.s
     expected = sp.array(
         [[1.0, 0.64128747518120299, 0.661254342403672],
          [0.64128747518120299, 1.0, 0.5521235786217787],
          [0.661254342403672, 0.5521235786217787, 1.0]])
     actual = stm.hunter_milton_similarity([a, b, c], tau)
     assert_array_almost_equal(expected, actual)
    * 'vp': :func:`Victor Purpura's distance
      <.spike_train_metrics.victor_purpura_dist>` with :math:`q = 2/\\tau`
    * 'vr': :func:`Van Rossum distance <.spike_train_metrics.van_rossum_dist>`
"""

import quantities as pq
import scipy as sp
import sklearn.base
import spykeutils.spike_train_metrics as stm


metric_defs = {
    'es': ("Event synchronization",
           lambda trains, tau: 1.0 - stm.event_synchronization(trains, tau)),
    'hm': ("Hunter-Milton similarity measure",
           lambda trains, tau: 1.0 - stm.hunter_milton_similarity(trains, tau)),
    'vp': ("Victor-Purpura\'s distance",
           lambda trains, tau: stm.victor_purpura_dist(trains, 2.0 / tau)),
    'vr': ("Van Rossum distance",
           lambda trains, tau: stm.van_rossum_dist(trains, tau))
}


class PrecomputedSpikeTrainMetricApplier(
        sklearn.base.BaseEstimator, sklearn.base.TransformerMixin):
    """ Precomputes a spike train metric on spike trains and retrieves the
    corresponding Gram matrix (the matrix of all pairwise distances) for
    requested sets of the initial data.

    The spike trains will be passed only once to this class when constructing
    it. At this point the 1D array attribute :attr:`x_in` will be created
 def test_spike_trains_may_be_empty(self):
     empty = create_empty_spike_train()
     non_empty = neo.SpikeTrain(sp.array([1.0]) * pq.s, t_stop=3.0 * pq.s)
     expected = sp.array([[1.0, 0.0], [0.0, 1.0]])
     actual = stm.hunter_milton_similarity([empty, non_empty])
     assert_array_almost_equal(expected, actual)
 def calc_similarity(self, trains):
     return stm.hunter_milton_similarity(trains)
import spykeutils.spike_train_metrics as stm
import sys
import timeit


tau = 5.0 * pq.ms
sampling_rate = 1000 * pq.Hz


metrics = {
    "cs": (
        r"$D_{\mathrm{CS}}$",
        lambda trains: stm.cs_dist(trains, sigproc.CausalDecayingExpKernel(tau), sampling_rate),
    ),
    "es": (r"$S_{\mathrm{ES}}$", lambda trains: stm.event_synchronization(trains, tau, sort=False)),
    "hm": (r"$S_{\mathrm{HM}}$", lambda trains: stm.hunter_milton_similarity(trains, tau)),
    "norm": (
        r"$D_{\mathrm{ND}}$",
        lambda trains: stm.norm_dist(trains, sigproc.CausalDecayingExpKernel(tau), sampling_rate),
    ),
    "ss": (r"$S_{S}}$", lambda trains: stm.schreiber_similarity(trains, sigproc.LaplacianKernel(tau), sort=False)),
    "vr": (r"$D_{\mathrm{R}}$", lambda trains: stm.van_rossum_dist(trains, tau, sort=False)),
    "vp": (r"$D_{\mathrm{V}}$", lambda trains: stm.victor_purpura_dist(trains, 2.0 / tau)),
}


def print_available_metrics():
    for key in metrics:
        print "%s  (%s)" % (key, metrics[key][0])