def __init__(self, kernels, name, extra_dims=[], link_parameters=True):
assert all([isinstance(k, Kern) for k in kernels])<EOL>extra_dims = np.asarray(extra_dims, dtype=int)<EOL>active_dims = reduce(np.union1d, (np.r_[x.active_dims] for x in kernels), extra_dims)<EOL>input_dim = active_dims.size<EOL>super(CombinationKernel, self).__init__(input_dim, active_dims, name)<EOL>effective_input_dim = reduce(max, (k._all_dims_active.max() for k in kernels)) + <NUM_LIT:1><EOL>self._all_dims_active = np.array(np.concatenate((np.arange(effective_input_dim), extra_dims if extra_dims is not None else [])), dtype=int)<EOL>self.extra_dims = extra_dims<EOL>if link_parameters:<EOL><INDENT>self.link_parameters(*kernels)<EOL><DEDENT>
Abstract super class for combination kernels.
A combination kernel combines (a list of) kernels and works on those.
Examples are the HierarchicalKernel or Add and Prod kernels.

:param list kernels: List of kernels to combine (can be only one element)
:param str name: name of the combination kernel
:param array-like extra_dims: if needed extra dimensions for the combination kernel to work on