orange-multitask / _multitask /

from __future__ import absolute_import
from pkg_resources import resource_filename
import Orange
from . import mtfeat

def datasets():
    yield ('multitask', resource_filename(__name__, 'datasets'))

def split_by_task(data, task_id='task'):
    Split data set into individual task data sets.
    :param data: Data set with all instances from all tasks.
    :type data: :obj:``
    :param task_id: Attribute with task ids used for the split.
    :return: Dictionary with task identifiers and corresponding data sets.
    task_indices = [int(ins[task_id]) for ins in data]
    return {ind:, ind)
            for ind in sorted(set(task_indices))}

class MultiTaskLearner(Orange.classification.Learner):
    """Learn a model for each task independently."""
    def __new__(cls, data=None, weights=0, **kwargs):
        self = Orange.classification.Learner.__new__(cls, **kwargs)
        if data:
            return self.__call__(data, weights)
            return self

    def __init__(self, learner, **kwargs):
        self.learner = learner

    def __call__(self, data, weights=0):
        datas = split_by_task(data)
        tasks = sorted(datas.keys())
        classifiers = {t: self.learner(datas[t]) for t in tasks}
        return MultiTaskClassifier(classifiers=classifiers)

class MultiTaskClassifier(Orange.classification.Classifier):
    """Classify instances with the appropriate task-specific classifier."""
    def __init__(self, classifiers):
        self.classifiers = classifiers

    def __call__(self, instance, return_type=Orange.core.GetValue):
        return self.classifiers[int(instance['task'])](instance, return_type)