Beispiel #1
0
def test3():

    # different size num < den

    # G(z) = 2 / (z - 1) = 2 q /(1 - q)
    num1 = np.array([2])
    den1 = np.array([-1, 1])
    sys = tf.zDTTF(num1, den1)
    num2 = np.array([0, 2])
    den2 = np.array([1, -1])
    assert np.all(sys.num == num2)
    assert np.all(sys.den == den2)
    assert sys.state.size == 1

    # inproper
    # G(z) = z^2 / (z - 1) = 1 /(q - q^2)
    num1 = np.array([0, 0, 1])
    den1 = np.array([-1, 1])
    with pytest.raises(system.SysException):
        sys = tf.zDTTF(num1, den1)

    # G(z) = z^2 / (z - 1) = 1 /(q - q^2)
    num1 = np.array([0, 0, 1])
    den1 = np.array([-1, 1, 0])
    with pytest.raises(system.SysException):
        sys = tf.zDTTF(num1, den1)

    # G(z) = (z + 2)/(z - 1) = (1 + 2 q) / (1 - q)
    num1 = np.array([2, 1])
    den1 = np.array([-1, 1])
    sys = tf.zDTTF(num1, den1)
    num2 = np.array([1, 2])
    den2 = np.array([1, -1])
    assert np.all(sys.num == num2)
    assert np.all(sys.den == den2)
    assert sys.state.size == 1

    # G(z) = (z + 2)/(z - 1) = (z - 1 + 3)/(z-1) = 1 + 3/(z-1)
    sysss = sys.as_DTSS()
    A = np.array([1])
    B = np.array([1])
    C = np.array([3])
    D = np.array([1])
    assert np.all(A == sysss.A)
    assert np.all(B == sysss.B)
    assert np.all(C == sysss.C)
    assert np.all(D == sysss.D)

    y1 = sys.update(1)
    y2 = sysss.update(1)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(-1)
    y2 = sysss.update(-1)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(3)
    y2 = sysss.update(3)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(0)
    y2 = sysss.update(0)
    assert y1 == y2
    #print(y1, y2)

    # G(z) = z/(z - 1) = 1 / (1 - q)
    num1 = np.array([0, 1])
    den1 = np.array([-1, 1])
    sys = tf.zDTTF(num1, den1)
    num2 = np.array([1, 0])
    den2 = np.array([1, -1])
    assert np.all(sys.num == num2)
    assert np.all(sys.den == den2)

    # G(z) = z/(z - 1) = (z - 1 + 1)/(z-1) = 1 + 1/(z-1)
    sysss = sys.as_DTSS()
    A = np.array([1])
    B = np.array([1])
    C = np.array([1])
    D = np.array([1])
    assert np.all(A == sysss.A)
    assert np.all(B == sysss.B)
    assert np.all(C == sysss.C)
    assert np.all(D == sysss.D)

    y1 = sys.update(1)
    y2 = sysss.update(1)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(-1)
    y2 = sysss.update(-1)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(3)
    y2 = sysss.update(3)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(0)
    y2 = sysss.update(0)
    assert y1 == y2
    #print(y1, y2)

    # G(z) = 2/(z - 1)
    num1 = np.array([2, 0])
    den1 = np.array([-1, 1])
    sys = tf.zDTTF(num1, den1)
    num2 = np.array([0, 2])
    den2 = np.array([1, -1])
    assert np.all(sys.num == num2)
    assert np.all(sys.den == den2)

    sysss = sys.as_DTSS()
    A = np.array([1])
    B = np.array([1])
    C = np.array([2])
    D = np.array([0])
    assert np.all(A == sysss.A)
    assert np.all(B == sysss.B)
    assert np.all(C == sysss.C)
    assert np.all(D == sysss.D)
    #print(sysss.A, sysss.B, sysss.C, sysss.D)

    y1 = sys.update(1)
    y2 = sysss.update(1)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(-1)
    y2 = sysss.update(-1)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(3)
    y2 = sysss.update(3)
    assert y1 == y2
    #print(y1, y2)

    y1 = sys.update(0)
    y2 = sysss.update(0)
    assert y1 == y2
    #print(y1, y2)

    # G(z) = z^2/(z - 1) = 1 / (1 - q)
    num1 = np.array([1, 0, 0])
    den1 = np.array([-1, 1])
    with pytest.raises(system.SysException):
        sys = tf.zDTTF(num1, den1)

    # G(z) = (z + 3)/(z^2 + 2 z - 1) = (q + 3 q^2)/(1 + 2 q - q^2)
    num1 = np.array([3, 1, 0])
    den1 = np.array([-1, 2, 1])
    sys = tf.zDTTF(num1, den1)
    num2 = np.array([0, 1, 3])
    den2 = np.array([1, 2, -1])
    assert np.all(sys.num == num2)
    assert np.all(sys.den == den2)

    sysss = sys.as_DTSS()
    A = np.array([[0,1],[1,-2]])
    B = np.array([[0],[1]])
    C = np.array([[3,1]])
    D = np.array([[0]])
    assert np.all(A == sysss.A)
    assert np.all(B == sysss.B)
    assert np.all(C == sysss.C)
    assert np.all(D == sysss.D)
    #print('A =\n{}\nB =\n{}\nC =\n{}\nD =\n{}'.format(sysss.A, sysss.B, sysss.C, sysss.D))

    # yk = -2 yk-1 + yk-2 + uk-1 + 3 uk-2
    # u1 = 1   =>  y1 = 0
    # u1 = 1   =>  y1 = [3 1] [0; 0] = 0
    #              x2 = [0 1; 1 -2] [0; 0] + [0; 1] 1 = [0; 1]

    y1 = sys.update(1)
    y2 = sysss.update(np.array([1]))
    #print(y1, y2)
    assert y1 == 0 
    assert np.all(sysss.state == np.array([0,1]))
    assert y1 == y2

    # u2 = -1  =>  y2 = -2 y1 + u1 = 1
    # u2 = -1  =>  y2 = [3 1] [0; 1] = 1
    #              x3 = [0 1; 1 -2] [0; 1] + [0; 1] -1 
    #                 = [1; -2] + [0; -1] = [1; -3]

    y1 = sys.update(-1)
    y2 = sysss.update(np.array([-1]))
    #print(y1, y2)
    assert y1 == 1 
    assert np.all(sysss.state == np.array([1,-3]))
    assert y1 == y2

    # u3 = 3   =>  y3 = -2 y2 + y1 + u2 + 3 u1 = -2 + 0 + -1 + 3 = 0
    # u3 = 3   =>  y3 = [3 1] [1; -3] = 0
    #              x4 = [0 1; 1 -2] [1; -3] + [0; 1] 3 
    #                 = [-3; 7] + [0; 3] = [-3; 10]

    y1 = sys.update(3)
    y2 = sysss.update(np.array([3]))
    #print(y1, y2)
    assert y1 == 0 
    assert np.all(sysss.state == np.array([-3,10]))
    assert y1 == y2

    # u4 = 0   =>  y4 = -2 y3 + y2 + u3 + 3 u2 = 0 + 1 + 3 - 3 = 1
    # u4 = 0   =>  y4 = [3 1] [-3; 10] = 1
    #              x5 = [0 1; 1 -2] [-3; 10] + [0; 1] 0 
    #                 = [10; -23]

    y1 = sys.update(0)
    y2 = sysss.update(np.array([0]))
    #print(y1, y2)
    assert y1 == 1
    assert np.all(sysss.state == np.array([10,-23]))
    assert y1 == y2

    # G(z) = z^2/(z^2 + 2 z - 1) = 1 + (1 - 2 z)/(z^2 + 2 z - 1)
    num1 = np.array([0, 0, 1])
    den1 = np.array([-1, 2, 1])
    sys = tf.zDTTF(num1, den1)
    num2 = np.array([1, 0, 0])
    den2 = np.array([1, 2, -1])
    assert np.all(sys.num == num2)
    assert np.all(sys.den == den2)

    sysss = sys.as_DTSS()
    A = np.array([[0,1],[1, -2]])
    B = np.array([[0],[1]])
    C = np.array([[1,-2]])
    D = np.array([[1]])
    assert np.all(A == sysss.A)
    assert np.all(B == sysss.B)
    assert np.all(C == sysss.C)
    assert np.all(D == sysss.D)
    #print('A =\n{}\nB =\n{}\nC =\n{}\nD =\n{}'.format(sysss.A, sysss.B, sysss.C, sysss.D))

    # yk = -2 yk-1 + yk-2 + uk
    # u1 = 1   =>  y1 = 1
    # u1 = 1   =>  y1 = [1 -2] [0; 0] + [1] 1 = 1
    #              x2 = [0 1; 1 -2] [0; 0] + [0; 1] 1 = [0; 1]

    y1 = sys.update(1)
    y2 = sysss.update(np.array([1]))
    #print(y1, y2)
    assert y1 == 1 
    assert np.all(sysss.state == np.array([0,1]))
    assert y1 == y2

    # u2 = -1  =>  y2 = -2 y1 + u2 = -2 - 1 = -3
    # u2 = -1  =>  y2 = [1 -2] [0; 1] + [1] -1 = -2 -1 = -3
    #              x3 = [0 1; 1 -2] [0; 1] + [0; 1] -1 
    #                 = [1; -2] + [0; -1] = [1; -3]

    y1 = sys.update(-1)
    y2 = sysss.update(np.array([-1]))
    #print(y1, y2)
    assert y1 == -3 
    assert np.all(sysss.state == np.array([1,-3]))
    assert y1 == y2

    # u3 = 3   =>  y3 = -2 y2 + y1 + u3 = 6 + 1 + 3 = 10
    # u3 = 3   =>  y3 = [1 -2] [1; -3] + [1] 3 = 1 + 6 + 3 = 10
    #              x4 = [0 1; 1 -2] [1; -3] + [0; 1] 3 
    #                 = [-3; 7] + [0; 3] = [-3; 10]

    y1 = sys.update(3)
    y2 = sysss.update([3])
    #print(y1, y2)
    assert y1 == 10 
    assert np.all(sysss.state == np.array([-3,10]))
    assert y1 == y2

    # u4 = 0   =>  y4 = -2 y3 + y2 + u4 = - 20 - 3 + 0 = -23
    # u4 = 0   =>  y4 = [1 -2] [-3; 10] + [1] 0 = -3 -20 = -23
    #              x5 = [0 1; 1 -2] [-3; 10] + [0; 1] 0 
    #                 = [10; -23]

    y1 = sys.update(0)
    y2 = sysss.update([0])
    #print(y1, y2)
    assert y1 == -23
    assert np.all(sysss.state == np.array([10,-23]))
    assert y1 == y2

    # vector input/output

    sysss = sys.as_DTSS()
    A = np.array([[0,1],[1, -2]])
    B = np.array([[0],[1]])
    C = np.array([[1,-2]])
    D = np.array([[1]])
    assert np.all(A == sysss.A)
    assert np.all(B == sysss.B)
    assert np.all(C == sysss.C)
    assert np.all(D == sysss.D)
    #print('A =\n{}\nB =\n{}\nC =\n{}\nD =\n{}'.format(sysss.A, sysss.B, sysss.C, sysss.D))

    # u1 = 1   =>  y1 = 1

    y2 = sysss.update(np.array([1]))
    assert isinstance(y2, np.ndarray) and y2 == 1 

    # u2 = -1  =>  y2 = -2 y1 + u2 = -2 - 1 = -3

    y2 = sysss.update([-1])
    assert isinstance(y2, np.ndarray) and y2 == -3 

    # u3 = 3   =>  y3 = -2 y2 + y1 + u3 = 6 + 1 + 3 = 10

    y2 = sysss.update(np.array([3]))
    assert isinstance(y2, np.ndarray) and y2 == 10 

    # u4 = 0   =>  y4 = -2 y3 + y2 + u4 = - 20 - 3 + 0 = -23

    y2 = sysss.update([0])
    assert isinstance(y2, np.ndarray) and y2 == -23

    # SIMO
    A = np.array([[0,1],[1, -2]])
    B = np.array([[0],[1]])
    C = np.array([[1,-2],[0,1]])
    D = np.array([[1],[0]])
    sys = ss.DTSS(A, B, C, D)
    assert np.all(sys.A == A)
    assert np.all(sys.B == B)
    assert np.all(sys.C == C)
    assert np.all(sys.D == D)
    assert np.all(sys.state == np.zeros(2))

    # u1 = 1   =>  y1 = 1

    y2 = sys.update(np.array([1]))
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([1,0]))

    # u2 = -1  =>  y2 = -2 y1 + u2 = -2 - 1 = -3

    y2 = sys.update([-1])
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([-3,1]))

    # u3 = 3   =>  y3 = -2 y2 + y1 + u3 = 6 + 1 + 3 = 10

    y2 = sys.update(np.array([3]))
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([10,-3]))

    # u4 = 0   =>  y4 = -2 y3 + y2 + u4 = - 20 - 3 + 0 = -23

    y2 = sys.update([0])
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([-23,10]))

    # MIMO
    A = np.array([[0,1],[1, -2]])
    B = np.array([[1,-1],[1,0]])
    C = np.array([[1,-2],[0,1]])
    D = np.array([[1,0],[-1,1]])
    sys = ss.DTSS(A, B, C, D)
    assert np.all(sys.A == A)
    assert np.all(sys.B == B)
    assert np.all(sys.C == C)
    assert np.all(sys.D == D)
    assert np.all(sys.state == np.zeros(2))

    # u1 = 1   =>  y1 = 1

    y2 = sys.update(np.array([1,1]))
    assert np.all(sys.state == np.array([0,1]))
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([1,0]))

    # u2 = -1  =>  y2 = -2 y1 + u2 = -2 - 1 = -3

    y2 = sys.update(np.array([-1,0]))
    assert np.all(sys.state == np.array([0,-3]))
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([-3,2]))

    # u3 = 3   =>  y3 = -2 y2 + y1 + u3 = 6 + 1 + 3 = 10

    y2 = sys.update(np.array([3,-1]))
    assert np.all(sys.state == np.array([1,9]))
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([9,-7]))

    # u4 = 0   =>  y4 = -2 y3 + y2 + u4 = - 20 - 3 + 0 = -23

    y2 = sys.update(np.array([2,1]))
    assert np.all(sys.state == np.array([10,-15]))
    assert isinstance(y2, np.ndarray) and np.all(y2 == np.array([-15,8]))
Beispiel #2
0
def test1():

    signals = {"clock": 1, "encoder1": 2, "test": 3}
    labels = ["clock", "encoder1"]

    # Transfer-function

    num = np.array([1, 1, 3])
    den = np.array([1, -1])
    sys = tf.DTTF(num, den)
    assert np.all(sys.num == num)
    den = np.array([1, -1, 0])
    assert np.all(sys.den == den)
    assert np.all(sys.state == np.zeros(2))

    blk = linear.SISO(sys)
    assert blk.model is sys

    with pytest.raises(block.BlockException):
        blk = linear.SISO(modelo=sys)

    blk.write([1])
    (yk,) = blk.read()
    state = np.array([1, 0])
    assert np.all(sys.state == state)
    assert yk == 1

    blk.write([-1])
    (yk,) = blk.read()
    state = np.array([0, 1])
    assert np.all(sys.state == state)
    assert yk == 1

    blk.write([2])
    (yk,) = blk.read()
    state = np.array([2, 0])
    assert np.all(sys.state == state)
    assert yk == 5

    blk.write([1])
    (yk,) = blk.read()
    state = np.array([3, 2])
    assert np.all(sys.state == state)
    assert yk == 5

    blk.reset()
    yk = sys.update(0)
    assert yk == 0

    num = np.array([1, 1])
    den = np.array([1, -1])
    sys2 = tf.DTTF(num, den)

    blk = linear.SISO(sys)
    blk.set(model=sys2)
    assert blk.model is sys2

    # State space

    A = np.array([[0, 1], [1, -2]])
    B = np.array([[0], [1]])
    C = np.array([[1, -2], [0, 1]])
    D = np.array([[1], [0]])
    sys = ss.DTSS(A, B, C, D)
    assert np.all(sys.A == A)
    assert np.all(sys.B == B)
    assert np.all(sys.C == C)
    assert np.all(sys.D == D)
    assert np.all(sys.state == np.zeros(2))

    blk = linear.MIMO(sys)
    assert blk.model is sys

    with pytest.raises(block.BlockException):
        blk = linear.MIMO(modelo=sys)

    blk.write([1])
    yk = blk.read()
    state = np.array([0, 1])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([1, 0]))

    blk.write([-1])
    yk = blk.read()
    state = np.array([1, -3])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([-3, 1]))

    blk.write([3])
    yk = blk.read()
    state = np.array([-3, 10])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([10, -3]))

    blk.write([0])
    yk = blk.read()
    state = np.array([10, -23])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([-23, 10]))

    blk.reset()
    assert np.all(sys.state == [0, 0])

    # SIMO

    A = np.array([[0, 1], [1, -2]])
    B = np.array([[0], [1]])
    C = np.array([[1, -2], [0, 1]])
    D = np.array([[1], [0]])
    sys = ss.DTSS(A, B, C, D)
    assert np.all(sys.A == A)
    assert np.all(sys.B == B)
    assert np.all(sys.C == C)
    assert np.all(sys.D == D)
    assert np.all(sys.state == np.zeros(2))

    blk = linear.MIMO(sys)
    assert blk.model is sys

    with pytest.raises(block.BlockException):
        blk = linear.MIMO(modelo=sys)

    blk.write(1)
    yk = blk.read()
    state = np.array([0, 1])
    # print(sys.state)
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([1, 0]))

    blk.write([-1])
    yk = blk.read()
    state = np.array([1, -3])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([-3, 1]))

    blk.write(3)
    yk = blk.read()
    state = np.array([-3, 10])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([10, -3]))

    blk.write([0])
    yk = blk.read()
    state = np.array([10, -23])
    assert np.all(sys.state == state)
    assert np.all(yk == np.array([-23, 10]))

    blk.reset()
    assert np.all(sys.state == [0, 0])

    # MIMO
    A = np.array([[0, 1], [1, -2]])
    B = np.array([[1, -1], [1, 0]])
    C = np.array([[1, -2], [0, 1]])
    D = np.array([[1, 0], [-1, 1]])
    sys = ss.DTSS(A, B, C, D)
    assert np.all(sys.A == A)
    assert np.all(sys.B == B)
    assert np.all(sys.C == C)
    assert np.all(sys.D == D)
    assert np.all(sys.state == np.zeros(2))

    blk = linear.MIMO(sys)
    assert blk.model is sys

    # u1 = 1   =>  y1 = 1

    blk.write([1, 1])
    y2 = blk.read()
    assert np.all(sys.state == np.array([0, 1]))
    assert np.all(y2 == np.array([1, 0]))

    # u2 = -1  =>  y2 = -2 y1 + u2 = -2 - 1 = -3

    blk.write([-1, 0])
    y2 = blk.read()
    assert np.all(sys.state == np.array([0, -3]))
    assert np.all(y2 == np.array([-3, 2]))

    # u3 = 3   =>  y3 = -2 y2 + y1 + u3 = 6 + 1 + 3 = 10

    blk.write([3, -1])
    y2 = blk.read()
    assert np.all(sys.state == np.array([1, 9]))
    assert np.all(y2 == np.array([9, -7]))

    # u4 = 0   =>  y4 = -2 y3 + y2 + u4 = - 20 - 3 + 0 = -23

    blk.write([2, 1])
    y2 = blk.read()
    assert np.all(sys.state == np.array([10, -15]))
    assert np.all(y2 == np.array([-15, 8]))

    # Test to work with multiple signals

    # reset state
    blk.reset()

    # u1 = 1   =>  y1 = 1

    blk.write(1, 1)
    y2 = blk.read()
    assert np.all(sys.state == np.array([0, 1]))
    assert np.all(y2 == np.array([1, 0]))

    # u2 = -1  =>  y2 = -2 y1 + u2 = -2 - 1 = -3

    blk.write(-1, 0)
    y2 = blk.read()
    assert np.all(sys.state == np.array([0, -3]))
    assert np.all(y2 == np.array([-3, 2]))

    # u3 = 3   =>  y3 = -2 y2 + y1 + u3 = 6 + 1 + 3 = 10

    blk.write(3, -1)
    y2 = blk.read()
    assert np.all(sys.state == np.array([1, 9]))
    assert np.all(y2 == np.array([9, -7]))

    # u4 = 0   =>  y4 = -2 y3 + y2 + u4 = - 20 - 3 + 0 = -23

    blk.write(2, 1)
    y2 = blk.read()
    assert np.all(sys.state == np.array([10, -15]))
    assert np.all(y2 == np.array([-15, 8]))

    # Gain

    blk = linear.Gain()
    assert blk.gain == 1

    blk = linear.Gain(-1)
    assert blk.gain == -1

    blk = linear.Gain(gain=3)
    assert blk.gain == 3

    blk = linear.Gain(-1.2)
    assert blk.gain == -1.2

    with pytest.raises(AssertionError):
        blk = linear.Gain("asd")

    with pytest.raises(AssertionError):
        blk = linear.Gain((1, 2))

    blk = linear.Gain(-5.2)
    blk.write(np.array([2]))
    (yk,) = blk.read()
    assert yk == -10.4

    blk = linear.Gain(3)
    blk.write(2, 4)
    yk = blk.read()
    assert yk == (6, 12)

    blk.write(np.array([2, 4]))
    (yk,) = blk.read()
    assert np.all(yk == [6, 12])

    blk.write(2, np.array([4, 2]))
    yk = blk.read()
    assert yk[0] == 6 and np.all(yk[1] == np.array([12, 6]))

    blk.set(gain=8)
    assert blk.gain == 8

    # Short-Circuit

    blk = linear.ShortCircuit()

    with pytest.raises(block.BlockException):
        blk = linear.ShortCircuit("asd")

    blk.write(2)
    (yk,) = blk.read()
    assert yk == 2

    blk.write(2, 4)
    yk = blk.read()
    assert yk == (2, 4)

    blk.write(np.array([2, 4]))
    (yk,) = blk.read()
    assert np.all(yk == [2, 4])

    blk.write(np.array([2, 4]), -1)
    yk = blk.read()
    assert np.all(yk[0] == [2, 4]) and yk[1] == -1

    # Differentiator

    signals = {"clock": 1, "encoder1": 5, "test": 0}
    labels = ["clock", "test"]

    diff = linear.Differentiator()
    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result == ([0])

    signals = {"clock": 2, "encoder1": 5, "test": 3}

    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result == ([3])

    signals = {"clock": 4, "encoder1": 6, "test": 0}

    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result == ([-1.5])

    signals = {"clock": 1, "encoder1": 5, "test": 0}
    labels = ["clock", "test", "encoder1"]

    diff = linear.Differentiator()
    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result == ([0, 0])

    signals = {"clock": 2, "encoder1": 5, "test": 3}

    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result == ([3, 0])

    signals = {"clock": 4, "encoder1": 6, "test": 0}

    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result == ([-1.5, 0.5])

    signals = {"clock": 1, "encoder1": 5, "test": np.array([0, 1])}
    labels = ["clock", "test", "encoder1"]

    diff = linear.Differentiator()
    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result[1] == 0 and np.all(result[0] == np.array([0, 0]))

    signals = {"clock": 2, "encoder1": 5, "test": np.array([3, 2])}

    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result[1] == 0 and np.all(result[0] == np.array([3, 1]))

    signals = {"clock": 4, "encoder1": 6, "test": np.array([0, -1])}

    diff.write(*[signals[label] for label in labels])
    result = diff.read()
    assert result[1] == 0.5 and np.all(result[0] == np.array([-1.5, -1.5]))

    with pytest.raises(block.BlockException):
        blk.set(time=8)

    with pytest.raises(block.BlockException):
        blk.set(last=8)

    # Feedback

    blk1 = linear.Gain(2)
    blk = linear.Feedback(blk1)
    assert blk.block is blk1
    assert blk.gamma == 1.0

    blk = linear.Feedback(block=blk1)
    assert blk.block is blk1
    assert blk.gamma == 1.0

    blk = linear.Feedback(block=blk1, gamma=4)
    assert blk.block is blk1
    assert blk.gamma == 4

    blk.write(2, 3)
    (yk,) = blk.read()
    assert yk == 2 * (3 * 4 - 2)

    gn = linear.Gain(150)
    blk.set(block=gn)
    assert blk.block is gn

    blk.set(gamma=10)
    assert blk.gamma == 10

    # Feedback with transfer-function
    #
    # G(z) = -.5/(z - .5)

    # TODO: CHECK DIFFERENT SIZES NUM/DEN
    blk1 = linear.SISO(tf.zDTTF([-0.5, 0], [-0.5, 1]))
    blktf = linear.Feedback(blk1)
    assert blktf.block is blk1

    # A = .5, B = 1, C = -.5, D = 0
    #
    # u = C x + D (- y + r)
    # x = A x + B (- y + r)

    A = np.array([[0.5]])
    B = np.array([[-1, 1]])
    C = np.array([[-0.5]])
    D = np.array([[0, 0]])
    blkss = linear.MIMO(ss.DTSS(A, B, C, D))

    blktf.write(1, 3)
    yk1 = list(blktf.read())

    blkss.write([1, 3])
    yk2 = blkss.read()

    assert np.all(np.array(yk1) == yk2)

    blktf.write(-1, 3)
    yk1 = list(blktf.read())

    blkss.write([-1, 3])
    yk2 = blkss.read()

    assert np.all(np.array(yk1) == yk2)

    blktf.write(-1, 3)
    yk1 = list(blktf.read())

    blkss.write([-1, 3])
    yk2 = blkss.read()

    assert np.all(np.array(yk1) == yk2)

    # Reset feedback
    assert blktf.block.model.state == (6.5,)

    blktf.reset()
    assert blktf.block.model.state == (0,)

    # Sum
    blk = linear.Sum()

    blk.write(1)
    (yk,) = blk.read()
    assert yk == 1

    blk.write()
    (yk,) = blk.read()
    assert yk == 0

    blk.write(1, 2)
    (yk,) = blk.read()
    assert yk == 3

    blk.write(1, 0.4)
    (yk,) = blk.read()
    assert yk == 1.4

    blk.write([1, 0.4])
    (yk,) = blk.read()
    assert np.all(yk == [1, 0.4])