'The inner product operator for a Dyadic and a Dyadic or Vector.
Parameters
other : Dyadic or Vector
The other Dyadic or Vector to take the inner product with
Examples
>>> from sympy.physics.vector import ReferenceFrame, outer
>>> N = ReferenceFrame(\'N\')
>>> D1 = outer(N.x, N.y)
>>> D2 = outer(N.y, N.y)
>>> D1.dot(D2)
(N.x|N.y)
>>> D1.dot(N.y)
N.x'

def __and__(self, other):

    from sympy.physics.vector.vector import Vector, _check_vector
    if isinstance(other, Dyadic):
        other = _check_dyadic(other)
        ol = Dyadic(0)
        for (i, v) in enumerate(self.args):
            for (i2, v2) in enumerate(other.args):
                ol += (((v[0] * v2[0]) * (v[2] & v2[1])) * (v[1] | v2[2]))
    else:
        other = _check_vector(other)
        ol = Vector(0)
        for (i, v) in enumerate(self.args):
            ol += ((v[0] * v[1]) * (v[2] & other))
    return ol
