class LDAExtractor(AbstractSigExtractor):
    def __init__(self, pca_file, lda_file):
        super(LDAExtractor, self).__init__()
        self.lda = LDA.load_from_file(lda_file)
        self.pca = PCA()
        self.pca.load_from_xml_file(pca_file)

    def project_signature(self, feats):
        pca_feats = self.pca.project(feats)
        return self.lda.project(pca_feats, whiten=True)

    def encode(self):
        dla_dict = {}
        dla_dict['extractor_type'] = 'lda_extractor'
        dla_dict['lda'] = self.lda.encode()
        dla_dict['pca'] = self.pca.encode()
        return dla_dict

    @classmethod
    def decode(cls, lda_dict):
        lda_dict['pca'] = PCA.decode(lda_dict['pca'])
        lda_dict['lda'] = LDA.decode(lda_dict['lda'])
        lda_extractor = cls.__new__(LDAExtractor)
        lda_extractor.__dict__  = lda_dict
        return lda_extractor
class DLAExtractor(AbstractSigExtractor):
    def __init__(self, pca_file, dla_file):
        """
        Args:
            pca_file : the xml file that is saved as part of PCA learning
            dla_file : pickle file storing the dla
        """
        super(DLAExtractor, self).__init__()
        self.dla = DLA.load_from_file(dla_file)
        self.pca = PCA()
        self.pca.load_from_xml_file(pca_file)

    def project_signature(self, feats):
        pca_feats = self.pca.project(feats)
        return self.dla.project(pca_feats)

    def encode(self):
        dla_dict = {}
        dla_dict['extractor_type'] = 'dla_extractor'
        dla_dict['dla'] = self.dla.encode()
        dla_dict['pca'] = self.pca.encode()
        return dla_dict

    @classmethod
    def decode(cls, dla_dict):
        dla_dict['pca'] = PCA.decode(dla_dict['pca'])
        dla_dict['dla'] = DLA.decode(dla_dict['dla'])
        dla_extractor = cls.__new__(DLAExtractor)
        dla_extractor.__dict__  = dla_dict
        return dla_extractor
class SubspaceExtractor(AbstractSigExtractor):
    def __init__(self, model_dir):
        super(SubspaceExtractor, self).__init__()
        self.model_dir = model_dir

        self.pca_file = os.path.join(self.model_dir, 'learned_pca.xml')
        assert os.path.exists(self.pca_file), self.pca_file
        self.pca = PCA()
        self.pca.load_from_xml_file(self.pca_file)

        self.subspace_file = os.path.join(self.model_dir, 'learned_subspace.xml')
        assert os.path.exists(self.subspace_file), self.subspace_file
        self.get_projection_matrix()

    def get_projection_matrix(self):
        WI = np.asarray(cv.Load(self.subspace_file, name='WI'))
        WI_wh = np.asarray(cv.Load(self.subspace_file, name='WI_wh'))
        WL = np.asarray(cv.Load(self.subspace_file, name='WL'))
        self.projection_mat = np.dot(WL, np.dot(WI_wh, WI)).transpose()

    def project(self, feats):
        return np.dot(feats, self.projection_mat)

    def project_signature(self, feats):
        red_feats = self.pca.project(feats)
        return self.project(red_feats)
class PCAExtractor(AbstractSigExtractor):
    PCA_TAR_BALL_NAME = 'pca'
    def __init__(self):
        super(PCAExtractor, self).__init__()
        pca_file = self.grab_projection_files()
        self.pca = PCA()
        self.pca.load_from_xml_file(pca_file)

    def grab_projection_files(self):
        download_dir = os.path.join(config.scratch_detector_path(), self.PCA_TAR_BALL_NAME)
        bucket = config.s3_detector_bucket()
        logger.info('Downloading files from s3')
        s3client.download_tarball(bucket, self.PCA_TAR_BALL_NAME, download_dir)
        pca_file =  os.path.join(download_dir, 'pca.xml')
        assert os.path.exists(pca_file), pca_file
        return pca_file

    def project_signature(self, feats):
        return self.pca.project(feats)

    def encode(self):
        pca_dict = {}
        pca_dict['extractor_type'] = 'pca_extractor'
        pca_dict['pca'] = self.pca.encode()
        return pca_dict

    @classmethod
    def decode(cls, pca_dict):
        pca_dict['pca'] = PCA.decode(pca_dict['pca'])
        pca_extractor = cls.__new__(cls)
        pca_extractor.__dict__  = pca_dict
        return pca_extractor
 def __init__(self, pca_file, dla_file):
     """
     Args:
         pca_file : the xml file that is saved as part of PCA learning
         dla_file : pickle file storing the dla
     """
     super(DLAExtractor, self).__init__()
     self.dla = DLA.load_from_file(dla_file)
     self.pca = PCA()
     self.pca.load_from_xml_file(pca_file)
    def __init__(self, model_dir):
        super(SubspaceExtractor, self).__init__()
        self.model_dir = model_dir

        self.pca_file = os.path.join(self.model_dir, 'learned_pca.xml')
        assert os.path.exists(self.pca_file), self.pca_file
        self.pca = PCA()
        self.pca.load_from_xml_file(self.pca_file)

        self.subspace_file = os.path.join(self.model_dir, 'learned_subspace.xml')
        assert os.path.exists(self.subspace_file), self.subspace_file
        self.get_projection_matrix()
 def decode(cls, dla_dict):
     dla_dict['pca'] = PCA.decode(dla_dict['pca'])
     dla_dict['dla'] = DLA.decode(dla_dict['dla'])
     dla_extractor = cls.__new__(DLAExtractor)
     dla_extractor.__dict__  = dla_dict
     return dla_extractor
 def decode(cls, lda_dict):
     lda_dict['pca'] = PCA.decode(lda_dict['pca'])
     lda_dict['lda'] = LDA.decode(lda_dict['lda'])
     lda_extractor = cls.__new__(LDAExtractor)
     lda_extractor.__dict__  = lda_dict
     return lda_extractor
 def __init__(self, pca_file, lda_file):
     super(LDAExtractor, self).__init__()
     self.lda = LDA.load_from_file(lda_file)
     self.pca = PCA()
     self.pca.load_from_xml_file(pca_file)
 def decode(cls, pca_dict):
     pca_dict['pca'] = PCA.decode(pca_dict['pca'])
     pca_extractor = cls.__new__(cls)
     pca_extractor.__dict__  = pca_dict
     return pca_extractor
 def __init__(self):
     super(PCAExtractor, self).__init__()
     pca_file = self.grab_projection_files()
     self.pca = PCA()
     self.pca.load_from_xml_file(pca_file)