示例#1
0
def test_different_bad_design_matrix():
    iv_names = ('a', 'b', 'c')
    iv_values = [[1, 2], [1, 2, 3], [1, 2]]
    matrix = np.array([[-1., -1.,  1.], [1., -1., -1.], [-1.,  1., -1.], [1.,  1.,  1.]])  # pyDOE.fracfact('a b ab')
    d = Design(ivs=zip(iv_names, iv_values), design_matrix=matrix)
    with pytest.raises(ValueError):
        d.first_pass()
示例#2
0
def test_factorial():
    iv_names = ("a", "b")
    iv_values = [[1, 2, 3], [1, 2]]
    conditions = [
        {"a": 1, "b": 1},
        {"a": 1, "b": 2},
        {"a": 2, "b": 1},
        {"a": 2, "b": 2},
        {"a": 3, "b": 1},
        {"a": 3, "b": 2},
    ]
    assert list(Design.full_cross(iv_names, iv_values)) == conditions
    d = Design(zip(iv_names, iv_values))
    d.first_pass()
    for _ in range(3):
        yield check_sequences, d.get_order(), conditions

    iv_names = ("a", "b", "c")
    iv_values = [[1, 2], [1, 2], [1, 2]]
    conditions = [
        {"a": 1, "b": 1, "c": 1},
        {"a": 1, "b": 1, "c": 2},
        {"a": 1, "b": 2, "c": 1},
        {"a": 1, "b": 2, "c": 2},
        {"a": 2, "b": 1, "c": 1},
        {"a": 2, "b": 1, "c": 2},
        {"a": 2, "b": 2, "c": 1},
        {"a": 2, "b": 2, "c": 2},
    ]
    assert list(Design.full_cross(iv_names, iv_values)) == conditions
    d = Design(zip(iv_names, iv_values))
    d.first_pass()
    for _ in range(3):
        yield check_sequences, d.get_order(), conditions
示例#3
0
def test_factorial():
    iv_names = ('a', 'b')
    iv_values = [[1, 2, 3], [1, 2]]
    conditions = [
        {'a': 1, 'b': 1},
        {'a': 1, 'b': 2},
        {'a': 2, 'b': 1},
        {'a': 2, 'b': 2},
        {'a': 3, 'b': 1},
        {'a': 3, 'b': 2},
    ]
    assert list(Design.full_cross(iv_names, iv_values)) == conditions
    d = Design(zip(iv_names, iv_values))
    d.first_pass()
    for _ in range(3):
        yield check_sequences, d.get_order(), conditions

    iv_names = ('a', 'b', 'c')
    iv_values = [[1, 2], [1, 2], [1, 2]]
    conditions = [
        {'a': 1, 'b': 1, 'c': 1},
        {'a': 1, 'b': 1, 'c': 2},
        {'a': 1, 'b': 2, 'c': 1},
        {'a': 1, 'b': 2, 'c': 2},
        {'a': 2, 'b': 1, 'c': 1},
        {'a': 2, 'b': 1, 'c': 2},
        {'a': 2, 'b': 2, 'c': 1},
        {'a': 2, 'b': 2, 'c': 2},
    ]
    assert list(Design.full_cross(iv_names, iv_values)) == conditions
    d = Design(zip(iv_names, iv_values))
    d.first_pass()
    for _ in range(3):
        yield check_sequences, d.get_order(), conditions
示例#4
0
def test_design_matrix_with_continuous_iv():
    matrix = np.array(
        [
            [-1, -1],
            [1, -1],
            [-1, 1],
            [1, 1],
            [0, 0],
            [0, 0],
            [0, 0],
            [0, 0],
            [-1.41421356, 0],
            [1.41421356, 0],
            [0, -1.41421356],
            [0, 1.41421356],
            [0, 0],
            [0, 0],
            [0, 0],
            [0, 0],
        ]
    )  # pyDOE.ccdesign(2)
    iv_names = ["a", "b"]
    iv_values = [None, None]
    d = Design(zip(iv_names, iv_values), design_matrix=matrix)
    d.first_pass()
    for _ in range(3):
        yield check_design_matrix, d.get_order(), iv_names, iv_values, matrix
示例#5
0
def test_design_from_spec():
    spec = {
        'name': 'test1',
        'order': 'Shuffle',
        'n': 2,
        'ivs': {'a': [True, False], 'b': [1, 2, 3]},
    }
    assert Design.from_dict(spec) == ('test1', Design({'a': [True, False], 'b': [1, 2, 3]}, ordering=Shuffle(2)))

    spec = {
        'name': 'test2',
        'some_extra_field': ['blah'],
        'number': 3,
    }
    assert Design.from_dict(spec) == ('test2', Design(extra_data={'some_extra_field': ['blah']}, ordering=Shuffle(3)))

    spec = {
        'name': 'test3',
        'ordering': {
            'class': 'Sorted',
            'order': 'ascending',
        },
        'ivs': {'a': [1, 2, 3]},
    }
    assert Design.from_dict(spec) == ('test3', Design(ivs={'a': [1, 2, 3]}, ordering=Sorted(order='ascending')))

    spec = {
        'name': 'test4',
        'order': ['CompleteCounterbalance', 3],
    }
    assert Design.from_dict(spec) == ('test4', Design(ordering=CompleteCounterbalance(3)))

    spec.pop('name')
    assert Design.from_dict(spec) == Design(ordering=CompleteCounterbalance(3))
def test_different_bad_design_matrix():
    iv_names = ('a', 'b', 'c')
    iv_values = [[1, 2], [1, 2, 3], [1, 2]]
    matrix = np.array([[-1., -1., 1.], [1., -1., -1.], [-1., 1., -1.],
                       [1., 1., 1.]])  # pyDOE.fracfact('a b ab')
    d = Design(ivs=zip(iv_names, iv_values), design_matrix=matrix)
    with pytest.raises(ValueError):
        d.first_pass()
示例#7
0
def make_manual_exp():
    tree = DesignTree.new([('participant', [Design(ordering=Shuffle(2))]),
                           ('block', [Design(ivs={'b': [0, 1, 2]}, ordering=CompleteCounterbalance())]),
                           ('trial', [Design({'a': [False, True]}, ordering=Shuffle(4))]),
                           ])
    exp = Experiment.new(tree)
    exp.add_callback('trial', trial)
    return exp
def test_design_matrix_with_continuous_iv():
    matrix = np.array([[-1, -1], [1, -1], [-1, 1], [1, 1], [0, 0], [0, 0],
                       [0, 0], [0, 0], [-1.41421356, 0], [1.41421356, 0],
                       [0, -1.41421356], [0, 1.41421356], [0, 0], [0, 0],
                       [0, 0], [0, 0]])  # pyDOE.ccdesign(2)
    iv_names = ['a', 'b']
    iv_values = [None, None]
    d = Design(zip(iv_names, iv_values), design_matrix=matrix)
    d.first_pass()
    for _ in range(3):
        yield check_design_matrix, d.get_order(), iv_names, iv_values, matrix
def test_design_from_spec():
    spec = {
        'name': 'test1',
        'order': 'Shuffle',
        'n': 2,
        'ivs': {
            'a': [True, False],
            'b': [1, 2, 3]
        },
    }
    assert Design.from_dict(spec) == ('test1',
                                      Design(
                                          {
                                              'a': [True, False],
                                              'b': [1, 2, 3]
                                          },
                                          ordering=Shuffle(2)))

    spec = {
        'name': 'test2',
        'some_extra_field': ['blah'],
        'number': 3,
    }
    assert Design.from_dict(spec) == ('test2',
                                      Design(extra_data={
                                          'some_extra_field': ['blah']
                                      },
                                             ordering=Shuffle(3)))

    spec = {
        'name': 'test3',
        'ordering': {
            'class': 'Sorted',
            'order': 'ascending',
        },
        'ivs': {
            'a': [1, 2, 3]
        },
    }
    assert Design.from_dict(spec) == ('test3',
                                      Design(
                                          ivs={'a': [1, 2, 3]},
                                          ordering=Sorted(order='ascending')))

    spec = {
        'name': 'test4',
        'order': ['CompleteCounterbalance', 3],
    }
    assert Design.from_dict(spec) == ('test4',
                                      Design(
                                          ordering=CompleteCounterbalance(3)))

    spec.pop('name')
    assert Design.from_dict(spec) == Design(ordering=CompleteCounterbalance(3))
示例#10
0
def test_design_from_spec():
    spec = {"name": "test1", "order": "Shuffle", "n": 2, "ivs": {"a": [True, False], "b": [1, 2, 3]}}
    assert Design.from_dict(spec) == ("test1", Design({"a": [True, False], "b": [1, 2, 3]}, ordering=Shuffle(2)))

    spec = {"name": "test2", "some_extra_field": ["blah"], "number": 3}
    assert Design.from_dict(spec) == ("test2", Design(extra_data={"some_extra_field": ["blah"]}, ordering=Shuffle(3)))

    spec = {"name": "test3", "ordering": {"class": "Sorted", "order": "ascending"}, "ivs": {"a": [1, 2, 3]}}
    assert Design.from_dict(spec) == ("test3", Design(ivs={"a": [1, 2, 3]}, ordering=Sorted(order="ascending")))

    spec = {"name": "test4", "order": ["CompleteCounterbalance", 3]}
    assert Design.from_dict(spec) == ("test4", Design(ordering=CompleteCounterbalance(3)))

    spec.pop("name")
    assert Design.from_dict(spec) == Design(ordering=CompleteCounterbalance(3))
示例#11
0
def test_design_matrix():
    iv_names = ('a', 'b', 'c')
    iv_values = [[1, 2], [1, 2], [1, 2]]
    conditions = [
        {'a': 1, 'b': 1, 'c': 2},
        {'a': 1, 'b': 2, 'c': 1},
        {'a': 2, 'b': 1, 'c': 1},
        {'a': 2, 'b': 2, 'c': 2},
    ]
    matrix = np.array([[-1., -1.,  1.], [1., -1., -1.], [-1.,  1., -1.], [1.,  1.,  1.]])  # pyDOE.fracfact('a b ab')
    d = Design(ivs=zip(iv_names, iv_values), design_matrix=matrix)
    d.first_pass()

    for _ in range(3):
        yield check_sequences, d.get_order(), conditions
        yield check_design_matrix, d.get_order(), iv_names, iv_values, matrix
示例#12
0
def test_design_matrix():
    iv_names = ("a", "b", "c")
    iv_values = [[1, 2], [1, 2], [1, 2]]
    conditions = [
        {"a": 1, "b": 1, "c": 2},
        {"a": 1, "b": 2, "c": 1},
        {"a": 2, "b": 1, "c": 1},
        {"a": 2, "b": 2, "c": 2},
    ]
    matrix = np.array(
        [[-1.0, -1.0, 1.0], [1.0, -1.0, -1.0], [-1.0, 1.0, -1.0], [1.0, 1.0, 1.0]]
    )  # pyDOE.fracfact('a b ab')
    d = Design(ivs=zip(iv_names, iv_values), design_matrix=matrix)
    d.first_pass()

    for _ in range(3):
        yield check_sequences, d.get_order(), conditions
        yield check_design_matrix, d.get_order(), iv_names, iv_values, matrix
示例#13
0
def test_bad_heterogeneity():
    main_structure = [
        ('participant',
         Design(ivs={
             'a': [1, 2],
             'b': [1, 2]
         }, ordering=Shuffle(3))),
        ('session',
         Design(ivs={'design': ['practice', 'test']},
                design_matrix=[[0], [1], [1]])),
    ]
    other_structures = {
        'practice': [
            ('block', Design()),
            ('trial', Design(ivs={'difficulty': [1, 2]},
                             ordering=Shuffle(20))),
        ],
        'test': [
            ('block', Design(ordering=CompleteCounterbalance(2))),
            ('trial',
             Design(ivs={'difficulty': [1, 3, 5, 7]}, ordering=Shuffle(5))),
        ],
    }
    with pytest.raises(ValueError):
        DesignTree.new(main_structure, **other_structures)
示例#14
0
def make_heterogeneous_tree():
    main_structure = [
        ('participant',
         Design(ivs={
             'a': [1, 2],
             'b': [1, 2]
         }, ordering=Shuffle(3))),
        ('session',
         Design(ivs={'design': ['practice', 'test']},
                design_matrix=[[0], [1], [1]])),
    ]
    other_structures = {
        'practice': [
            ('block', Design()),
            ('trial', Design(ivs={'difficulty': [1, 2]},
                             ordering=Shuffle(20))),
        ],
        'test': [
            ('block', Design(ordering=Ordering(2))),
            ('trial',
             Design(ivs={'difficulty': [1, 3, 5, 7]}, ordering=Shuffle(5))),
        ],
    }

    return DesignTree.new(main_structure, **other_structures)
示例#15
0
def test_design_matrix():
    iv_names = ('a', 'b', 'c')
    iv_values = [[1, 2], [1, 2], [1, 2]]
    conditions = [
        {
            'a': 1,
            'b': 1,
            'c': 2
        },
        {
            'a': 1,
            'b': 2,
            'c': 1
        },
        {
            'a': 2,
            'b': 1,
            'c': 1
        },
        {
            'a': 2,
            'b': 2,
            'c': 2
        },
    ]
    matrix = np.array([[-1., -1., 1.], [1., -1., -1.], [-1., 1., -1.],
                       [1., 1., 1.]])  # pyDOE.fracfact('a b ab')
    d = Design(ivs=zip(iv_names, iv_values), design_matrix=matrix)
    d.first_pass()

    for _ in range(3):
        yield check_sequences, d.get_order(), conditions
        yield check_design_matrix, d.get_order(), iv_names, iv_values, matrix
示例#16
0
def test_design_tree():
    trial_matrix = np.array(
        [[-1, -1], [1, -1], [-1, 1], [1, 1], [0, 0], [0, 0], [0, 0], [0, 0],
         [-1.41421356, 0.1],
         [1.41421356, 0.1], [0, -1.41421356], [0,
                                               1.41421356],
         [0, 0], [0, 0], [0,
                          0], [0, 0]]
    )  # pyDOE.ccdesign(2) with two 0.1 elements to prevent symmetry in the IVs.
    trial_iv_names = ['a', 'b']
    trial_iv_values = [None, None]
    block_ivs = {'block': [1, 2]}
    participant_iv_names = ('A', 'B')
    participant_iv_values = [[1, 2], [1, 2, 3]]

    trial_design = Design(ivs=zip(trial_iv_names, trial_iv_values),
                          ordering=Shuffle(3),
                          design_matrix=trial_matrix)
    block_design = Design(block_ivs, ordering=CompleteCounterbalance())
    practice_block_design = Design()
    participant_design = Design(dict(
        zip(participant_iv_names, participant_iv_values)),
                                ordering=Ordering(10))

    levels_and_designs = OrderedDict([('participant', participant_design),
                                      ('block',
                                       [practice_block_design, block_design]),
                                      ('trial', trial_design)])

    tree = DesignTree.new(levels_and_designs)
    tree.add_base_level()

    levels, designs = zip(*tree.levels_and_designs)

    yield check_identity, designs[1][0], participant_design
    yield check_identity, designs[2][0], practice_block_design
    yield check_identity, designs[2][1], block_design
    yield check_identity, designs[3][0], trial_design

    yield check_equality, len(tree), 4
    yield check_equality, tree[3], ('trial', [trial_design])

    yield check_equality, next(tree).levels_and_designs, next(
        tree).levels_and_designs, tree.levels_and_designs[1:]
    tree_with_participant_base = next(tree)
    tree_with_block_base = next(tree_with_participant_base)
    yield (check_equality, tree_with_block_base.levels_and_designs,
           next(next(tree)).levels_and_designs,
           [('block', [practice_block_design, block_design]),
            ('trial', [trial_design])])
    tree_with_trial_base = next(tree_with_block_base)
    yield (check_equality, tree_with_trial_base.levels_and_designs, [
        ('trial', [trial_design])
    ], next(tree_with_block_base).levels_and_designs)
    with pytest.raises(StopIteration):
        next(tree_with_trial_base)

    for design, iv_names, iv_values, n, data, matrix in zip(
        [designs[1][0], designs[2][0], designs[2][1], designs[3][0]],
        [['A', 'B', CompleteCounterbalance.iv_name], [], ['block'], ['a', 'b']
         ], [[[1, 2], [1, 2, 3], [0, 1]], [], [[1, 2]], [None, None]],
        [10 * 2 * 2 * 3, 1, 2, 3 * len(trial_matrix)],
        [{}, {}, {
            CompleteCounterbalance.iv_name: 0
        }, {}], [None, None, None, trial_matrix]):
        yield check_design, design, iv_names, iv_values, n, data, matrix

    yield check_design_matrix, designs[3][0].get_order(), ['a', 'b'
                                                           ], [None, None
                                                               ], trial_matrix
示例#17
0
def make_tree(levels, data):
    designs = [[Design([('a', range(len(levels))), ('b', [False, True])], extra_data=data, ordering=Ordering())]
               for _ in levels]
    return DesignTree.new(list(zip(levels, designs)))
示例#18
0
def test_factorial():
    iv_names = ('a', 'b')
    iv_values = [[1, 2, 3], [1, 2]]
    conditions = [
        {
            'a': 1,
            'b': 1
        },
        {
            'a': 1,
            'b': 2
        },
        {
            'a': 2,
            'b': 1
        },
        {
            'a': 2,
            'b': 2
        },
        {
            'a': 3,
            'b': 1
        },
        {
            'a': 3,
            'b': 2
        },
    ]
    assert list(Design.full_cross(iv_names, iv_values)) == conditions
    d = Design(zip(iv_names, iv_values))
    d.first_pass()
    for _ in range(3):
        yield check_sequences, d.get_order(), conditions

    iv_names = ('a', 'b', 'c')
    iv_values = [[1, 2], [1, 2], [1, 2]]
    conditions = [
        {
            'a': 1,
            'b': 1,
            'c': 1
        },
        {
            'a': 1,
            'b': 1,
            'c': 2
        },
        {
            'a': 1,
            'b': 2,
            'c': 1
        },
        {
            'a': 1,
            'b': 2,
            'c': 2
        },
        {
            'a': 2,
            'b': 1,
            'c': 1
        },
        {
            'a': 2,
            'b': 1,
            'c': 2
        },
        {
            'a': 2,
            'b': 2,
            'c': 1
        },
        {
            'a': 2,
            'b': 2,
            'c': 2
        },
    ]
    assert list(Design.full_cross(iv_names, iv_values)) == conditions
    d = Design(zip(iv_names, iv_values))
    d.first_pass()
    for _ in range(3):
        yield check_sequences, d.get_order(), conditions
示例#19
0
def test_bad_design_matrix():
    with pytest.raises(TypeError):
        design = Design(ivs=[('a', [1]), ('b', [1])],
                        design_matrix=np.ones((3, 3)))
        design.first_pass()
示例#20
0
def test_continuous_ivs_without_design_matrix():
    with pytest.raises(TypeError):
        Design(ivs=[('a', None)])
示例#21
0
def test_bad_design_matrix():
    with pytest.raises(TypeError):
        design = Design(ivs=[('a', [1]), ('b', [1])], design_matrix=np.ones((3, 3)))
        design.first_pass()
示例#22
0
def test_bizarre_equality():
    design = Design()
    assert (design == 1) is False
    tree = DesignTree.new([('a', design)])
    assert (tree == 1) is False