Generate dipole-dipole configurations

        Parameters
        ----------
        skipc: int
            number of electrode positions that are skipped between electrodes
            of a given dipole
        skipv: int
            steplength between subsequent voltage dipoles. A steplength of 0
            will produce increments by one, i.e., 3-4, 4-5, 5-6 ...
        stepc: int
            steplength between subsequent current dipoles. A steplength of 0
            will produce increments by one, i.e., 3-4, 4-5, 5-6 ...
        stepv: int
            steplength between subsequent voltage dipoles. A steplength of 0
            will produce increments by one, i.e., 3-4, 4-5, 5-6 ...
        nr_voltage_dipoles: int
            the number of voltage dipoles to generate for each current
            injection dipole
        before_current: bool, optional
            if set to True, also generate voltage dipoles in front of current
            dipoles.
        start_skip: int, optional
            how many electrode to skip before/after the first/second current
            electrode.
        N: int, optional
            number of electrodes, must be given if not already known by the
            config instance

        Examples
        --------

        >>> from reda.configs.configManager import ConfigManager
        >>> config = ConfigManager(nr_of_electrodes=10)
        >>> config.gen_dipole_dipole(skipc=2)
        array([[ 1,  4,  5,  8],
               [ 1,  4,  6,  9],
               [ 1,  4,  7, 10],
               [ 2,  5,  6,  9],
               [ 2,  5,  7, 10],
               [ 3,  6,  7, 10]])

def gen_dipole_dipole(self,
                          skipc,
                          skipv=None,
                          stepc=1,
                          stepv=1,
                          nr_voltage_dipoles=10,
                          before_current=False,
                          start_skip=0,
                          N=None):
        """Generate dipole-dipole configurations

        Parameters
        ----------
        skipc: int
            number of electrode positions that are skipped between electrodes
            of a given dipole
        skipv: int
            steplength between subsequent voltage dipoles. A steplength of 0
            will produce increments by one, i.e., 3-4, 4-5, 5-6 ...
        stepc: int
            steplength between subsequent current dipoles. A steplength of 0
            will produce increments by one, i.e., 3-4, 4-5, 5-6 ...
        stepv: int
            steplength between subsequent voltage dipoles. A steplength of 0
            will produce increments by one, i.e., 3-4, 4-5, 5-6 ...
        nr_voltage_dipoles: int
            the number of voltage dipoles to generate for each current
            injection dipole
        before_current: bool, optional
            if set to True, also generate voltage dipoles in front of current
            dipoles.
        start_skip: int, optional
            how many electrode to skip before/after the first/second current
            electrode.
        N: int, optional
            number of electrodes, must be given if not already known by the
            config instance

        Examples
        --------

        >>> from reda.configs.configManager import ConfigManager
        >>> config = ConfigManager(nr_of_electrodes=10)
        >>> config.gen_dipole_dipole(skipc=2)
        array([[ 1,  4,  5,  8],
               [ 1,  4,  6,  9],
               [ 1,  4,  7, 10],
               [ 2,  5,  6,  9],
               [ 2,  5,  7, 10],
               [ 3,  6,  7, 10]])


        """
        if N is None and self.nr_electrodes is None:
            raise Exception('You must provide the number of electrodes')
        elif N is None:
            N = self.nr_electrodes

        # by default, current voltage dipoles have the same size
        if skipv is None:
            skipv = skipc

        configs = []
        # current dipoles
        for a in range(0, N - skipv - skipc - 3, stepc):
            b = a + skipc + 1
            nr = 0
            # potential dipoles before current injection
            if before_current:
                for n in range(a - start_skip - 1, -1, -stepv):
                    nr += 1
                    if nr > nr_voltage_dipoles:
                        continue
                    m = n - skipv - 1
                    if m < 0:
                        continue
                    quadpole = np.array((a, b, m, n)) + 1
                    configs.append(quadpole)

            # potential dipoles after current injection
            nr = 0
            for m in range(b + start_skip + 1, N - skipv - 1, stepv):
                nr += 1
                if nr > nr_voltage_dipoles:
                    continue
                n = m + skipv + 1
                quadpole = np.array((a, b, m, n)) + 1
                configs.append(quadpole)

        configs = np.array(configs)
        # now add to the instance
        if self.configs is None:
            self.configs = configs
        else:
            self.configs = np.vstack((self.configs, configs))
        return configs