Ejemplo n.º 1
0
    logger = mpi.setup_logger(screen=True, file_name='neurokernel.log',
                              mpi_comm=MPI.COMM_WORLD, multiline=True)

    man = Manager()

    m1_int_sel_in_gpot = '/a/in/gpot0,/a/in/gpot1'
    m1_int_sel_out_gpot = '/a/out/gpot0,/a/out/gpot1'
    m1_int_sel_in_spike = '/a/in/spike0,/a/in/spike1'
    m1_int_sel_out_spike = '/a/out/spike0,/a/out/spike1'
    m1_int_sel = ','.join([m1_int_sel_in_gpot, m1_int_sel_out_gpot,
                           m1_int_sel_in_spike, m1_int_sel_out_spike])
    m1_int_sel_in = ','.join((m1_int_sel_in_gpot, m1_int_sel_in_spike))
    m1_int_sel_out = ','.join((m1_int_sel_out_gpot, m1_int_sel_out_spike))
    m1_int_sel_gpot = ','.join((m1_int_sel_in_gpot, m1_int_sel_out_gpot))
    m1_int_sel_spike = ','.join((m1_int_sel_in_spike, m1_int_sel_out_spike))
    N1_gpot = SelectorMethods.count_ports(m1_int_sel_gpot)
    N1_spike = SelectorMethods.count_ports(m1_int_sel_spike)

    m2_int_sel_in_gpot = '/b/in/gpot0,/b/in/gpot1'
    m2_int_sel_out_gpot = '/b/out/gpot0,/b/out/gpot1'
    m2_int_sel_in_spike = '/b/in/spike0,/b/in/spike1'
    m2_int_sel_out_spike = '/b/out/spike0,/b/out/spike1'
    m2_int_sel = ','.join([m2_int_sel_in_gpot, m2_int_sel_out_gpot,
                           m2_int_sel_in_spike, m2_int_sel_out_spike])
    m2_int_sel_in = ','.join((m2_int_sel_in_gpot, m2_int_sel_in_spike))
    m2_int_sel_out = ','.join((m2_int_sel_out_gpot, m2_int_sel_out_spike))
    m2_int_sel_gpot = ','.join((m2_int_sel_in_gpot, m2_int_sel_out_gpot))
    m2_int_sel_spike = ','.join((m2_int_sel_in_spike, m2_int_sel_out_spike))
    N2_gpot = SelectorMethods.count_ports(m2_int_sel_gpot)
    N2_spike = SelectorMethods.count_ports(m2_int_sel_spike)
Ejemplo n.º 2
0
class BasePortMapper(object):
    """
    Maps integer sequence to/from path-like port identifiers.

    Examples
    --------
    >>> pm = BasePortMapper('/[a,b][0:2]')
    >>> print pm.ports_to_inds('/b[0:2]')
    array([2, 3])
    >>> print pm.inds_to_ports([0, 1])
    [('a', 0), ('a', 1)]

    Parameters
    ----------
    selector : str, unicode, or sequence
        Selector string (e.g., '/foo[0:2]') or sequence of token sequences
        (e.g., [['foo', (0, 2)]]) to map to `data`.
    portmap : sequence of int
        Integer indices to map to port identifiers. If no map is specified,
        it is assumed to be an array of consecutive integers from 0
        through one less than the number of ports.

    Attributes
    ----------
    index : pandas.MultiIndex
        Index of port identifiers.
    portmap : pandas.Series
        Map of port identifiers to integer indices.

    Notes
    -----
    The selectors may not contain any '*' or '[:]' characters.
    A single port identifier may be mapped to multiple integer indices, 
    but not vice-versa.
    """
    def __init__(self, selector, portmap=None):
        self.sel = SelectorMethods()
        N = self.sel.count_ports(selector)
        if portmap is None:
            self.portmap = pd.Series(data=np.arange(N))
        else:
            assert len(portmap) == N
            self.portmap = pd.Series(data=np.array(portmap))
        self.portmap.index = self.sel.make_index(selector)

    def copy(self):
        """
        Return copy of this port mapper.

        Returns
        -------
        result : neurokernel.plsel.BasePortMapper
            Copy of port mapper instance.
        """

        c = BasePortMapper('')
        c.portmap = self.portmap.copy()
        return c

    @classmethod
    def from_index(cls, idx, portmap=None):
        """
        Create port mapper from a Pandas index and a sequence of integer indices.

        Parameters
        ----------
        index : pandas.MultiIndex
            Index containing selector data.
        portmap : sequence of int
            Integer indices to map to port identifiers. If no map is specified,
            it is assumed to be an array of consecutive integers from 0
            through one less than the number of ports.

        Returns
        -------
        result : neurokernel.plsel.BasePortMapper
            New port mapper instance.

        Notes
        -----
        If specified, the portmap sequence is copied into the new mapper to avoid 
        side effects associated with modifying the specified sequence after
        mapper instantiation.
        """

        pm = cls('')
        N = len(idx)
        if portmap is None:
            pm.portmap = pd.Series.from_array(np.arange(N), idx)
        else:
            assert len(portmap) == N
            pm.portmap = pd.Series.from_array(np.array(portmap), idx)
        return pm

    @classmethod
    def from_pm(cls, pm):
        """
        Create a new port mapper instance given an existing instance.

        Parameters
        ----------
        result : neurokernel.plsel.BasePortMapper
            Existing port mapper instance.

        Returns
        -------
        result : neurokernel.plsel.BasePortMapper
            New port mapper instance.
        """

        assert isinstance(pm, cls)
        r = cls('')
        r.portmap = pm.portmap.copy()
        return r

    @property
    def index(self):
        """
        Port mapper index.
        """

        return self.portmap.index

    @index.setter
    def index(self, i):
        self.portmap.index = i

    def inds_to_ports(self, inds):
        """
        Convert list of integer indices to port identifiers.

        Examples
        --------
        >>> pm = BasePortMapper('/[a,b][0:2]')
        >>> print pm.inds_to_ports([0, 1])
        [('a', 0), ('a', 1)]

        Parameters
        ----------
        inds : array_like of int
            Integer indices of ports.

        Returns
        -------
        t : list of tuple
            Expanded port identifiers.
        """

        return self.portmap[self.portmap.isin(inds)].index.tolist()

    def ports_to_inds(self, selector):
        """
        Convert port selector to list of integer indices.

        Examples
        --------
        >>> pm = BasePortMapper('/[a,b][0:2]')
        >>> print pm.ports_to_inds('/b[0:2]')

        Parameters
        ----------
        selector : str, unicode, or sequence
            Selector string (e.g., '/foo[0:2]') or sequence of token sequences
            (e.g., [['foo', (0, 2)]]).

        Returns
        -------
        inds : numpy.ndarray of int
            Integer indices of ports comprised by selector. 
        """

        return self.sel.select(self.portmap,
                               selector).dropna().astype(np.int_).values

    def get_map(self, selector):
        """
        Retrieve integer indices associated with selector.

        Parameters
        ----------
        selector : str, unicode, or sequence
            Selector string (e.g., '/foo[0:2]') or sequence of token sequences
            (e.g., [['foo', (0, 2)]]).

        Returns
        -------
        result : numpy.ndarray
            Selected data.
        """

        return np.asarray(self.sel.select(self.portmap, selector).dropna())

    def set_map(self, selector, portmap):
        """
        Set mapped integer index associated with selector.

        Parameters
        ----------
        selector : str, unicode, or sequence
            Selector string (e.g., '/foo[0:2]') or sequence of token sequences
            (e.g., [['foo', (0, 2)]]).            
        portmap : sequence of int
            Integer indices to map to port identifiers.
        """

        self.portmap[self.sel.get_index(self.portmap, selector)] = portmap

    def equals(self, pm):
        """
        Check whether this mapper is equivalent to another mapper.

        Parameters
        ----------
        pm : neurokernel.plsel.BasePortMapper
            Mapper to compare to this mapper.

        Returns
        -------
        result : bool
             True if the specified port mapper contains the same port
             identifiers as this instance and maps them to the same integer
             values.

        Notes
        -----
        The port identifiers and maps in the specified port mapper need not be
        in the same order as this instance to be deemed equal.
        """

        assert isinstance(pm, BasePortMapper)
        pm0 = self.portmap.sort_values()
        pm1 = pm.portmap.sort_values()
        if np.array_equal(pm0.values, pm1.values) and \
           pm0.index.equals(pm1.index):
            return True
        else:
            return False

    def __len__(self):
        return self.portmap.size

    def __repr__(self):
        return 'Map:\n----\n' + self.portmap.__repr__()
Ejemplo n.º 3
0
    def emulate(n, steps):
        assert(n>1)
        n = str(n)

        # Set up emulation:
        man = Manager(get_random_port(), get_random_port(), get_random_port())
        man.add_brok()

        m1_int_sel_in_gpot = '/a/in/gpot0,/a/in/gpot1'
        m1_int_sel_out_gpot = '/a/out/gpot0,/a/out/gpot1'
        m1_int_sel_in_spike = '/a/in/spike0,/a/in/spike1'
        m1_int_sel_out_spike = '/a/out/spike0,/a/out/spike1'
        m1_int_sel = ','.join([m1_int_sel_in_gpot, m1_int_sel_out_gpot,
                               m1_int_sel_in_spike, m1_int_sel_out_spike])
        m1_int_sel_in = ','.join([m1_int_sel_in_gpot, m1_int_sel_in_spike])
        m1_int_sel_out = ','.join([m1_int_sel_out_gpot, m1_int_sel_out_spike])
        m1_int_sel_gpot = ','.join([m1_int_sel_in_gpot, m1_int_sel_out_gpot])
        m1_int_sel_spike = ','.join([m1_int_sel_in_spike, m1_int_sel_out_spike])
        N1_gpot = SelectorMethods.count_ports(m1_int_sel_gpot)
        N1_spike = SelectorMethods.count_ports(m1_int_sel_spike)
        m1 = MyModule(m1_int_sel,
                      m1_int_sel_in, m1_int_sel_out,
                      m1_int_sel_gpot, m1_int_sel_spike,
                      np.zeros(N1_gpot, np.float64),
                      np.zeros(N1_spike, int), ['interface', 'io', 'type'],
                      man.port_data, man.port_ctrl, man.port_time, 'm1', None,
                      False, True)
        man.add_mod(m1)

        m2_int_sel_in_gpot = '/b/in/gpot0,/b/in/gpot1'
        m2_int_sel_out_gpot = '/b/out/gpot0,/b/out/gpot1'
        m2_int_sel_in_spike = '/b/in/spike0,/b/in/spike1'
        m2_int_sel_out_spike = '/b/out/spike0,/b/out/spike1'
        m2_int_sel = ','.join([m2_int_sel_in_gpot, m2_int_sel_out_gpot,
                               m2_int_sel_in_spike, m2_int_sel_out_spike])
        m2_int_sel_in = ','.join([m2_int_sel_in_gpot, m2_int_sel_in_spike])
        m2_int_sel_out = ','.join([m2_int_sel_out_gpot, m2_int_sel_out_spike])
        m2_int_sel_gpot = ','.join([m2_int_sel_in_gpot, m2_int_sel_out_gpot])
        m2_int_sel_spike = ','.join([m2_int_sel_in_spike, m2_int_sel_out_spike])
        N2_gpot = SelectorMethods.count_ports(m2_int_sel_gpot)
        N2_spike = SelectorMethods.count_ports(m2_int_sel_spike),
        m2 = MyModule(m2_int_sel,
                      m2_int_sel_in, m2_int_sel_out,
                      m2_int_sel_gpot, m2_int_sel_spike,
                      np.zeros(N2_gpot, np.float64),
                      np.zeros(N2_spike, int), ['interface', 'io', 'type'],
                      man.port_data, man.port_ctrl, man.port_time, 'm2', None,
                      False, True)
        man.add_mod(m2)

        # Make sure that all ports in the patterns' interfaces are set so 
        # that they match those of the modules:
        pat12 = Pattern(m1_int_sel, m2_int_sel)
        pat12.interface[m1_int_sel_out_gpot] = [0, 'in', 'gpot']
        pat12.interface[m1_int_sel_in_gpot] = [0, 'out', 'gpot']
        pat12.interface[m1_int_sel_out_spike] = [0, 'in', 'spike']
        pat12.interface[m1_int_sel_in_spike] = [0, 'out', 'spike']
        pat12.interface[m2_int_sel_in_gpot] = [1, 'out', 'gpot']
        pat12.interface[m2_int_sel_out_gpot] = [1, 'in', 'gpot']
        pat12.interface[m2_int_sel_in_spike] = [1, 'out', 'spike']
        pat12.interface[m2_int_sel_out_spike] = [1, 'in', 'spike']
        pat12['/a/out/gpot0', '/b/in/gpot0'] = 1
        pat12['/a/out/gpot1', '/b/in/gpot1'] = 1
        pat12['/b/out/gpot0', '/a/in/gpot0'] = 1
        pat12['/b/out/gpot1', '/a/in/gpot1'] = 1
        pat12['/a/out/spike0', '/b/in/spike0'] = 1
        pat12['/a/out/spike1', '/b/in/spike1'] = 1
        pat12['/b/out/spike0', '/a/in/spike0'] = 1
        pat12['/b/out/spike1', '/a/in/spike1'] = 1
        man.connect(m1, m2, pat12, 0, 1)

        # To set the emulation to exit after executing a fixed number of steps,
        # start it as follows and remove the sleep statement:
        man.start(steps=steps)
        # man.start()
        # time.sleep(2)
        man.stop()
        return m1
Ejemplo n.º 4
0
    man = Manager()

    m1_int_sel_in_gpot = '/a/in/gpot0,/a/in/gpot1'
    m1_int_sel_out_gpot = '/a/out/gpot0,/a/out/gpot1'
    m1_int_sel_in_spike = '/a/in/spike0,/a/in/spike1'
    m1_int_sel_out_spike = '/a/out/spike0,/a/out/spike1'
    m1_int_sel = ','.join([
        m1_int_sel_in_gpot, m1_int_sel_out_gpot, m1_int_sel_in_spike,
        m1_int_sel_out_spike
    ])
    m1_int_sel_in = ','.join((m1_int_sel_in_gpot, m1_int_sel_in_spike))
    m1_int_sel_out = ','.join((m1_int_sel_out_gpot, m1_int_sel_out_spike))
    m1_int_sel_gpot = ','.join((m1_int_sel_in_gpot, m1_int_sel_out_gpot))
    m1_int_sel_spike = ','.join((m1_int_sel_in_spike, m1_int_sel_out_spike))
    N1_gpot = SelectorMethods.count_ports(m1_int_sel_gpot)
    N1_spike = SelectorMethods.count_ports(m1_int_sel_spike)

    m2_int_sel_in_gpot = '/b/in/gpot0,/b/in/gpot1'
    m2_int_sel_out_gpot = '/b/out/gpot0,/b/out/gpot1'
    m2_int_sel_in_spike = '/b/in/spike0,/b/in/spike1'
    m2_int_sel_out_spike = '/b/out/spike0,/b/out/spike1'
    m2_int_sel = ','.join([
        m2_int_sel_in_gpot, m2_int_sel_out_gpot, m2_int_sel_in_spike,
        m2_int_sel_out_spike
    ])
    m2_int_sel_in = ','.join((m2_int_sel_in_gpot, m2_int_sel_in_spike))
    m2_int_sel_out = ','.join((m2_int_sel_out_gpot, m2_int_sel_out_spike))
    m2_int_sel_gpot = ','.join((m2_int_sel_in_gpot, m2_int_sel_out_gpot))
    m2_int_sel_spike = ','.join((m2_int_sel_in_spike, m2_int_sel_out_spike))
    N2_gpot = SelectorMethods.count_ports(m2_int_sel_gpot)
Ejemplo n.º 5
0
class BasePortMapper(object):
    """
    Maps integer sequence to/from path-like port identifiers.

    Examples
    --------
    >>> pm = BasePortMapper('/[a,b][0:2]')
    >>> print pm.ports_to_inds('/b[0:2]')
    array([2, 3])
    >>> print pm.inds_to_ports([0, 1])
    [('a', 0), ('a', 1)]

    Parameters
    ----------
    selector : str, unicode, or sequence
        Selector string (e.g., '/foo[0:2]') or sequence of token sequences
        (e.g., [['foo', (0, 2)]]) to map to `data`.
    portmap : sequence of int
        Integer indices to map to port identifiers. If no map is specified,
        it is assumed to be an array of consecutive integers from 0
        through one less than the number of ports.

    Attributes
    ----------
    index : pandas.MultiIndex
        Index of port identifiers.
    portmap : pandas.Series
        Map of port identifiers to integer indices.

    Notes
    -----
    The selectors may not contain any '*' or '[:]' characters.
    A single port identifier may be mapped to multiple integer indices, 
    but not vice-versa.
    """

    def __init__(self, selector, portmap=None):
        self.sel = SelectorMethods()
        N = self.sel.count_ports(selector)
        if portmap is None:
            self.portmap = pd.Series(data=np.arange(N))
        else:
            assert len(portmap) == N
            self.portmap = pd.Series(data=np.array(portmap))
        self.portmap.index = self.sel.make_index(selector)

    def copy(self):
        """
        Return copy of this port mapper.

        Returns
        -------
        result : neurokernel.plsel.BasePortMapper
            Copy of port mapper instance.
        """

        c = BasePortMapper('')
        c.portmap = self.portmap.copy()
        return c

    @classmethod
    def from_index(cls, idx, portmap=None):
        """
        Create port mapper from a Pandas index and a sequence of integer indices.

        Parameters
        ----------
        index : pandas.MultiIndex
            Index containing selector data.
        portmap : sequence of int
            Integer indices to map to port identifiers. If no map is specified,
            it is assumed to be an array of consecutive integers from 0
            through one less than the number of ports.

        Returns
        -------
        result : neurokernel.plsel.BasePortMapper
            New port mapper instance.

        Notes
        -----
        If specified, the portmap sequence is copied into the new mapper to avoid 
        side effects associated with modifying the specified sequence after
        mapper instantiation.
        """

        pm = cls('')
        N = len(idx)
        if portmap is None:
            pm.portmap = pd.Series.from_array(np.arange(N), idx)
        else:
            assert len(portmap) == N
            pm.portmap = pd.Series.from_array(np.array(portmap), idx)
        return pm

    @classmethod
    def from_pm(cls, pm):
        """
        Create a new port mapper instance given an existing instance.

        Parameters
        ----------
        result : neurokernel.plsel.BasePortMapper
            Existing port mapper instance.

        Returns
        -------
        result : neurokernel.plsel.BasePortMapper
            New port mapper instance.
        """

        assert isinstance(pm, cls)
        r = cls('')
        r.portmap = pm.portmap.copy()
        return r

    @property
    def index(self):
        """
        Port mapper index.
        """
        
        return self.portmap.index
    @index.setter
    def index(self, i):
        self.portmap.index = i

    def inds_to_ports(self, inds):
        """
        Convert list of integer indices to port identifiers.

        Examples
        --------
        >>> pm = BasePortMapper('/[a,b][0:2]')
        >>> print pm.inds_to_ports([0, 1])
        [('a', 0), ('a', 1)]

        Parameters
        ----------
        inds : array_like of int
            Integer indices of ports.

        Returns
        -------
        t : list of tuple
            Expanded port identifiers.
        """

        return self.portmap[self.portmap.isin(inds)].index.tolist()

    def ports_to_inds(self, selector):
        """
        Convert port selector to list of integer indices.

        Examples
        --------
        >>> pm = BasePortMapper('/[a,b][0:2]')
        >>> print pm.ports_to_inds('/b[0:2]')

        Parameters
        ----------
        selector : str, unicode, or sequence
            Selector string (e.g., '/foo[0:2]') or sequence of token sequences
            (e.g., [['foo', (0, 2)]]).

        Returns
        -------
        inds : numpy.ndarray of int
            Integer indices of ports comprised by selector. 
        """

        return self.sel.select(self.portmap,
                    selector).dropna().astype(np.int_).values

    def get_map(self, selector):
        """
        Retrieve integer indices associated with selector.

        Parameters
        ----------
        selector : str, unicode, or sequence
            Selector string (e.g., '/foo[0:2]') or sequence of token sequences
            (e.g., [['foo', (0, 2)]]).

        Returns
        -------
        result : numpy.ndarray
            Selected data.
        """

        return np.asarray(self.sel.select(self.portmap, selector).dropna())

    def set_map(self, selector, portmap):
        """
        Set mapped integer index associated with selector.

        Parameters
        ----------
        selector : str, unicode, or sequence
            Selector string (e.g., '/foo[0:2]') or sequence of token sequences
            (e.g., [['foo', (0, 2)]]).            
        portmap : sequence of int
            Integer indices to map to port identifiers.
        """
        
        self.portmap[self.sel.get_index(self.portmap, selector)] = portmap

    def equals(self, pm):
        """
        Check whether this mapper is equivalent to another mapper.

        Parameters
        ----------
        pm : neurokernel.plsel.BasePortMapper
            Mapper to compare to this mapper.

        Returns
        -------
        result : bool
             True if the specified port mapper contains the same port
             identifiers as this instance and maps them to the same integer
             values.

        Notes
        -----
        The port identifiers and maps in the specified port mapper need not be
        in the same order as this instance to be deemed equal.
        """

        assert isinstance(pm, BasePortMapper)
        pm0 = self.portmap.sort_values()
        pm1 = pm.portmap.sort_values()
        if np.array_equal(pm0.values, pm1.values) and \
           pm0.index.equals(pm1.index):
            return True
        else:
            return False

    def __len__(self):
        return self.portmap.size

    def __repr__(self):
        return 'Map:\n----\n'+self.portmap.__repr__()