Evaluate a model for a single recording, after everything has been loaded.
    Multiple symbols are recognized.

    Parameters
    ----------
    preprocessing_queue : list
        List of all preprocessing objects.
    feature_list : list
        List of all feature objects.
    model : dict
        Neural network model.
    output_semantics :
        List that defines what an output means.
    recording :
        The handwritten recording in JSON format.

def evaluate_model_single_recording_preloaded_multisymbol(preprocessing_queue,
                                                          feature_list,
                                                          model,
                                                          output_semantics,
                                                          recording):
    """
    Evaluate a model for a single recording, after everything has been loaded.
    Multiple symbols are recognized.

    Parameters
    ----------
    preprocessing_queue : list
        List of all preprocessing objects.
    feature_list : list
        List of all feature objects.
    model : dict
        Neural network model.
    output_semantics :
        List that defines what an output means.
    recording :
        The handwritten recording in JSON format.
    """
    import json
    import nntoolkit.evaluate
    recording = json.loads(recording)
    logging.info(("## start (%i strokes)" % len(recording)) + "#" * 80)
    hypotheses = []  # [[{'score': 0.123, symbols: [123, 123]}]  # split0
                     #  []] # Split i...
    for split in get_possible_splits(len(recording)):
        recording_segmented = segment_by_split(split, recording)
        cur_split_results = []
        for i, symbol in enumerate(recording_segmented):
            handwriting = handwritten_data.HandwrittenData(json.dumps(symbol))
            handwriting.preprocessing(preprocessing_queue)
            x = handwriting.feature_extraction(feature_list)

            model_output = nntoolkit.evaluate.get_model_output(model, [x])
            results = nntoolkit.evaluate.get_results(model_output,
                                                     output_semantics)
            results = results[:10]
            cur_split_results.append([el for el in results if el['probability'] >= 0.01])
            # serve.show_results(results, n=10)

        # Now that I have all symbols of this split, I have to get all
        # combinations of the hypothesis
        import itertools
        for hyp in itertools.product(*cur_split_results):
            hypotheses.append({'score': reduce(lambda x, y: x*y,
                                               [s['probability'] for s in hyp])*len(hyp)/len(recording),
                               'symbols': [s['semantics'] for s in hyp],
                               'min_part': min([s['probability'] for s in hyp]),
                               'segmentation': split})

    hypotheses = sorted(hypotheses, key=lambda n: n['min_part'], reverse=True)[:10]
    for i, hyp in enumerate(hypotheses):
        if hyp['score'] > 0.001:
            logging.info("%0.4f: %s (seg: %s)", hyp['score'], hyp['symbols'], hyp['segmentation'])
    return nntoolkit.evaluate.get_results(model_output, output_semantics)