To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / _dbn / inference.m @ 8:b5b38998ef3b

History | View | Annotate | Download (3.56 KB)

1
function song = inference(song, bnet, param)
2

    
3

    
4
if param.dsp.separatenormalising % means that also bass and treble chroma are separate
5
    evidence = cell(bnet.nnodes_per_slice,song.nBeat);
6
    if param.dbn.nBass > 0
7
        basschromanode = bnet.names('basschroma');
8
        evidence(basschromanode,:) = ...
9
            num2cell(song.segchroma.bass(:,1:param.dbn.nBass)',1);
10
    end
11

    
12
    treblechromanode = bnet.names('treblechroma');
13
    evidence(treblechromanode,:) = ...
14
        num2cell(song.segchroma.treble',1);
15

    
16
    if param.dbn.inferencebypart
17
        fprintf(2,'    ');
18
        song = integratesmallparts(song);
19
        song.mpe = cell(size(evidence));
20
        nIntegratedParts = numel(song.integratedparts);
21
        if param.dbn.infermpe
22
            for iIP = 1:nIntegratedParts
23
                startind = song.integratedparts(iIP).indices; % only one index for integrated parts
24
                endind = song.integratedparts(iIP).indices + song.integratedparts(iIP).n - 1;
25
                leftoverlap = min(startind - 1, param.seg.inferenceoverlap);
26
                rightoverlap = min(song.nBeat - endind, param.seg.inferenceoverlap);
27
                currevidence = evidence(:,startind - leftoverlap:endind + rightoverlap);
28
                engine = smoother_engine(jtree_2TBN_inf_engine(bnet));
29
                fprintf(1,'\nFinding maximum probability path (part %1.0f of %1.0f, beats %1.0f to %1.0f)... \n', iIP, nIntegratedParts, startind, endind)
30
                fprintf(2,'\b\b\b\b%3.0f%%',iIP/nIntegratedParts*100);
31
                currmpe = find_mpeMM(engine, currevidence);
32
                song.mpe(:,startind:endind) = currmpe(:,leftoverlap + 1:size(currmpe,2)-rightoverlap);
33
            end
34
        else
35
            error('inference by part + mpe not yet supported');
36
        end
37
    else
38

    
39
        if param.dbn.infermpe
40
            engine = smoother_engine(jtree_2TBN_inf_engine(bnet));
41
            fprintf(1,'\n__ Finding maximum probability path... _________\n')
42
            song.mpe = find_mpeMM(engine, evidence);
43
        else
44
            engine = filter_engine(jtree_2TBN_inf_engine(bnet));
45
            fprintf(1,'\n__ Inference... _________\n')
46
            tic
47
            for t = 1:song.nBeat
48
                t
49
                param.engine = enter_evidence(engine,[evidence{:,t}],t);
50
            end
51
            toc
52
            song.inferred = cell(bnet.nnodes_per_slice, song.nBeat);
53
            for iBeat = 1:song.nBeat
54
                for iNode = 1:bnet.nnodes_per_slice-2
55
                    temp = marginal_nodes(engine,iNode,iBeat);
56
                    song.inferred{iNode, iBeat} = temp.T;
57
                end
58
            end
59
        end
60
    end
61
else
62
    chromanode = bnet.names('chroma');
63

    
64
    evidence = cell(bnet.nnodes_per_slice,song.nBeat);
65

    
66
    evidence(chromanode,:) = ...
67
        num2cell([song.segchroma.bass, song.segchroma.treble]',1);
68

    
69
    if param.dbn.inferencebypart
70
    else
71
        engine = smoother_engine(jtree_2TBN_inf_engine(bnet));
72
        if param.dbn.infermpe
73
            fprintf(1,'\n__ Finding maximum probability path... _________\n')
74
            song.mpe = find_mpe(engine, evidence);
75
        else
76
            fprintf(1,'\n__ Inference... _________\n')
77
            tic
78
            param.engine = enter_evidence(engine,evidence);
79
            toc
80
            song.inferred = cell(bnet.nnodes_per_slice, song.nBeat);
81
            for iBeat = 1:beat.n
82
                for iNode = 1:bnet.nnodes_per_slice-1
83
                    temp = marginal_nodes(engine,iNode,iBeat);
84
                    song.inferred{iNode, iBeat} = temp.T;
85
                end
86
            end
87
        end
88
    end
89
end