'Saves SVD transformation (U, Sigma and V matrices) to a ZIP file
:param filename: path to save the SVD matrix transformation (U, Sigma and V matrices)
:type filename: string
:param options: a dict() containing the info about the SVD transformation. E.g. {\'k\': 100, \'min_values\': 5, \'pre_normalize\': None, \'mean_center\': True, \'post_normalize\': True}
:type options: dict'

def save_model(self, filename, options={}):

    if VERBOSE:
        sys.stdout.write(('Saving    svd    model    to    %s\n' % filename))
    f_opt = open((filename + '.config'), 'w')
    for (option, value) in options.items():
        f_opt.write((' DCTB '.join((option, str(value))) + '\n'))
    f_opt.close()
    MAX_VECTORS = (2 ** 21)
    if (len(self._U) < MAX_VECTORS):
        self._U.dump((filename + '.U'))
    else:
        self._U.tofile((filename + '.U'))
    if (len(self._V) < MAX_VECTORS):
        self._V.dump((filename + '.V'))
    else:
        self._V.tofile((filename + '.V'))
    self._S.dump((filename + '.S'))
    if self._shifts:
        self._shifts[0].dump((filename + '.shifts.row'))
        self._shifts[1].dump((filename + '.shifts.col'))
        self._shifts[2].dump((filename + '.shifts.total'))
    zip = filename
    if ((not filename.endswith('.zip')) and (not filename.endswith('.ZIP'))):
        zip += '.zip'
    fp = zipfile.ZipFile(zip, 'w', allowZip64=True)
    fp.write(filename=(filename + '.config'), arcname='README')
    os.remove((filename + '.config'))
    for extension in ['.U', '.S', '.V']:
        fp.write(filename=(filename + extension), arcname=extension)
        os.remove((filename + extension))
    if self._shifts:
        for extension in ['.shifts.row', '.shifts.col', '.shifts.total']:
            fp.write(filename=(filename + extension), arcname=extension)
            os.remove((filename + extension))
    if self._file_row_ids:
        fp.write(filename=self._file_row_ids, arcname='.row_ids')
    if self._file_col_ids:
        fp.write(filename=self._file_col_ids, arcname='.col_ids')
