diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..5d11dd945a5d811af0f0b6bf04bfe436d7fc28f4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +*.df filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1bb9b2d08905b446e4cbbcc1a088e5b30c7d5b6c --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# iLoRA + +#### Preparation + +1. Prepare the environment: + +```python +git clone +cd iLoRA +pip install -r requirements.txt +``` + +2. Prepare the pre-trained huggingface model of Llama2-7B (https://huggingface.co/meta-llama/Llama-2-7b-hf). +3. Modify the paths inside the .sh file. + + +#### Train iLoRA + +Train iLoRA with a single A100 GPU on MovieLens dataset: + +```python +sh train_movielens.sh +``` + +Train iLoRA with a single A100 GPU on Steam dataset: + +``` +sh train_steam.sh +``` + +Train iLoRA with a single A100 GPU on LastFM dataset: + +``` +sh train_lastfm.sh +``` + +Note that: set the `llm_path` argument with your own directory path of the Llama2 model. + +##### For the environmental issues mentioned by everyone during the reproduction process, we have attempted to help resolve them and have listed some solutions: + +If you encounter an error with your transformers/generation/utils.py file, please replace it with the debug/utils.py file we have provided in your environment. + +If you encounter an error with your transformers/models/llama/modeling_llama.py file, please replace it with the debug/modeling_llama.py file. + +Thank you all for your attention to our work! Wishing you success in your research. + +##### Evaluate iLoRA + +Test iLoRA with a single A100 GPU on MovieLens dataset: + +``` +sh test_movielens.sh +``` + +Test iLoRA with a single A100 GPU on Steam dataset: + +``` +sh test_steam.sh +``` + +Test iLoRA with a single A100 GPU on LastFM dataset: + +``` +sh test_lastfm.sh +``` diff --git a/SASRecModules_ori.py b/SASRecModules_ori.py new file mode 100644 index 0000000000000000000000000000000000000000..3ac3c975a58d43ee866b637ee5d4f99534974a7b --- /dev/null +++ b/SASRecModules_ori.py @@ -0,0 +1,95 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + + +class PositionwiseFeedForward(nn.Module): + def __init__(self, d_in, d_hid, dropout=0.1): + super().__init__() + self.w_1 = nn.Conv1d(d_in, d_hid, 1) + self.w_2 = nn.Conv1d(d_hid, d_in, 1) + self.layer_norm = nn.LayerNorm(d_in) + self.dropout = nn.Dropout(dropout) + + def forward(self, x): + residual = x + output = x.transpose(1, 2) + output = self.w_2(F.relu(self.w_1(output))) + output = output.transpose(1, 2) + output = self.dropout(output) + output = self.layer_norm(output + residual) + return output + + + +class MultiHeadAttention(nn.Module): + def __init__(self, hidden_size, num_units, num_heads, dropout_rate): + super().__init__() + self.hidden_size = hidden_size + self.num_heads = num_heads + assert hidden_size % num_heads == 0 + + self.linear_q = nn.Linear(hidden_size, num_units) + self.linear_k = nn.Linear(hidden_size, num_units) + self.linear_v = nn.Linear(hidden_size, num_units) + self.dropout = nn.Dropout(dropout_rate) + self.softmax = nn.Softmax(dim=-1) + + + def forward(self, queries, keys): + """ + :param queries: A 3d tensor with shape of [N, T_q, C_q] + :param keys: A 3d tensor with shape of [N, T_k, C_k] + + :return: A 3d tensor with shape of (N, T_q, C) + + """ + Q = self.linear_q(queries) # (N, T_q, C) + K = self.linear_k(keys) # (N, T_k, C) + V = self.linear_v(keys) # (N, T_k, C) + + # Split and Concat + split_size = self.hidden_size // self.num_heads + Q_ = torch.cat(torch.split(Q, split_size, dim=2), dim=0) # (h*N, T_q, C/h) + K_ = torch.cat(torch.split(K, split_size, dim=2), dim=0) # (h*N, T_k, C/h) + V_ = torch.cat(torch.split(V, split_size, dim=2), dim=0) # (h*N, T_k, C/h) + + # Multiplication + matmul_output = torch.bmm(Q_, K_.transpose(1, 2)) / self.hidden_size ** 0.5 # (h*N, T_q, T_k) + + # Key Masking + key_mask = torch.sign(torch.abs(keys.sum(dim=-1))).repeat(self.num_heads, 1) # (h*N, T_k) + key_mask_reshaped = key_mask.unsqueeze(1).repeat(1, queries.shape[1], 1) # (h*N, T_q, T_k) + key_paddings = torch.ones_like(matmul_output) * (-2 ** 32 + 1) + matmul_output_m1 = torch.where(torch.eq(key_mask_reshaped, 0), key_paddings, matmul_output) # (h*N, T_q, T_k) + + # Causality - Future Blinding + diag_vals = torch.ones_like(matmul_output[0, :, :]) # (T_q, T_k) + tril = torch.tril(diag_vals) # (T_q, T_k) + causality_mask = tril.unsqueeze(0).repeat(matmul_output.shape[0], 1, 1) # (h*N, T_q, T_k) + causality_paddings = torch.ones_like(causality_mask) * (-2 ** 32 + 1) + matmul_output_m2 = torch.where(torch.eq(causality_mask, 0), causality_paddings, matmul_output_m1) # (h*N, T_q, T_k) + + # Activation + matmul_output_sm = self.softmax(matmul_output_m2) # (h*N, T_q, T_k) + + # Query Masking + query_mask = torch.sign(torch.abs(queries.sum(dim=-1))).repeat(self.num_heads, 1) # (h*N, T_q) + query_mask = query_mask.unsqueeze(-1).repeat(1, 1, keys.shape[1]) # (h*N, T_q, T_k) + matmul_output_qm = matmul_output_sm * query_mask + + # Dropout + matmul_output_dropout = self.dropout(matmul_output_qm) + + # Weighted Sum + output_ws = torch.bmm(matmul_output_dropout, V_) # ( h*N, T_q, C/h) + + # Restore Shape + output = torch.cat(torch.split(output_ws, output_ws.shape[0] // self.num_heads, dim=0), dim=2) # (N, T_q, C) + + # Residual Connection + output_res = output + queries + + return output_res + \ No newline at end of file diff --git a/data/_init_.py b/data/_init_.py new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/data/_init_.py @@ -0,0 +1 @@ + diff --git a/data/data_interface.py b/data/data_interface.py new file mode 100644 index 0000000000000000000000000000000000000000..5f822c628751e5bbef8857a350e5812a4cc510e1 --- /dev/null +++ b/data/data_interface.py @@ -0,0 +1,190 @@ +import inspect +import importlib +import pickle as pkl +import pytorch_lightning as pl +from torch.utils.data import DataLoader +from torch.utils.data.sampler import WeightedRandomSampler + +import random +import torch +import argparse +from transformers import LlamaForCausalLM, LlamaTokenizer +import os + + + +class TrainCollater: + def __init__(self, + prompt_list=None, + llm_tokenizer=None, + train=False, + terminator="\n", + max_step=1): + self.prompt_list = prompt_list + self.llm_tokenizer = llm_tokenizer + self.train=train + self.terminator = terminator + self.max_step = max_step + self.cur_step = 1 + + def __call__(self, batch): + if isinstance(self.prompt_list,list): + instruction = random.choice(self.prompt_list) + inputs_text = instruction if isinstance(instruction, list) else [instruction] * len(batch) + else: + instruction = sample["instruction_input"] if "instruction_input" in sample else None + inputs_text = instruction if isinstance(instruction, list) else [instruction] * len(batch) + + thresh_hold = self.cur_step/self.max_step + p = random.random() + if p < thresh_hold or not self.train: + for i, sample in enumerate(batch): + input_text=inputs_text[i] + if '[HistoryHere]' in input_text: + insert_prompt=", ".join([seq_title+' [HistoryEmb]' for seq_title in sample['seq_name']]) + input_text=input_text.replace('[HistoryHere]',insert_prompt) + if '[CansHere]' in input_text: + insert_prompt=", ".join([can_title+' [CansEmb]' for can_title in sample['cans_name']]) + input_text=input_text.replace('[CansHere]',insert_prompt) + if '[TargetHere]' in input_text: + insert_prompt=insert_prompt=", ".join([sample['correct_answer']+' [ItemEmb]']) + input_text=input_text.replace('[TargetHere]',insert_prompt) + + inputs_text[i]=input_text + flag = False + else: + for i, sample in enumerate(batch): + input_text=inputs_text[i] + if '[HistoryHere]' in input_text: + insert_prompt=", ".join([seq_title+' [PH]' for seq_title in sample['seq_name']]) + input_text=input_text.replace('[HistoryHere]',insert_prompt) + if '[CansHere]' in input_text: + insert_prompt=", ".join([can_title+' [PH]' for can_title in sample['cans_name']]) + input_text=input_text.replace('[CansHere]',insert_prompt) + + inputs_text[i]=input_text + flag = True + self.cur_step += 1 + + targets_text = [sample['correct_answer'] for sample in batch] + + if self.train: + targets_text=[target_text+self.terminator for target_text in targets_text] + inputs_pair = [[p, t] for p, t in zip(inputs_text, targets_text)] + + batch_tokens = self.llm_tokenizer( + inputs_pair, + return_tensors="pt", + padding="longest", + truncation=False, + add_special_tokens=True, + return_attention_mask=True, + return_token_type_ids=True) + new_batch={"tokens":batch_tokens, + "seq":torch.stack([torch.tensor(sample['seq']) for sample in batch], dim=0), + "cans":torch.stack([torch.tensor(sample['cans']) for sample in batch], dim=0), + "len_seq":torch.stack([torch.tensor(sample['len_seq']) for sample in batch], dim=0), + "len_cans":torch.stack([torch.tensor(sample['len_cans']) for sample in batch], dim=0), + "item_id": torch.stack([torch.tensor(sample['item_id']) for sample in batch], dim=0), + "flag":flag, + } + + + else: + batch_tokens = self.llm_tokenizer( + inputs_text, + return_tensors="pt", + padding="longest", + truncation=False, + add_special_tokens=True, + return_token_type_ids=True) + cans_name=[sample['cans_name'] for sample in batch] + new_batch={"tokens":batch_tokens, + "seq":torch.stack([torch.tensor(sample['seq']) for sample in batch], dim=0), + "cans":torch.stack([torch.tensor(sample['cans']) for sample in batch], dim=0), + "len_seq":torch.stack([torch.tensor(sample['len_seq']) for sample in batch], dim=0), + "len_cans":torch.stack([torch.tensor(sample['len_cans']) for sample in batch], dim=0), + "item_id": torch.stack([torch.tensor(sample['item_id']) for sample in batch], dim=0), + "correct_answer": targets_text, + "cans_name": cans_name, + + } + + return new_batch + +class DInterface(pl.LightningDataModule): + + def __init__(self, + llm_tokenizer=None, + num_workers=8, + dataset='', + **kwargs): + super().__init__() + self.num_workers = num_workers + self.llm_tokenizer=llm_tokenizer + self.dataset = dataset + self.kwargs = kwargs + self.batch_size = kwargs['batch_size'] + self.max_epochs = kwargs['max_epochs'] + self.load_data_module() + self.load_prompt(kwargs['prompt_path']) + + self.trainset = self.instancialize(stage='train') + self.valset = self.instancialize(stage='val') + self.testset = self.instancialize(stage='test') + self.max_steps = self.max_epochs*(len(self.trainset)//self.batch_size)//self.num_workers + + def train_dataloader(self): + return DataLoader(self.trainset, + batch_size=self.batch_size, + num_workers=self.num_workers, + shuffle=True, + drop_last=True, + collate_fn=TrainCollater(prompt_list=self.prompt_list,llm_tokenizer=self.llm_tokenizer,train=True, max_step=self.max_steps)) + + def val_dataloader(self): + return DataLoader(self.valset, + batch_size=self.batch_size, + num_workers=self.num_workers, + shuffle=False, + collate_fn=TrainCollater(prompt_list=self.prompt_list,llm_tokenizer=self.llm_tokenizer,train=False)) + + def test_dataloader(self): + return DataLoader(self.testset, + batch_size=self.batch_size, + num_workers=self.num_workers, + shuffle=False, + + drop_last=True, + + collate_fn=TrainCollater(prompt_list=self.prompt_list,llm_tokenizer=self.llm_tokenizer,train=False)) + + def load_data_module(self): + name = self.dataset + camel_name = ''.join([i.capitalize() for i in name.split('_')]) + try: + self.data_module = getattr(importlib.import_module( + '.'+name, package=__package__), camel_name) + except: + raise ValueError( + f'Invalid Dataset File Name or Invalid Class Name data.{name}.{camel_name}') + + def instancialize(self, **other_args): + class_args = inspect.getargspec(self.data_module.__init__).args[1:] + inkeys = self.kwargs.keys() + args1 = {} + for arg in class_args: + if arg in inkeys: + args1[arg] = self.kwargs[arg] + args1.update(other_args) + return self.data_module(**args1) + + def load_prompt(self,prompt_path): + if os.path.isfile(prompt_path): + with open(prompt_path, 'r') as f: + raw_prompts = f.read().splitlines() + self.prompt_list = [p.strip() for p in raw_prompts] + print('Load {} training prompts'.format(len(self.prompt_list))) + print('Prompt Example \n{}'.format(random.choice(self.prompt_list))) + else: + self.prompt_list = [] diff --git a/data/lastfm_data.py b/data/lastfm_data.py new file mode 100644 index 0000000000000000000000000000000000000000..54a7518dc223ff4ee6d7e9b84ab86a43a4d9ebd1 --- /dev/null +++ b/data/lastfm_data.py @@ -0,0 +1,87 @@ +import torch +import os.path as op +import numpy as np +import pickle as pkl +import torch.utils.data as data + +import pandas as pd +import random + +class LastfmData(data.Dataset): + def __init__(self, data_dir=r'data/ref/lastfm_ctr', + stage=None, + cans_num=10, + sep=", ", + no_augment=True): + self.__dict__.update(locals()) + self.aug = (stage=='train') and not no_augment + self.padding_item_id=4606 + self.check_files() + + def __len__(self): + return len(self.session_data['seq']) + + def __getitem__(self, i): + temp = self.session_data.iloc[i] + candidates = self.negative_sampling(temp['seq_unpad'],temp['next']) + cans_name=[self.item_id2name[can] for can in candidates] + sample = { + 'seq': temp['seq'], + 'seq_name': temp['seq_title'], + 'len_seq': temp['len_seq'], + 'seq_str': self.sep.join(temp['seq_title']), + 'cans': candidates, + 'cans_name': cans_name, + 'cans_str': self.sep.join(cans_name), + 'len_cans': self.cans_num, + 'item_id': temp['next'], + 'item_name': temp['next_item_name'], + 'correct_answer': temp['next_item_name'] + } + return sample + + def negative_sampling(self,seq_unpad,next_item): + canset=[i for i in list(self.item_id2name.keys()) if i not in seq_unpad and i!=next_item] + candidates=random.sample(canset, 1) + return candidates + + def check_files(self): + self.item_id2name=self.get_music_id2name() + if self.stage=='train': + filename="train_data.df" + elif self.stage=='val': + filename="Val_data.df" + elif self.stage=='test': + filename="Test_data.df" + data_path=op.join(self.data_dir, filename) + self.session_data = self.session_data4frame(data_path, self.item_id2name) + + + def get_music_id2name(self): + music_id2name = dict() + item_path=op.join(self.data_dir, 'id2name.txt') + with open(item_path, 'r') as f: + for l in f.readlines(): + ll = l.strip('\n').split('::') + music_id2name[int(ll[0])] = ll[1].strip() + return music_id2name + + def session_data4frame(self, datapath, music_id2name): + train_data = pd.read_pickle(datapath) + train_data = train_data[train_data['len_seq'] >= 3] + def remove_padding(xx): + x = xx[:] + for i in range(10): + try: + x.remove(self.padding_item_id) + except: + break + return x + train_data['seq_unpad'] = train_data['seq'].apply(remove_padding) + def seq_to_title(x): + return [music_id2name[x_i] for x_i in x] + train_data['seq_title'] = train_data['seq_unpad'].apply(seq_to_title) + def next_item_title(x): + return music_id2name[x] + train_data['next_item_name'] = train_data['next'].apply(next_item_title) + return train_data \ No newline at end of file diff --git a/data/movielens_data.py b/data/movielens_data.py new file mode 100644 index 0000000000000000000000000000000000000000..2bf0e156a215b16f0d6328a1c12fcb30a0848252 --- /dev/null +++ b/data/movielens_data.py @@ -0,0 +1,102 @@ +import torch +import os.path as op +import numpy as np +import pickle as pkl +import torch.utils.data as data + +import pandas as pd +import random + +class MovielensData(data.Dataset): + def __init__(self, data_dir=r'data/ref/movielens', + stage=None, + cans_num=10, + sep=", ", + no_augment=True): + self.__dict__.update(locals()) + self.aug = (stage=='train') and not no_augment + self.padding_item_id=1682 + self.padding_rating=0 + self.check_files() + + def __len__(self): + return len(self.session_data['seq']) + + def __getitem__(self, i): + temp = self.session_data.iloc[i] + candidates = self.negative_sampling(temp['seq_unpad'],temp['next']) + cans_name=[self.item_id2name[can] for can in candidates] + sample = { + 'seq': temp['seq'], + 'seq_name': temp['seq_title'], + 'len_seq': temp['len_seq'], + 'seq_str': self.sep.join(temp['seq_title']), + 'cans': candidates, + 'cans_name': cans_name, + 'cans_str': self.sep.join(cans_name), + 'len_cans': self.cans_num, + 'item_id': temp['next'], + 'item_name': temp['next_item_name'], + 'correct_answer': temp['next_item_name'] + } + return sample + + def negative_sampling(self,seq_unpad,next_item): + canset=[i for i in list(self.item_id2name.keys()) if i not in seq_unpad and i!=next_item] + candidates=random.sample(canset, self.cans_num-1)+[next_item] + random.shuffle(candidates) + return candidates + + def check_files(self): + self.item_id2name=self.get_movie_id2name() + if self.stage=='train': + filename="train_data.df" + elif self.stage=='val': + filename="Val_data.df" + elif self.stage=='test': + filename="Test_data.df" + data_path=op.join(self.data_dir, filename) + self.session_data = self.session_data4frame(data_path, self.item_id2name) + + def get_mv_title(self,s): + sub_list=[", The", ", A", ", An"] + for sub_s in sub_list: + if sub_s in s: + return sub_s[2:]+" "+s.replace(sub_s,"") + return s + + def get_movie_id2name(self): + movie_id2name = dict() + item_path=op.join(self.data_dir, 'u.item') + with open(item_path, 'r', encoding = "ISO-8859-1") as f: + for l in f.readlines(): + ll = l.strip('\n').split('|') + movie_id2name[int(ll[0]) - 1] = self.get_mv_title(ll[1][:-7]) + return movie_id2name + + def session_data4frame(self, datapath, movie_id2name): + train_data = pd.read_pickle(datapath) + train_data = train_data[train_data['len_seq'] >= 3] + def remove_padding(xx): + x = xx[:] + for i in range(10): + try: + x.remove((self.padding_item_id,self.padding_rating)) + except: + break + return x + train_data['seq_unpad'] = train_data['seq'].apply(remove_padding) + def seq_to_title(x): + return [movie_id2name[x_i[0]] for x_i in x] + train_data['seq_title'] = train_data['seq_unpad'].apply(seq_to_title) + def next_item_title(x): + return movie_id2name[x[0]] + train_data['next_item_name'] = train_data['next'].apply(next_item_title) + def get_id_from_tumple(x): + return x[0] + def get_id_from_list(x): + return [i[0] for i in x] + train_data['next'] = train_data['next'].apply(get_id_from_tumple) + train_data['seq'] = train_data['seq'].apply(get_id_from_list) + train_data['seq_unpad']=train_data['seq_unpad'].apply(get_id_from_list) + return train_data \ No newline at end of file diff --git a/data/ref/lastfm/Test_data.df b/data/ref/lastfm/Test_data.df new file mode 100644 index 0000000000000000000000000000000000000000..e4a9572f55d2284fc99b973fee2f36158de5c815 --- /dev/null +++ b/data/ref/lastfm/Test_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cac058a2842b2a3ed4d39ed1fa0a742f5034a23c9851a2ffc157b4845d703570 +size 6673 diff --git a/data/ref/lastfm/Val_data.df b/data/ref/lastfm/Val_data.df new file mode 100644 index 0000000000000000000000000000000000000000..9947214a5ba6e8b05024a059dc2668de2de1aa10 --- /dev/null +++ b/data/ref/lastfm/Val_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92a1ddb65ebdeff999f910b65660eb3d8c7cd85e6a19308d80c429481839f8b3 +size 6690 diff --git a/data/ref/lastfm/id2name.txt b/data/ref/lastfm/id2name.txt new file mode 100644 index 0000000000000000000000000000000000000000..51c03fbb6ce96ceebaf8357d82b0b9402be1d4cc --- /dev/null +++ b/data/ref/lastfm/id2name.txt @@ -0,0 +1,4606 @@ +0::Morcheeba +1::Enigma +2::Café Del Mar +3::Fleetwood Mac +4::China Crisis +5::Loscil +6::Chicane +7::Sigue Sigue Sputnik +8::Duran Duran +9::Air +10::Röyksopp +11::Moby +12::Depeche Mode +13::Groove Armada +14::INXS +15::Deep Forest +16::Porcupine Tree +17::De/Vision +18::Radiohead +19::VAST +20::Michael Jackson +21::God Is an Astronaut +22::Pink Floyd +23::Planet Funk +24::Scissor Sisters +25::Mew +26::Stereophonics +27::Placebo +28::Infected Mushroom +29::Delerium +30::Roxette +31::Paradise Lost +32::Jamiroquai +33::James Blunt +34::Reamonn +35::Opeth +36::Elton John +37::Tears for Fears +38::Death Cab for Cutie +39::Savage Garden +40::Darren Hayes +41::Explosions in the Sky +42::AC/DC +43::Apocalyptica +44::Megadeth +45::Dream Theater +46::Tiësto +47::The Darkness +48::VNV Nation +49::Thirteen Senses +50::Dave Gahan +51::Apparat +52::Def Leppard +53::Zero 7 +54::Dope +55::Audioslave +56::Charon +57::Amorphis +58::Pain +59::Sentenced +60::Blank & Jones +61::Mesh +62::Keane +63::Muse +64::Bright Eyes +65::Tom Waits +66::Gogol Bordello +67::CAKE +68::Jeff Buckley +69::Sparklehorse +70::Modest Mouse +71::Sunset Rubdown +72::Nine Inch Nails +73::Clap Your Hands Say Yeah +74::Manu Chao +75::Belle and Sebastian +76::John Lennon +77::Primal Scream +78::The Velvet Underground +79::Bon Jovi +80::Johann Sebastian Bach +81::Weezer +82::Imogen Heap +83::Janis Joplin +84::Oh No Oh My +85::The Cramps +86::Panda Bear +87::Gavin DeGraw +88::Wilco +89::Ben Kweller +90::Everlast +91::Menomena +92::Turin Brakes +93::DIR EN GREY +94::My Chemical Romance +95::Travis +96::The Killers +97::Tina Turner +98::Katatonia +99::Skillet +100::宇多田ヒカル +101::浜崎あゆみ +102::UVERworld +103::Linkin Park +104::中島美嘉 +105::GACKT +106::L'Arc~en~Ciel +107::雅-MIYAVI- +108::The All-American Rejects +109::The Rasmus +110::HYDE +111::Simple Plan +112::30 Seconds to Mars +113::Three Days Grace +114::Seether +115::Lostprophets +116::HIM +117::Korn +118::Within Temptation +119::Shakira +120::Epica +121::Nickelback +122::Noir Désir +123::Tool +124::Hawthorne Heights +125::Snow Patrol +126::Jimmy Eat World +127::Ricky Martin +128::Ryan Adams +129::Shayne Ward +130::Sting +131::Sex Pistols +132::Hoobastank +133::They Might Be Giants +134::Rie fu +135::ギルガメッシュ +136::ムック +137::Il Divo +138::Josh Groban +139::倖田來未 +140::Type O Negative +141::Lonestar +142::KT Tunstall +143::Vanessa Carlton +144::Hinder +145::Phil Collins +146::Melt-Banana +147::Goo Goo Dolls +148::Krypteria +149::Paula DeAnda +150::Saliva +151::Seether (Feat. Amy Lee) +152::Puddle of Mudd +153::Staind +154::Royal Hunt +155::Dream Evil +156::Olivia +157::Juno Reactor +158::Polysics +159::O-Zone +160::Mark Lanegan +161::12012 +162::Sadie +163::Sami Yusuf +164::Massari +165::Saybia +166::Beirut +167::Arcade Fire +168::Babyshambles +169::The Decemberists +170::The National +171::Sigur Rós +172::The Libertines +173::Kate Nash +174::Wolf Parade +175::Animal Collective +176::The Fray +177::The Shins +178::Lady Gaga +179::Green Day +180::Nirvana +181::Mariah Carey +182::JoJo +183::Backstreet Boys +184::Jesse McCartney +185::Justin Bieber +186::Usher +187::Nick Carter +188::Metro Station +189::Jeremih +190::Fall Out Boy +191::Kristinia DeBarge +192::Paris Hilton +193::50 Cent +194::New Kids on the Block +195::Дима Билан +196::London After Midnight +197::Psyclon Nine +198::The Crüxshadows +199::KMFDM +200::Mindless Self Indulgence +201::Daft Punk +202::Goldfrapp +203::Madonna +204::Dido +205::Gorillaz +206::The Cure +207::Poets of the Fall +208::OneRepublic +209::System of a Down +210::The Beatles +211::Thom Yorke +212::Massive Attack +213::2Pac +214::Rihanna +215::Britney Spears +216::Jennifer Lopez +217::Katy Perry +218::P!nk +219::Black Eyed Peas +220::Hilary Duff +221::Fergie +222::Ashley Tisdale +223::Chris Brown +224::Kanye West +225::Avril Lavigne +226::Taylor Swift +227::The Pussycat Dolls +228::Evanescence +229::Akira Yamaoka +230::blink-182 +231::Bat for Lashes +232::The Smashing Pumpkins +233::3OH!3 +234::Ke$ha +235::Craig David +236::Eminem +237::Ne-Yo +238::The Birthday Massacre +239::Limp Bizkit +240::Fort Minor +241::Funeral for a Friend +242::Finch +243::Cold +244::Papa Roach +245::Paramore +246::Flyleaf +247::Bullet for My Valentine +248::Angels & Airwaves +249::LaFee +250::In Flames +251::Anathema +252::Saosin +253::Tracktor Bowling +254::Pitchshifter +255::P.O.D. +256::U2 +257::Deftones +258::Ill Niño +259::Clan of Xymox +260::Celldweller +261::Static-X +262::Fluke +263::happysad +264::Lacrimosa +265::Lindsay Lohan +266::Good Charlotte +267::The Used +268::Maroon 5 +269::Adam Lambert +270::Kid Cudi +271::Owl City +272::The Pretty Reckless +273::Metallica +274::##### +275::Fear Factory +276::Rise Against +277::Killswitch Engage +278::Jane's Addiction +279::Tiamat +280::Nightwish +281::Sixpence None the Richer +282::t.A.T.u. +283::Disturbed +284::Jem +285::Kerli +286::Bruno Mars +287::Slipknot +288::Myslovitz +289::Björk +290::Rammstein +291::A Perfect Circle +292::Joe Satriani +293::Stone Sour +294::Editors +295::Billy Talent +296::Silverstein +297::The Red Jumpsuit Apparatus +298::Alesana +299::Senses Fail +300::Story of the Year +301::Tactical Sekt +302::Sepultura +303::The Offspring +304::Akon +305::B.o.B +306::Black Rebel Motorcycle Club +307::Lykke Li +308::Jay-Z +309::Black Veil Brides +310::Tokio Hotel +311::Oomph! +312::Guano Apes +313::Red +314::Breaking Benjamin +315::Thousand Foot Krutch +316::Jay-Z and Linkin Park +317::Hollywood Undead +318::Cypress Hill +319::Lacuna Coil +320::September +321::Gregorian +322::OK Go +323::Fightstar +324::Godsmack +325::Keith Urban +326::Rascal Flatts +327::Brooks & Dunn +328::Scooter +329::Thursday +330::Bloodhound Gang +331::Robert Miles +332::Automatic Loveletter +333::Underoath +334::Lupe Fiasco +335::Dead by April +336::Adema +337::Dead by Sunrise +338::Faktion +339::We Are the Fallen +340::Coma +341::Drowning Pool +342::Drake +343::Sky Ferreira +344::The Magic Numbers +345::Mary Elizabeth McGlynn +346::Brand New +347::Will Smith +348::Daughtry +349::12 Stones +350::Ferry Corsten +351::Silversun Pickups +352::Scary Kids Scaring Kids +353::Xandria +354::Kill Hannah +355::Taking Back Sunday +356::Hayden Panettiere +357::Линда +358::Smile Empty Soul +359::Jason Derülo +360::O.N.A. +361::Chylińska +362::Alexandre Desplat +363::Emilie Autumn +364::Fuel +365::Stateless +366::Robert Pattinson +367::Trading Yesterday +368::Armor for Sleep +369::Bear McCreary +370::I Am Ghost +371::Xzibit +372::Helios +373::Emery +374::Alexi Murdoch +375::Anya Marina +376::Mudvayne +377::Chingy +378::Plumb +379::Taproot +380::Jason Walker +381::Mark Ronson +382::Gavin Rossdale +383::Blindside +384::Amy Lee +385::James Newton Howard +386::Band of Skulls +387::Sea Wolf +388::The Letter Black +389::Ja Rule +390::Holly Brook +391::Hurricane Bells +392::Kylie Minogue +393::Ashlee Simpson +394::Lily Allen +395::Heidi Montag +396::New Order +397::Japan +398::The Smiths +399::Joy Division +400::The Sonics +401::Southern Culture on the Skids +402::Small Faces +403::The Detroit Cobras +404::The Pretty Things +405::Talking Heads +406::The Stranglers +407::The Clash +408::Roxy Music +409::Alphaville +410::Blondie +411::Frank Sinatra +412::The Human League +413::Information Society +414::Pet Shop Boys +415::Ultravox +416::Yazoo +417::Heaven 17 +418::Siouxsie and the Banshees +419::Misfits +420::Dean Martin +421::Dick Dale +422::Motörhead +423::Devo +424::Split Enz +425::The Cars +426::Dead or Alive +427::Oingo Boingo +428::Eurythmics +429::Visage +430::Magazine +431::Madness +432::Ska-P +433::The Specials +434::Culture Club +435::Elvis Costello +436::Sublime +437::A Flock of Seagulls +438::Echo & The Bunnymen +439::Cab Calloway +440::The B-52's +441::Butthole Surfers +442::Nekromantix +443::The Byrds +444::The Mighty Mighty Bosstones +445::Peggy Lee +446::Corona +447::The Jam +448::Joe Jackson +449::Messer Chups +450::The Meteors +451::Adam and the Ants +452::The Zombies +453::Barón Rojo +454::Missing Persons +455::Squeeze +456::Akurat +457::The Brian Setzer Orchestra +458::Stray Cats +459::Goldfinger +460::Mecano +461::Men at Work +462::Squirrel Nut Zippers +463::Harry Connick, Jr. +464::Dick Dale and His Del-Tones +465::The Kings of Nuthin' +466::B-Movie +467::Anne Clark +468::Mad Sin +469::Calabrese +470::The Seeds +471::The Litter +472::Big Bad Voodoo Daddy +473::13th Floor Elevators +474::Holly Golightly +475::IRA +476::The Troggs +477::Duffy +478::Allison Iraheta +479::Lena +480::Jónsi +481::Kalomoira +482::Άννα Βισση +483::Inna +484::Jewel +485::Fresno +486::Hurts +487::Miranda Cosgrove +488::Wanessa +489::The Script +490::Alexander Rybak +491::Cinema Bizarre +492::Edyta Górniak +493::ZAZ +494::Cary Brothers +495::Karl Wolf +496::Boris +497::Fever Ray +498::Fennesz +499::I Set My Friends On Fire +500::Blue +501::Jessica Simpson +502::RBD +503::Mandy Moore +504::Paulina Rubio +505::Fey +506::Dannii Minogue +507::Thalía +508::A*Teens +509::Geri Halliwell +510::Atomic Kitten +511::Andrés Calamaro +512::Laibach +513::David Bowie +514::Einstürzende Neubauten +515::Jesu +516::Soundgarden +517::Stone Temple Pilots +518::Killing Joke +519::Bauhaus +520::Nitzer Ebb +521::Ladytron +522::Suede +523::My Bloody Valentine +524::Fugazi +525::Godflesh +526::Prong +527::Filter +528::Lard +529::Noisettes +530::VV Brown +531::Sonique +532::Robbie Williams +533::Christina Aguilera +534::Leona Lewis +535::Beyoncé +536::Justin Timberlake +537::Monrose +538::Cheryl Cole +539::Sarah Connor +540::M. Pokora +541::Taio Cruz +542::Girls Aloud +543::Rachel Stevens +544::Take That +545::Iron Maiden +546::Savatage +547::Bruce Dickinson +548::Children of Bodom +549::Andre Matos +550::Viper +551::Matanza +552::Nevermore +553::Enya +554::The Ting Tings +555::Pearl Jam +556::Isis +557::Tori Amos +558::The Mars Volta +559::Panic! At the Disco +560::The Fall of Troy +561::Dżem +562::Hard-Fi +563::Bond +564::Sophie Ellis-Bextor +565::Rick Astley +566::Solar Stone +567::Ian Van Dahl +568::Guru Josh Project +569::Morrissey +570::Frank Zappa +571::Plaid +572::Underworld +573::Thomas Newman +574::Junkie XL +575::Sasha +576::Glee Cast +577::All Time Low +578::Runner Runner +579::And One +580::Crystal Castles +581::Anything Box +582::Recoil +583::Hubert Kah +584::Sally Shapiro +585::Ayria +586::Red Flag +587::The Frozen Autumn +588::Cause & Effect +589::Wham! +590::Billy Idol +591::Provision +592::Peter Murphy +593::Kaizers Orchestra +594::Kent +595::Iggy Pop +596::Yann Tiersen +597::Rush +598::Frédéric Chopin +599::Incubus +600::Claude Debussy +601::Faith No More +602::Wolfgang Amadeus Mozart +603::John Petrucci & Jordan Rudess +604::Ludwig van Beethoven +605::The String Quartet +606::Yes +607::Mike Oldfield +608::Zu +609::Temple of the Dog +610::Bob Dylan +611::Miles Davis +612::John Coltrane +613::Thelonious Monk +614::Florence + the Machine +615::The Cinematic Orchestra +616::Yeasayer +617::Tera Melos +618::Bill Evans +619::Animals as Leaders +620::Arcturus +621::Clutch +622::Chet Baker +623::Madeleine Peyroux +624::Charlie Parker +625::Charles Mingus +626::Herbie Hancock +627::Pat Metheny +628::Bring Me The Horizon +629::Escape The Fate +630::MALICE MIZER +631::Marilyn Manson +632::Coldplay +633::Nas +634::Mos Def +635::Gang Starr +636::The Roots +637::A Tribe Called Quest +638::Sufjan Stevens +639::Saul Williams +640::Sunn O))) +641::Vampire Weekend +642::Sonic Youth +643::Masta Ace +644::De La Soul +645::Jedi Mind Tricks +646::ASIAN KUNG-FU GENERATION +647::MF DOOM +648::N.W.A +649::Mike Patton +650::Mr. Bungle +651::Public Enemy +652::Kool G Rap +653::Talib Kweli +654::Wu-Tang Clan +655::Black Kids +656::Merzbow +657::Why? +658::Method Man +659::Drudkh +660::Bubba Sparxxx +661::Del tha Funkee Homosapien +662::Wolves in the Throne Room +663::Orgy +664::Foo Fighters +665::Combichrist +666::Grendel +667::Agonoize +668::Hocico +669::Feindflug +670::Amduscia +671::Dawn of Ashes +672::She Wants Revenge +673::Headscan +674::Rotersand +675::Blutengel +676::Wynardtage +677::Unheilig +678::[:SITD:] +679::L'Âme Immortelle +680::Terminal Choice +681::Suicidal Romance +682::Liquid Divine +683::Melotron +684::Evil's Toy +685::Vibrasphere +686::Bamboo Forest +687::Miss Construction +688::Samsas Traum +689::Zombie Girl +690::Nurzery [Rhymes] +691::Nachtmahr +692::ASP +693::Subway to Sally +694::Caustic +695::Diary of Dreams +696::xotox +697::Tamtrum +698::Covenant +699::Icon of Coil +700::Funker Vogt +701::God Module +702::Noisuf-X +703::Reaper +704::Portishead +705::David Guetta +706::Cascada +707::Paul van Dyk +708::ATB +709::Skeletal Family +710::Dragonette +711::Armin van Buuren +712::Yelle +713::Kyau vs. Albert +714::Novaspace +715::OceanLab +716::Groove Coverage +717::Fragma +718::Sylver +719::Markus Schulz +720::IAMX +721::Hot Chip +722::Cryo +723::Front Line Assembly +724::Haujobb +725::mind.in.a.box +726::Absurd Minds +727::Seabound +728::Colony 5 +729::Apoptygma Berzerk +730::Suicide Commando +731::Neuroticfish +732::Assemblage 23 +733::Edge of Dawn +734::Cosmic Gate +735::Above & Beyond +736::Pride and Fall +737::E-Craft +738::Code 64 +739::Angels & Agony +740::4 Strings +741::XP8 +742::Bruderschaft +743::Syrian +744::Digitalism +745::Justice +746::Armand van Helden +747::Simian Mobile Disco +748::MSTRKRFT +749::The Sisters of Mercy +750::Holly Valance +751::The Knife +752::Porcelain and the Tramps +753::Dope Stars Inc. +754::Ashbury Heights +755::Vive la Fête +756::Diorama +757::Belanova +758::Alice in Videoland +759::Theatre of Tragedy +760::ADULT. +761::Annie +762::Front 242 +763::Robots in Disguise +764::Alien Sex Fiend +765::Christian Death +766::Helalyn Flowers +767::Shiny Toy Guns +768::Claire Voyant +769::Hungry Lucy +770::Minerve +771::Client +772::Frozen Plasma +773::Sohodolls +774::Tiga +775::Vitalic +776::Fischerspooner +777::Sebastian +778::Project Pitchfork +779::Deine Lakaien +780::Panzer AG +781::Imperative Reaction +782::In Strict Confidence +783::Decoded Feedback +784::Le Tigre +785::Paul Oakenfold +786::Cinema Strange +787::Uffie +788::Aesthetic Perfection +789::Safri Duo +790::Peaches +791::Blaqk Audio +792::Alien Vampires +793::Heimataerde +794::David Vendetta +795::Rank 1 +796::Faderhead +797::Destroid +798::Blind Passengers +799::Beborn Beton +800::Faith and the Muse +801::Miss Kittin +802::Chicks on Speed +803::BT +804::Darude +805::Switchblade Symphony +806::Lasgo +807::Kittie +808::Michigan +809::Felix da Housecat +810::Pulsedriver +811::Lo-Fi-Fnk +812::Welle:Erdball +813::T.O.Y. +814::Electrocute +815::Pzychobitch +816::Hallucinogen +817::Astral Projection +818::Razed in Black +819::Dismantled +820::Amon Amarth +821::Kreator +822::Queen +823::Sodom +824::Flotsam and Jetsam +825::Sabaton +826::Hirax +827::Venom +828::Biomechanical +829::Turisas +830::Warbringer +831::Dismember +832::Cut Copy +833::Katie Melua +834::Garbage +835::Scorpions +836::a-ha +837::Blur +838::Arctic Monkeys +839::Bloc Party +840::Interpol +841::Toni Braxton +842::Bob Marley +843::Whitney Houston +844::Mary J. Blige +845::Brandy +846::Monica +847::Kelly Clarkson +848::Alanis Morissette +849::Cobra Starship +850::Cher +851::Wir sind Helden +852::Tokyo Police Club +853::The Kills +854::The Strokes +855::Yeah Yeah Yeahs +856::She & Him +857::Ra Ra Riot +858::Local Natives +859::3 Doors Down +860::Gwen Stefani +861::La Roux +862::Alphabeat +863::Oasis +864::Space Cowboy +865::Pitty +866::Ellie Goulding +867::The Kinks +868::Chuck Berry +869::Ennio Morricone +870::Kings of Convenience +871::Elliott Smith +872::Squarepusher +873::of Montreal +874::Neil Young +875::The Veronicas +876::Marina & the Diamonds +877::The xx +878::Kaiser Chiefs +879::Electric Light Orchestra +880::Johnny Cash +881::Buena Vista Social Club +882::Ozzy Osbourne +883::1200 Micrograms +884::Autechre +885::Carbon Based Lifeforms +886::Casino Versus Japan +887::Arovane +888::Proem +889::The Crystal Method +890::Ochre +891::Belinda +892::August Burns Red +893::Slayer +894::Alice in Chains +895::Pixies +896::The Doors +897::Tegan and Sara +898::Amy Winehouse +899::Kamelot +900::The Cardigans +901::Yanni +902::At the Drive-In +903::Simple Minds +904::The Kooks +905::Alesha Dixon +906::Alan Silvestri +907::Franz Ferdinand +908::Patrick Wolf +909::Phoenix +910::The Police +911::Roy Orbison +912::Venetian Snares +913::Shpongle +914::Skank +915::The Beach Boys +916::Samael +917::Black Sabbath +918::White Lies +919::Freemasons +920::Calvin Harris +921::Pendulum +922::Genesis +923::Paul McCartney +924::The Jimi Hendrix Experience +925::ABBA +926::Matt & Kim +927::Antonio Vivaldi +928::Just Jack +929::Natalie Imbruglia +930::The Last Shadow Puppets +931::Morbid Angel +932::Fleet Foxes +933::Jimi Hendrix +934::Motel +935::Clint Mansell +936::Brian Eno +937::Hammock +938::Soundtrack +939::Little Joy +940::UNKLE +941::5'nizza +942::Thrice +943::Gnarls Barkley +944::Flying Lotus +945::Raekwon +946::Four Tet +947::Prefuse 73 +948::The Avalanches +949::The Black Keys +950::Metronomy +951::Coil +952::Steve Jablonsky +953::Lara Fabian +954::Yiruma +955::M.I.A. +956::Brown Eyed Girls +957::Brandon Flowers +958::Serge Gainsbourg +959::Beach House +960::AFX +961::Jane Air +962::Wisp +963::Dr. Dre +964::Hande Yener +965::Aerosmith +966::Monster Magnet +967::Destroyer +968::Danny Elfman +969::Basshunter +970::Eric Prydz +971::Spice Girls +972::The Drums +973::Idiot Pilot +974::Biffy Clyro +975::Foals +976::Slash +977::will.i.am +978::City and Colour +979::VersaEmerge +980::Ella Fitzgerald +981::The Flashbulb +982::Amon Tobin +983::µ-Ziq +984::Chris Clark +985::Kettel +986::Clark +987::Tycho +988::Bola +989::The Future Sound of London +990::Wagon Christ +991::Telefon Tel Aviv +992::DJ Shadow +993::Lenny Kravitz +994::Distance +995::The Dead Weather +996::The Dust Brothers +997::Serj Tankian +998::Wintersun +999::The Whitest Boy Alive +1000::Colby O'Donis +1001::DJ Krush +1002::Sébastien Tellier +1003::Flunk +1004::DJ Vadim +1005::Paradiso Girls +1006::Cansei de Ser Sexy +1007::Kate Bush +1008::Jon Brion +1009::Slagsmålsklubben +1010::Blonde Redhead +1011::Steven Wilson +1012::Jet +1013::M83 +1014::No-Man +1015::Sheryl Crow +1016::[unknown] +1017::Carole King +1018::Rainbow +1019::Róisín Murphy +1020::Biosphere +1021::Unter Null +1022::Jack Off Jill +1023::Tim Hecker +1024::Broken Bells +1025::Ratatat +1026::Soulfly +1027::The Horrors +1028::Marilyn Monroe +1029::Lumen +1030::Танцы Минус +1031::CocoRosie +1032::Wings +1033::Alcazar +1034::The Presets +1035::Mr. Oizo +1036::Chromeo +1037::Freddie Mercury +1038::Morphine +1039::The Dandy Warhols +1040::Raul Seixas +1041::The Cinematics +1042::The Postal Service +1043::UFO +1044::Die Ärzte +1045::Switchfoot +1046::Europe +1047::The Thermals +1048::Audio Bullys +1049::The Yardbirds +1050::Tricky +1051::Gin Blossoms +1052::Junior Senior +1053::Dusty Springfield +1054::Jamie Cullum +1055::Junior Boys +1056::Cujo +1057::ISAN +1058::Sandra +1059::Гражданская Оборона +1060::Nicholas Hooper +1061::Charlotte Sometimes +1062::ILS +1063::Survivor +1064::StoneBridge +1065::Kid Loco +1066::Nancy Sinatra +1067::System 7 +1068::Yo La Tengo +1069::Subheim +1070::Arcana +1071::If These Trees Could Talk +1072::Peter Bjorn and John +1073::LMFAO +1074::Birdy Nam Nam +1075::Godspeed You! Black Emperor +1076::Stars of the Lid +1077::Christ. +1078::Bibio +1079::N*E*R*D +1080::Theory of a Deadman +1081::Tyler Bates +1082::Straylight Run +1083::Fanfarlo +1084::Something Corporate +1085::Nick Lachey +1086::Black Moth Super Rainbow +1087::Mirah +1088::Kate Ryan +1089::Manchester Orchestra +1090::Hans Zimmer & James Newton Howard +1091::RJD2 +1092::Ulrich Schnauss +1093::D12 +1094::Young Buck +1095::Albert Hammond, Jr. +1096::Aztec Camera +1097::Clinic +1098::Twista +1099::The Books +1100::Hercules and Love Affair +1101::B.B. King +1102::Moderat +1103::Eva Cassidy +1104::Jerry Goldsmith +1105::Axwell +1106::Empire of the Sun +1107::Plan B +1108::The Black Ghosts +1109::Suicidal Tendencies +1110::Hugh Laurie +1111::Detektivbyrån +1112::Gescom +1113::Polygon Window +1114::The Tuss +1115::Luke Vibert +1116::Clueso +1117::I Blame Coco +1118::Tunng +1119::Xavier Naidoo +1120::The Dø +1121::The Allman Brothers Band +1122::The Golden Filter +1123::Lil' Kim +1124::m-flo +1125::Kleerup +1126::Neon Indian +1127::Cinnamon Chasers +1128::Garou +1129::The Coral +1130::Secret Garden +1131::Trent Reznor +1132::Nancy Ajram +1133::James Taylor +1134::Lightning Bolt +1135::iiO +1136::Miss Kittin & The Hacker +1137::David Arnold +1138::Desmond Dekker +1139::Jan Delay +1140::Meat Beat Manifesto +1141::Die Fantastischen Vier +1142::Young Jeezy +1143::Amorphous Androgynous +1144::Steve Winwood +1145::Skalpel +1146::Death in Vegas +1147::Wavves +1148::Bear in Heaven +1149::Embrace +1150::Xavier Rudd +1151::Monolake +1152::John Powell +1153::Kevin Devine +1154::I Am Kloot +1155::Klaus Schulze +1156::Paul Desmond +1157::Dexter Gordon +1158::Dan Black +1159::Azure Ray +1160::Tiger Lou +1161::Trevor Rabin +1162::Sub Focus +1163::Bag Raiders +1164::Silver Jews +1165::India.Arie +1166::Adorable +1167::Fettes Brot +1168::Olly Murs +1169::Discovery +1170::Skrillex +1171::Dexys Midnight Runners +1172::Swayzak +1173::TERIYAKI BOYZ +1174::Leftfield +1175::ASHES dIVIDE +1176::John B +1177::Marco Beltrami +1178::Remy Ma +1179::Trina +1180::Shawnna +1181::Sixtoo +1182::Plastikman +1183::Dirty Vegas +1184::Benassi Bros. +1185::Agoria +1186::Green Sun +1187::The KLF +1188::Anahí +1189::Dulce María +1190::Christian Chávez +1191::Nicki Minaj +1192::Enrique Iglesias +1193::Red Hot Chili Peppers +1194::Bryan Adams +1195::Kid Abelha +1196::Jordin Sparks +1197::Alicia Keys +1198::Katharine McPhee +1199::Kat DeLuna +1200::Nelly Furtado +1201::Ciara +1202::Keri Hilson +1203::Jonas Brothers +1204::T.I. +1205::Colbie Caillat +1206::Jason Mraz +1207::Brad Paisley +1208::Sugarland +1209::Aaron Carter +1210::*NSYNC +1211::Miley Cyrus +1212::No Doubt +1213::Flo Rida +1214::Demi Lovato +1215::Selena Gomez & the Scene +1216::R.E.M. +1217::Emily Osment +1218::Cyndi Lauper +1219::Kelly Osbourne +1220::Dixie Chicks +1221::Timbaland +1222::Vanessa Hudgens +1223::Boys Like Girls +1224::Camp Rock +1225::Ace of Base +1226::Lady Antebellum +1227::Pitbull +1228::Selena Gomez +1229::Carrie Underwood +1230::Rednex +1231::Big Time Rush +1232::Gloriana +1233::Amy Macdonald +1234::Metric +1235::Jennette McCurdy +1236::Keke Palmer +1237::Dolly Parton +1238::Billy Ray Cyrus +1239::Pato Fu +1240::Cássia Eller +1241::Yellowcard +1242::Adele +1243::Leighton Meester +1244::Simon Curtis +1245::Two Door Cinema Club +1246::Jessie James +1247::Dierks Bentley +1248::High School Musical +1249::Kris Allen +1250::Christina Perri +1251::James Morrison +1252::Plain White T's +1253::Aqua +1254::Jason Aldean +1255::Blake Shelton +1256::Gary Allan +1257::Kenny Chesney +1258::Lee Ann Womack +1259::Matisyahu +1260::The Lonely Island +1261::Hanson +1262::Tila Tequila +1263::The Spill Canvas +1264::Drake Bell +1265::Edward Maya +1266::Ladyhawke +1267::Gabriella Cilmi +1268::Nando Reis +1269::TLC +1270::Paula Abdul +1271::Kellie Pickler +1272::Nelly +1273::John Denver +1274::Miranda! +1275::Boney M. +1276::Matt Nathanson +1277::Jay Sean +1278::Charice +1279::Flora +1280::Sean Kingston +1281::The Outfield +1282::Iyaz +1283::Fat Joe +1284::Céline Dion +1285::Ana Carolina +1286::The Faint +1287::The Cranberries +1288::Beck +1289::Cassie +1290::Ashanti +1291::Nicole Scherzinger +1292::Destiny's Child +1293::The Asteroids Galaxy Tour +1294::Los Campesinos! +1295::Mika +1296::MGMT +1297::Stevie Wonder +1298::Tiziano Ferro +1299::David Bisbal +1300::Wisin & Yandel +1301::Cherish +1302::Santigold +1303::Reba McEntire +1304::S Club 7 +1305::Fool's Garden +1306::Gloria Estefan +1307::Aaliyah +1308::Celia Cruz +1309::Extreme +1310::Bananarama +1311::UB40 +1312::Mr. Big +1313::Barry White +1314::Sean Paul +1315::KC and the Sunshine Band +1316::Phantom Planet +1317::Counting Crows +1318::Violent Femmes +1319::A.R. Rahman +1320::Soda Stereo +1321::DJ BoBo +1322::Modern Talking +1323::Gigi D'Agostino +1324::Lila Downs +1325::Tom Petty and the Heartbreakers +1326::Does It Offend You, Yeah? +1327::The Bangles +1328::Fito Páez +1329::Calle 13 +1330::Missy Elliott +1331::Selena +1332::Estopa +1333::Fabolous +1334::Los Rodríguez +1335::The Weepies +1336::Lissy Trullie +1337::Bobby Valentino +1338::Fugees +1339::Kimya Dawson +1340::The Little Ones +1341::Bob Sinclar +1342::Kabah +1343::Don Omar +1344::Henry Purcell +1345::White Rabbits +1346::Marc-Antoine Charpentier +1347::Luigi Boccherini +1348::Tomaso Giovanni Albinoni +1349::Giovanni Battista Pergolesi +1350::Hot Chocolate +1351::Culture Beat +1352::The Chemical Brothers +1353::Led Zeppelin +1354::Sam Cooke +1355::Deltron 3030 +1356::Too $hort +1357::Mudhoney +1358::nevershoutnever! +1359::David Cook +1360::David Archuleta +1361::Shania Twain +1362::The Who +1363::The Rolling Stones +1364::Enter Shikari +1365::Hannah Montana +1366::Scar Symmetry +1367::Patsy Cline +1368::Elvis Presley +1369::The Cheetah Girls +1370::Aly & AJ +1371::Everlife +1372::Weird Al Yankovic +1373::Liz Phair +1374::Nat King Cole +1375::Cryptopsy +1376::Louis Armstrong +1377::Relient K +1378::Wale +1379::Pink Martini +1380::Air Supply +1381::Judy Garland +1382::Bing Crosby +1383::Allstar Weekend +1384::Andy Williams +1385::Dinah Washington +1386::Jimmy Buffett +1387::Bobby Darin +1388::Eartha Kitt +1389::Martin L. Gore +1390::Judas Priest +1391::Tarot +1392::Deep Purple +1393::Mogwai +1394::Puscifer +1395::Eicca Toppinen +1396::The Cult +1397::Therion +1398::Eisbrecher +1399::Craig Armstrong +1400::Steppenwolf +1401::Vangelis +1402::Agua de Annique +1403::Rob Dougan +1404::Skunk Anansie +1405::John Murphy +1406::A Silver Mt. Zion +1407::Joanna Newsom +1408::Bonobo +1409::Saxon Shore +1410::Yndi Halda +1411::Jeniferever +1412::Móveis Coloniais de Acaju +1413::Era +1414::Skid Row +1415::Tarja +1416::菅野よう子 +1417::Tristania +1418::Queensrÿche +1419::Creedence Clearwater Revival +1420::George Harrison +1421::Chico Buarque +1422::Maria Rita +1423::Rita Lee +1424::Eddie Vedder +1425::Esbjörn Svensson Trio +1426::Andrew Lloyd Webber +1427::Feist +1428::Billie Holiday +1429::Meiko +1430::Mallu Magalhães +1431::Cazuza +1432::Vanguart +1433::Amiina +1434::Joe Cocker +1435::William Fitzsimmons +1436::Joshua Radin +1437::Zé Ramalho +1438::Firehouse +1439::Tom Zé +1440::Gregory and the Hawk +1441::Melody Gardot +1442::Richard Marx +1443::Eric Clapton +1444::Maurice Ravel +1445::The Verve +1446::Сплин +1447::Archive +1448::Indochine +1449::Nightmares on Wax +1450::The Shadows +1451::Simon & Garfunkel +1452::Peter Gabriel +1453::Diana Krall +1454::Arvo Pärt +1455::Мумий Тролль +1456::Belinda Carlisle +1457::Gabriel Fauré +1458::Crustation +1459::Mandalay +1460::Sergei Prokofiev +1461::Dmitri Shostakovich +1462::Dinosaur Pile-Up +1463::Robert Schumann +1464::Edvard Grieg +1465::Carpathian Forest +1466::George Michael +1467::Spandau Ballet +1468::Nik Kershaw +1469::ABC +1470::Damien Rice +1471::Queens of the Stone Age +1472::Bob Marley & The Wailers +1473::Klaxons +1474::Howlin' Wolf +1475::Ray Charles +1476::Muddy Waters +1477::Prince +1478::Beastie Boys +1479::The White Stripes +1480::Dire Straits +1481::Gotthard +1482::Eagles +1483::Alice Cooper +1484::Dark Tranquillity +1485::At the Gates +1486::Atreyu +1487::Pantera +1488::Lamb of God +1489::Kyuss +1490::John Williams +1491::Helloween +1492::Stratovarius +1493::Journey +1494::Testament +1495::Death +1496::Yngwie Malmsteen +1497::Blind Guardian +1498::Kasabian +1499::The Donnas +1500::Iron Butterfly +1501::Orchestral Manoeuvres in the Dark +1502::Kraftwerk +1503::Melvins +1504::Guns N' Roses +1505::Mayhem +1506::Carcass +1507::Gamma Ray +1508::Annihilator +1509::Tenacious D +1510::W.A.S.P. +1511::Kansas +1512::The Mamas & The Papas +1513::Ramones +1514::Anthrax +1515::The Baseballs +1516::Blind Melon +1517::Avenged Sevenfold +1518::Hans Zimmer +1519::Mötley Crüe +1520::T. Rex +1521::Syd Barrett +1522::The Runaways +1523::Ratt +1524::Stryper +1525::Patti Smith +1526::Jerry Cantrell +1527::The Black Crowes +1528::L7 +1529::Gary Numan +1530::Thomas Dolby +1531::Rage Against the Machine +1532::Blue Öyster Cult +1533::Frankie Goes to Hollywood +1534::Heart +1535::Twisted Sister +1536::Dio +1537::KISS +1538::Van Halen +1539::Joan Jett +1540::Airbourne +1541::D-A-D +1542::Howard Shore +1543::Boston +1544::Fantômas +1545::Kajagoogoo +1546::Lita Ford +1547::Vixen +1548::Hanoi Rocks +1549::Whitesnake +1550::Joan Jett and the Blackhearts +1551::Velvet Revolver +1552::CRASHDÏET +1553::Cheap Trick +1554::Sweet +1555::Lynyrd Skynyrd +1556::Manowar +1557::Thin Lizzy +1558::Cream +1559::Warrant +1560::Stevie Ray Vaughan and Double Trouble +1561::Buddy Guy +1562::The Animals +1563::ZZ Top +1564::Buddy Holly +1565::Dokken +1566::The Stooges +1567::Marillion +1568::The Fall +1569::Black Flag +1570::Dead Kennedys +1571::The Adicts +1572::Supergrass +1573::Quiet Riot +1574::David Lee Roth +1575::Saxon +1576::Ugly Kid Joe +1577::L.A. Guns +1578::Hole +1579::Bikini Kill +1580::The Corrs +1581::Uriah Heep +1582::Asia +1583::Dinosaur Jr. +1584::The Vines +1585::Status Quo +1586::Foreigner +1587::Poison +1588::Burzum +1589::Darkthrone +1590::Girlschool +1591::Cathedral +1592::Doro +1593::Cinderella +1594::Lou Reed +1595::Busted +1596::New York Dolls +1597::Kalmah +1598::Cutting Crew +1599::Faster Pussycat +1600::Accept +1601::White Lion +1602::Dropkick Murphys +1603::Diamond Head +1604::Robert Johnson +1605::Eliza Doolittle +1606::Anvil +1607::Winger +1608::Jefferson Airplane +1609::Nena +1610::Men Without Hats +1611::Animotion +1612::Rob Zombie +1613::Jeff Beck +1614::Big Country +1615::Modern English +1616::Gary Moore +1617::The Alan Parsons Project +1618::Tomahawk +1619::Eternal Tears of Sorrow +1620::Sebastian Bach +1621::Loreena McKennitt +1622::Wall of Voodoo +1623::Bow Wow Wow +1624::Agent Orange +1625::Little Walter +1626::George Thorogood & The Destroyers +1627::Great White +1628::Jason Becker +1629::The Buggles +1630::Tesla +1631::Screaming Trees +1632::Bad Company +1633::Steel Panther +1634::Babes in Toyland +1635::Joan Baez +1636::Mother Love Bone +1637::Triumph +1638::Ted Nugent +1639::Mad Season +1640::Voivod +1641::Woody Guthrie +1642::Generation X +1643::Bad English +1644::Impellitteri +1645::Johnny Thunders +1646::Don McLean +1647::Brian May +1648::The Knack +1649::Orbital +1650::Luther Vandross +1651::Quincy Jones +1652::Grace Jones +1653::Boz Scaggs +1654::Brainstorm +1655::The Dining Rooms +1656::Sérgio Mendes +1657::Al Green +1658::A Day to Remember +1659::Pillar +1660::Disciple +1661::Family Force 5 +1662::Fireflight +1663::Talk Talk +1664::Prefab Sprout +1665::Icehouse +1666::Fiction Factory +1667::Jean-Michel Jarre +1668::Howard Jones +1669::Thompson Twins +1670::The Fixx +1671::Level 42 +1672::Erasure +1673::Berlin +1674::The Psychedelic Furs +1675::Parliament +1676::Art of Noise +1677::XTC +1678::Pseudo Echo +1679::Midnight Oil +1680::Shriekback +1681::Wire +1682::Sparks +1683::Yellow Magic Orchestra +1684::John Foxx +1685::Landscape +1686::Scritti Politti +1687::Yello +1688::New Musik +1689::Cabaret Voltaire +1690::LCD Soundsystem +1691::Hall & Oates +1692::Arcadia +1693::The Damned +1694::Soft Cell +1695::The Associates +1696::Propaganda +1697::Go West +1698::Gang of Four +1699::Fad Gadget +1700::Boytronic +1701::Blancmange +1702::Classix Nouveaux +1703::Wang Chung +1704::The The +1705::The Communards +1706::Saga +1707::Telex +1708::!!! +1709::Blue Peter +1710::O.S.T.R. +1711::Kult +1712::Pidżama Porno +1713::Symphony X +1714::Alestorm +1715::Falconer +1716::Star One +1717:::wumpscut: +1718::Electronic +1719::Marc Almond +1720::Pulp +1721::Manic Street Preachers +1722::Wolfsheim +1723::The Good, the Bad & the Queen +1724::Rooney +1725::The Residents +1726::Bee Gees +1727::Tuxedomoon +1728::In Extremo +1729::Deutsch Amerikanische Freundschaft +1730::Dagoba +1731::Throbbing Gristle +1732::Captain Beefheart & His Magic Band +1733::The Legendary Pink Dots +1734::The Power Station +1735::Minus the Bear +1736::The Stone Roses +1737::Angelo Badalamenti +1738::At Vance +1739::The Pipettes +1740::Tocotronic +1741::Datarock +1742::Astor Piazzolla +1743::Oi Va Voi +1744::Electric Six +1745::Jarvis Cocker +1746::Neurotic Outsiders +1747::The Devils +1748::Gloria Gaynor +1749::Flowing Tears +1750::Perfume +1751::Versailles +1752::ルルティア +1753::múm +1754::Aphex Twin +1755::Boards of Canada +1756::Ellen Allien +1757::Daedelus +1758::B. Fleischmann +1759::Booka Shade +1760::Mujuice +1761::edIT +1762::Ellen Allien & Apparat +1763::Frog Pocket +1764::Rotator +1765::Spor +1766::Noisia +1767::Black Sun Empire +1768::The Orb +1769::Ricardo Villalobos +1770::William Basinski +1771::Pole +1772::Deadbeat +1773::Dntel +1774::Add N to (X) +1775::Brothomstates +1776::Dominik Eulberg +1777::Richie Hawtin +1778::Mathew Jonson +1779::Hexstatic +1780::Alva Noto + Ryuichi Sakamoto +1781::Kings of Leon +1782::Joss Stone +1783::Yeni Türkü +1784::Barış Manço +1785::Mor ve Ötesi +1786::Düş Sokağı Sakinleri +1787::Cradle of Filth +1788::Little Richard +1789::HammerFall +1790::Massacration +1791::Creed +1792::The Hellacopters +1793::Backyard Babies +1794::Kelly Rowland +1795::Gloria Trevi +1796::Ludacris +1797::Jennifer Hudson +1798::Michelle Williams +1799::Trey Songz +1800::Pyotr Ilyich Tchaikovsky +1801::Sade +1802::Max Richter +1803::Jack Johnson +1804::Jethro Tull +1805::The Album Leaf +1806::John Mayer +1807::Bruce Springsteen +1808::Trans-Siberian Orchestra +1809::Bill Withers +1810::Five Finger Death Punch +1811::Santana +1812::Smash Mouth +1813::Mike & The Mechanics +1814::Kim Wilde +1815::New Found Glory +1816::Georg Friedrich Händel +1817::Secondhand Serenade +1818::Starsailor +1819::Daddy Yankee +1820::B.J. Thomas +1821::OutKast +1822::Ludovico Einaudi +1823::Norah Jones +1824::Amethystium +1825::Diana Ross +1826::Chris Cornell +1827::Luciano Pavarotti +1828::Sarah Brightman +1829::Andrea Bocelli +1830::Vanessa-Mae +1831::The Rascals +1832::k-os +1833::Islands +1834::Martina McBride +1835::Juanes +1836::Garth Brooks +1837::Little Big Town +1838::Tim McGraw +1839::Faith Hill +1840::Glenn Miller +1841::Reik +1842::George Strait +1843::Alan Jackson +1844::Paul Young +1845::The Doobie Brothers +1846::Van Morrison +1847::LL Cool J +1848::Naked Eyes +1849::Sin Bandera +1850::Ringo Starr +1851::Carpenters +1852::Paul McCartney & Wings +1853::Matchbox Twenty +1854::The Moody Blues +1855::Barbra Streisand +1856::Supertramp +1857::The Jackson 5 +1858::Sarah McLachlan +1859::America +1860::Jordan Pruitt +1861::Tarkan +1862::Alabama +1863::Montgomery Gentry +1864::Ronnie Milsap +1865::Sara Evans +1866::SHeDaisy +1867::Coheed and Cambria +1868::Big & Rich +1869::Sly & The Family Stone +1870::Chris Isaak +1871::Eiffel 65 +1872::Tom Jones +1873::Leaves' Eyes +1874::Lionel Richie +1875::Jars of Clay +1876::The Ataris +1877::Hank Williams +1878::Willie Nelson +1879::Emmylou Harris +1880::All Saints +1881::Jim Croce +1882::The Ventures +1883::Kenny Loggins +1884::Grand Funk Railroad +1885::Alejandro Sanz +1886::The Go-Go's +1887::Adam Ant +1888::Quarterflash +1889::Rick Springfield +1890::Miranda Lambert +1891::Ben Harper +1892::Chicago +1893::LeAnn Rimes +1894::The Ronettes +1895::Jon Secada +1896::Mae +1897::Kellplanet +1898::Afro Celt Sound System +1899::The Presidents of the United States of America +1900::Procol Harum +1901::The Monkees +1902::Jónsi & Alex +1903::Terri Clark +1904::The Avett Brothers +1905::John Fogerty +1906::The Everly Brothers +1907::Ricardo Arjona +1908::The Hollies +1909::The Association +1910::Herman's Hermits +1911::Joni Mitchell +1912::REO Speedwagon +1913::Tina Arena +1914::Kitaro +1915::The Platters +1916::The Drifters +1917::Boyz II Men +1918::Kool & The Gang +1919::Stevie Nicks +1920::Don Henley +1921::The Lovin' Spoonful +1922::Chad & Jeremy +1923::Israel Kamakawiwo'ole +1924::Lou Rawls +1925::Dionne Warwick +1926::Lorrie Morgan +1927::Neil Sedaka +1928::Connie Francis +1929::Marc Anthony +1930::Richard Hawley +1931::Billy Ocean +1932::Zucchero +1933::The Pogues +1934::Conway Twitty +1935::The Oak Ridge Boys +1936::Randy Travis +1937::Blackhawk +1938::Michael McDonald +1939::Barry Manilow +1940::Harry Nilsson +1941::Peter, Paul & Mary +1942::The Temptations +1943::Tony Bennett +1944::Nickel Creek +1945::George Winston +1946::Dwight Yoakam +1947::Shivaree +1948::Sheena Easton +1949::Perry Como +1950::Xela +1951::Los Lobos +1952::The Guess Who +1953::The Boo Radleys +1954::Nick Lowe +1955::MC Hammer +1956::Melissa Etheridge +1957::Scott McKenzie +1958::Cassandra Wilson +1959::Steel Magnolia +1960::The Jesus Lizard +1961::Foetus +1962::The Birthday Party +1963::The Jesus and Mary Chain +1964::Big Black +1965::Shellac +1966::Default +1967::The Brand New Heavies +1968::Jim Morrison +1969::65daysofstatic +1970::Late of the Pier +1971::We Are Scientists +1972::Good Shoes +1973::Mystery Jets +1974::Maximum the Hormone +1975::Gloria +1976::McFly +1977::Asking Alexandria +1978::The Devil Wears Prada +1979::blessthefall +1980::YUI +1981::A Skylit Drive +1982::Flow +1983::the GazettE +1984::HIGH and MIGHTY COLOR +1985::Miss May I +1986::Attack Attack! +1987::The Word Alive +1988::From First to Last +1989::Pierce the Veil +1990::Before Their Eyes +1991::We Came As Romans +1992::Eyes Set to Kill +1993::Woe, Is Me +1994::X JAPAN +1995::アンティック-珈琲店- +1996::Drop Dead, Gorgeous +1997::ORANGE RANGE +1998::Andrew Bird +1999::Spoon +2000::Iron & Wine +2001::Dave Matthews Band +2002::The New Pornographers +2003::Billy Joel +2004::Barenaked Ladies +2005::Randy Newman +2006::Ben Folds +2007::Paul Simon +2008::Rufus Wainwright +2009::Ben Folds Five +2010::Neko Case +2011::Calexico +2012::Dashboard Confessional +2013::Regina Spektor +2014::Reel Big Fish +2015::Foxboro Hot Tubs +2016::Alien Ant Farm +2017::Screamin' Jay Hawkins +2018::A Fine Frenzy +2019::Bad Religion +2020::Mombojó +2021::Silverchair +2022::Little Boots +2023::Hey Monday +2024::Engenheiros do Hawaii +2025::Capital Inicial +2026::Legião Urbana +2027::Titãs +2028::HORSE the band +2029::As I Lay Dying +2030::Millencolin +2031::Breathe Carolina +2032::The Maine +2033::Forever the Sickest Kids +2034::Sum 41 +2035::Mayday Parade +2036::We The Kings +2037::Cute Is What We Aim For +2038::Sonata Arctica +2039::The Fratellis +2040::Raimundos +2041::Faichecleres +2042::Charlie Brown Jr. +2043::Caetano Veloso +2044::Tiê +2045::Shinedown +2046::The Raconteurs +2047::Vasco Rossi +2048::Vega 4 +2049::The Turtles +2050::Trivium +2051::Kid Rock +2052::The Classic Crime +2053::A Rocket to the Moon +2054::Bidê ou Balde +2055::Anberlin +2056::Lordi +2057::The Cab +2058::This Providence +2059::Slash's Snakepit +2060::Gym Class Heroes +2061::Murderdolls +2062::Rosa De Saron +2063::Eros Ramazzotti +2064::Chimarruts +2065::Daniel Powter +2066::Walls of Jericho +2067::Barão Vermelho +2068::MxPx +2069::Forgotten Boys +2070::Ingrid Michaelson +2071::Tiago Iorc +2072::Cachorro Grande +2073::Graforréia Xilarmônica +2074::Forfun +2075::Ira! +2076::Zebrahead +2077::Collide +2078::Mamonas Assassinas +2079::4 Non Blondes +2080::Bonde do Rolê +2081::Cash Cash +2082::CPM 22 +2083::Beeshop +2084::The Academy Is... +2085::The Rocket Summer +2086::Artist Vs. Poet +2087::Drive +2088::Mushroomhead +2089::Alice Nine +2090::Fu Manchu +2091::Autoramas +2092::Rock Rocket +2093::Milton Nascimento +2094::The Friday Night Boys +2095::LM.C +2096::Gilberto Gil +2097::The Juliana Theory +2098::Bonde das Impostora +2099::Júpiter Maçã +2100::Deborah Blando +2101::Lipstick +2102::Faber Drive +2103::AFI +2104::Buckcherry +2105::Hardcore Superstar +2106::Vains of Jenna +2107::Sixx:A.M. +2108::Concrete Blonde +2109::Mott the Hoople +2110::鷺巣詩郎 +2111::Burial +2112::Mono +2113::Gimmik +2114::36 Crazyfists +2115::Haste the Day +2116::Hadouken! +2117::Skinny Puppy +2118::The Enemy +2119::Boxcutter +2120::Дельфин +2121::Xploding Plastix +2122::Maxïmo Park +2123::Cult of Luna +2124::Sakura +2125::Flobots +2126::Neurosis +2127::Maybeshewill +2128::Dolphin +2129::Stigmata +2130::Everything Is Made in China +2131::Ocean Colour Scene +2132::The Pigeon Detectives +2133::The Streets +2134::Roadrunner United +2135::Pelican +2136::Rashamba +2137::Hol Baumann +2138::Jesus on Extasy +2139::Ef +2140::Rosetta +2141::Shitdisco +2142::Benga +2143::Moondog +2144::Glen Hansard +2145::Camouflage +2146::Cock Robin +2147::Simply Red +2148::Janet Jackson +2149::Gabrielle +2150::Saint Etienne +2151::Annie Lennox +2152::Crowded House +2153::Zoé +2154::Chris Rea +2155::DJ Sammy +2156::Inspiral Carpets +2157::Donna Summer +2158::The Jacksons +2159::Chaka Khan +2160::Chic +2161::Teena Marie +2162::Happy Mondays +2163::Toto +2164::Shakin' Stevens +2165::Milk Inc. +2166::Iris +2167::JLS +2168::Bonnie Tyler +2169::Seal +2170::Julio Iglesias +2171::Chris de Burgh +2172::Haddaway +2173::Dr. Alban +2174::2 Unlimited +2175::Black +2176::Basement Jaxx +2177::Shapeshifters +2178::The Searchers +2179::The Pretenders +2180::When in Rome +2181::James +2182::T'Pau +2183::Wet Wet Wet +2184::The Charlatans +2185::Alison Moyet +2186::The Blow Monkeys +2187::Mylo +2188::Band Aid +2189::The Beloved +2190::Texas +2191::Dubstar +2192::EMF +2193::Sash! +2194::Pat Benatar +2195::The Archies +2196::Commodores +2197::Loverboy +2198::Manfred Mann +2199::Del Amitri +2200::The Shamen +2201::Roger Sanchez +2202::R. Kelly +2203::Bronski Beat +2204::The Four Tops +2205::Andy Bell +2206::Cliff Richard +2207::Alexander O'Neal +2208::Tammy Wynette +2209::Lisa Stansfield +2210::Snap! +2211::Glen Campbell +2212::The Alarm +2213::Chumbawamba +2214::The Bluetones +2215::F.R. David +2216::Bros +2217::Sister Sledge +2218::Soul II Soul +2219::The Trammps +2220::Petula Clark +2221::Shannon +2222::Technotronic +2223::Alice DeeJay +2224::Ensiferum +2225::Angra +2226::Norther +2227::Insomnium +2228::Skyfire +2229::James LaBrie +2230::Lil' Wayne +2231::Blue October +2232::The Prodigy +2233::Bombay Bicycle Club +2234::The Scene Aesthetic +2235::Dolores O'Riordan +2236::Crossfade +2237::Noize MC +2238::Pink +2239::Jamelia +2240::Агата Кристи +2241::Amatory +2242::Sunrise Avenue +2243::Manga +2244::Evergreen Terrace +2245::Би-2 +2246::Biohazard +2247::Кино +2248::Benny Benassi +2249::KoЯn +2250::Timo Maas +2251::Слот +2252::Novembre +2253::Unwritten Law +2254::Crazy Town +2255::DMX +2256::Пилот +2257::Evans Blue +2258::Propellerheads +2259::South Park +2260::Bomfunk MC's +2261::Кирпичи +2262::Король и Шут +2263::Lil Jon & The East Side Boyz +2264::Hush +2265::Lifehouse +2266::Bush +2267::Lovex +2268::In This Moment +2269::Black Tide +2270::Slaughter +2271::Pixie Lott +2272::Claudia Leitte +2273::Mylène Farmer +2274::8mm +2275::KLOQ +2276::Hooverphonic +2277::Kelis +2278::Melanie C +2279::Ivete Sangalo +2280::Babado Novo +2281::Rob Thomas +2282::Elliott Yamin +2283::Adriana Calcanhotto +2284::Camille +2285::Ani DiFranco +2286::Emma Bunton +2287::Danni Carlos +2288::The Notwist +2289::The Subways +2290::Mando Diao +2291::Kashmir +2292::Blue Foundation +2293::Lali Puna +2294::Broadcast +2295::Jackie Wilson +2296::Marvin Gaye +2297::The Isley Brothers +2298::Earth, Wind & Fire +2299::Sissel +2300::Alejandra Guzmán +2301::Giuseppe Verdi +2302::Miguel Bosé +2303::Johannes Brahms +2304::Mijares +2305::Charlotte Church +2306::Curtis Mayfield +2307::Antonín Dvořák +2308::Fatback Band +2309::Felix Mendelssohn +2310::Johann Pachelbel +2311::Diana Vickers +2312::Parachute +2313::Teddy Geiger +2314::Brie Larson +2315::HorrorPops +2316::Sandy e Junior +2317::The Distillers +2318::Kevin Federline +2319::Marisa Monte +2320::Erykah Badu +2321::Maria Bethânia +2322::Kate Voegele +2323::Los Hermanos +2324::Jeffree Star +2325::Sia +2326::Психея +2327::Emilíana Torrini +2328::The Calling +2329::Fatboy Slim +2330::Omarion +2331::Paolo Nutini +2332::The Hives +2333::Serebro +2334::Skye Sweetnam +2335::Anastacia +2336::The Medic Droid +2337::Schiller +2338::NX Zero +2339::LeToya +2340::Stars +2341::Kyo +2342::Nouvelle Vague +2343::Detonautas Roque Clube +2344::Fiona Apple +2345::Kudai +2346::Corinne Bailey Rae +2347::Bryan Ferry +2348::Julieta Venegas +2349::МакSим +2350::Vanessa da Mata +2351::Marcelo D2 +2352::DJ Cam +2353::O Rappa +2354::Os Mutantes +2355::Lenine +2356::SR-71 +2357::Antônio Carlos Jobim +2358::Plazma +2359::Freezepop +2360::American Hi-Fi +2361::Diddy +2362::Cartel +2363::Babasónicos +2364::Erin McCarley +2365::Lillix +2366::The Almost +2367::Сергей Лазарев +2368::Queen Latifah +2369::Ludov +2370::Gram +2371::Babyface +2372::Tribalistas +2373::Юлия Савичева +2374::Cibelle +2375::Bliss +2376::Vinicius de Moraes +2377::(hed) Planet Earth +2378::In-Grid +2379::Lemongrass +2380::Global Communication +2381::Rod Stewart +2382::John Legend +2383::Wyclef Jean +2384::Band of Horses +2385::Cat Power +2386::BrokeNCYDE +2387::Aloha From Hell +2388::The Pains of Being Pure at Heart +2389::+44 +2390::Kevin Rudolf +2391::Joey Ramone +2392::Emperor +2393::Spock's Beard +2394::Pain of Salvation +2395::Meshuggah +2396::Red Sparowes +2397::Strapping Young Lad +2398::Antimatter +2399::Ulver +2400::Bathory +2401::Textures +2402::The Ocean +2403::Riverside +2404::Moonsorrow +2405::My Dying Bride +2406::Ozric Tentacles +2407::Younger Brother +2408::Fair to Midland +2409::Oceansize +2410::Enslaved +2411::Anna Ternheim +2412::Lake of Tears +2413::Aereogramme +2414::Dimmu Borgir +2415::Arch Enemy +2416::Virgin Prunes +2417::Fields of the Nephilim +2418::Ween +2419::Specimen +2420::White Zombie +2421::Plasmatics +2422::Ten Years After +2423::Faithless +2424::Kosheen +2425::Sugababes +2426::Laura Pausini +2427::Darin +2428::Nick Cave and the Bad Seeds +2429::Siobhan Donaghy +2430::Delta Goodrem +2431::Edyta Bartosiewicz +2432::Far East Movement +2433::Solange +2434::Mónica Naranjo +2435::Morandi +2436::Robyn +2437::Matt Wertz +2438::Courtney Love +2439::Lee Ryan +2440::Five for Fighting +2441::No Mercy +2442::Everything but the Girl +2443::Lamb +2444::Jon McLaughlin +2445::Amerie +2446::Jazmine Sullivan +2447::Sam Sparro +2448::Kasia Kowalska +2449::Elisa +2450::Kurt Nilsen +2451::Lucie Silvas +2452::Howie Day +2453::Beverley Knight +2454::Live +2455::Moloko +2456::Joe Purdy +2457::Melanie Fiona +2458::Varius Manx +2459::AaRON +2460::Pati Yang +2461::Jamie Foxx +2462::Meredith Brooks +2463::Paola & Chiara +2464::Husky Rescue +2465::Babylon Zoo +2466::Kate Havnevik +2467::Joan Osborne +2468::Skin +2469::La Bouche +2470::Mutya Buena +2471::All That Remains +2472::Eths +2473::Blood Stain Child +2474::Light This City +2475::Mnemic +2476::Delain +2477::The Agonist +2478::Finger Eleven +2479::Victoria Beckham +2480::Alison Krauss +2481::Jessica Andrews +2482::Emerson Drive +2483::Gretchen Wilson +2484::The Frames +2485::Lisa Hannigan +2486::Willow Smith +2487::Amanda Palmer +2488::Baths +2489::Lil B +2490::Behemoth +2491::Whitechapel +2492::All Shall Perish +2493::Despised Icon +2494::Suicide Silence +2495::Nile +2496::Cannibal Corpse +2497::Hatebreed +2498::Job for a Cowboy +2499::Carnifex +2500::Beneath the Massacre +2501::Annotations of an Autopsy +2502::Оригами +2503::DevilDriver +2504::2H Company +2505::Enduser +2506::Kid606 +2507::SikTh +2508::Shitmat +2509::Machine Head +2510::Decapitated +2511::Russian Circles +2512::Otep +2513::Wednesday 13 +2514::Dry Kill Logic +2515::Chimaira +2516::Glassjaw +2517::Aborted +2518::Madball +2519::Unleashed +2520::Ion Dissonance +2521::7раса +2522::Deicide +2523::Obituary +2524::The Exploited +2525::Shadows Fall +2526::Cavalera Conspiracy +2527::Bluetech +2528::7000$ +2529::Kataklysm +2530::Clawfinger +2531::10 Years +2532::The Haunted +2533::Six Feet Under +2534::Damageplan +2535::Korea +2536::Modeselektor +2537::Crossbreed +2538::Pan Sonic +2539::Vital Remains +2540::Nasum +2541::Brujeria +2542::Atari Teenage Riot +2543::Rusko +2544::Animosity +2545::The Number Twelve Looks Like You +2546::The Bug +2547::Superjoint Ritual +2548::Bon Iver +2549::These New Puritans +2550::Alexisonfire +2551::Mumford & Sons +2552::K'naan +2553::Snoop Dogg +2554::Death from Above 1979 +2555::Delphic +2556::Wolfmother +2557::Friendly Fires +2558::Everything Everything +2559::311 +2560::Warpaint +2561::Passion Pit +2562::Starfucker +2563::Robin Thicke +2564::jj +2565::Nosaj Thing +2566::Washed Out +2567::Gossip +2568::Razorlight +2569::The Ordinary Boys +2570::Eisley +2571::The Flaming Lips +2572::Pretty Girls Make Graves +2573::The Slits +2574::Guster +2575::Augustana +2576::The Kovenant +2577::Black Label Society +2578::Soilwork +2579::Iced Earth +2580::Ayreon +2581::Agalloch +2582::Edguy +2583::Running Wild +2584::Demons & Wizards +2585::King Crimson +2586::DragonForce +2587::Dethklok +2588::Styx +2589::Korpiklaani +2590::Firewind +2591::Finntroll +2592::Funkadelic +2593::Bad Manners +2594::Bad Brains +2595::The Gathering +2596::Labyrinth +2597::Elvenking +2598::Candlemass +2599::Persuader +2600::Metal Church +2601::Cameo +2602::Windir +2603::Steve Miller Band +2604::Andre 3000 +2605::The Sword +2606::Ohio Players +2607::Alcatrazz +2608::Mountain +2609::King Diamond +2610::Devin Townsend +2611::Bloodbath +2612::Cynic +2613::Mustard Plug +2614::CéU +2615::Nitin Sawhney +2616::Minutemen +2617::Antony and the Johnsons +2618::Emilie Simon +2619::Cocteau Twins +2620::After Forever +2621::Devil Doll +2622::Violeta Parra +2623::Porter +2624::Gerry Rafferty +2625::Steel Pulse +2626::Bowling for Soup +2627::Chevelle +2628::Wheatus +2629::Tamia +2630::Westlife +2631::Five +2632::Jamal +2633::Eva Simons +2634::Kelly Key +2635::Mr. President +2636::Whigfield +2637::Ice MC +2638::Arash +2639::Daniela Mercury +2640::Lawrence +2641::LS Jack +2642::Steps +2643::E-Type +2644::Between the Buried and Me +2645::Born of Osiris +2646::Periphery +2647::Veil of Maya +2648::The Contortionist +2649::Within The Ruins +2650::After the Burial +2651::Moving Mountains +2652::Real Life +2653::John Taylor +2654::The Stills +2655::Orianthi +2656::Heaven Shall Burn +2657::Austrian Death Machine +2658::Stray From the Path +2659::Ana Cañas +2660::Silbermond +2661::Eluveitie +2662::Die Toten Hosen +2663::Hot Water Music +2664::Caliban +2665::It Prevails +2666::I Killed the Prom Queen +2667::Lisa Marie Presley +2668::Abandon All Ships +2669::The Crimson Armada +2670::Architects +2671::Alter Bridge +2672::Kutless +2673::Maylene and the Sons of Disaster +2674::Confide +2675::Demon Hunter +2676::Disarmonia Mundi +2677::Kyte +2678::Nightrage +2679::Misery Signals +2680::House vs. Hurricane +2681::One Morning Left +2682::Kids In Glass Houses +2683::FM Static +2684::Head +2685::Threat Signal +2686::Becoming the Archetype +2687::Against Me! +2688::Lucero +2689::Mooncake +2690::Of Mice & Men +2691::Sabrepulse +2692::Norma Jean +2693::Blockhead +2694::Emancipator +2695::Мои Ракеты Вверх +2696::The American Dollar +2697::Caspian +2698::NEVERSMILE +2699::Xe-NONE +2700::Asobi Seksu +2701::Lydia +2702::Bassnectar +2703::The Amity Affliction +2704::Maria Mena +2705::Gorgoroth +2706::Marduk +2707::Immortal +2708::Destruction +2709::Entombed +2710::Borknagar +2711::Nocturnal Depression +2712::Zемфира +2713::Adriano Celentano +2714::Alex Gaudino +2715::Shaggy +2716::Eels +2717::Tortoise +2718::Lights +2719::Nadja +2720::PJ Harvey +2721::Leonard Cohen +2722::Architecture in Helsinki +2723::The Sound of Animals Fighting +2724::Starlight Mints +2725::Mercyful Fate +2726::Anti-Flag +2727::Isaac Hayes +2728::The 69 Eyes +2729::The Von Bondies +2730::Deerhoof +2731::Apostle of Hustle +2732::Primus +2733::Xiu Xiu +2734::Built to Spill +2735::The Fiery Furnaces +2736::Peeping Tom +2737::Public Image Ltd. +2738::Eagles of Death Metal +2739::Charlotte Gainsbourg +2740::John Cage +2741::The Sugarcubes +2742::Danzig +2743::John Zorn +2744::Nurse With Wound +2745::Scarling. +2746::Caribou +2747::Liars +2748::GWAR +2749::Sun City Girls +2750::Secret Chiefs 3 +2751::Celtic Frost +2752::Into Eternity +2753::Funki Porcini +2754::Leæther Strip +2755::Auf der Maur +2756::Living Colour +2757::Lovage +2758::Esthero +2759::Faust +2760::The Go! Team +2761::Camera Obscura +2762::The 5.6.7.8's +2763::Exciter +2764::Don Caballero +2765::Helmet +2766::Eluvium +2767::Pinback +2768::Angelspit +2769::Bif Naked +2770::John Frusciante +2771::Harold Budd +2772::Sloan +2773::Daniel Johnston +2774::Meat Puppets +2775::Beulah +2776::The Creepshow +2777::Matthew Herbert +2778::Tosca +2779::Afterlife +2780::El Perro del Mar +2781::Gravity Kills +2782::The Postmarks +2783::Minor Threat +2784::Hella +2785::Veruca Salt +2786::Love Is All +2787::Buckethead +2788::Richard Cheese +2789::Mouse on Mars +2790::MC5 +2791::My Ruin +2792::Hanzel und Gretyl +2793::Gang Gang Dance +2794::The Concretes +2795::The Long Blondes +2796::OOIOO +2797::Shannon Wright +2798::Marcomé +2799::Terry Riley +2800::Tristan Feldbauer +2801::Warren Zevon +2802::Daniel Lanois +2803::The Tragically Hip +2804::Karlheinz Stockhausen +2805::Hello Saferide +2806::Unexpect +2807::This Heat +2808::Bill Laswell +2809::Art Ensemble of Chicago +2810::Milivoj Culibrk +2811::Estradasphere +2812::The Boy Least Likely To +2813::The Wimshurst's Machine +2814::Wintersleep +2815::Ministry +2816::New Model Army +2817::Johnny Hates Jazz +2818::Robert Palmer +2819::The Skatalites +2820::Lush +2821::Dead Can Dance +2822::Pavement +2823::Suicide +2824::Elvis Costello & The Attractions +2825::The Beat +2826::The Rapture +2827::Suzanne Vega +2828::The Sundays +2829::Neil Diamond +2830::Crass +2831::Clock DVA +2832::Toad the Wet Sprocket +2833::GBH +2834::Slowdive +2835::Mazzy Star +2836::The Rutles +2837::Brendan Benson +2838::Badly Drawn Boy +2839::The Undertones +2840::The Band +2841::The La's +2842::The Modern Lovers +2843::Mr. Mister +2844::Autograph +2845::Scandal +2846::Falco +2847::Soft Machine +2848::Black Tape for a Blue Girl +2849::The Rembrandts +2850::Buzzcocks +2851::Aimee Mann +2852::The Comsat Angels +2853::The Danse Society +2854::The Sounds +2855::Sebadoh +2856::Klaus Nomi +2857::The Lemonheads +2858::Laura Branigan +2859::Book of Love +2860::Tim Finn +2861::Camper Van Beethoven +2862::Pete Shelley +2863::The Icicle Works +2864::Buffalo Springfield +2865::Badfinger +2866::The Mission +2867::Ride +2868::The House of Love +2869::France Gall +2870::And Also the Trees +2871::The Church +2872::.38 Special +2873::X-Ray Spex +2874::Prince Buster +2875::Teenage Fanclub +2876::Big Star +2877::The Korgis +2878::The Raincoats +2879::Severed Heads +2880::Hüsker Dü +2881::The Germs +2882::Sham 69 +2883::Television Personalities +2884::The Adverts +2885::X-Mal Deutschland +2886::The Replacements +2887::IMA Robot +2888::Freur +2889::Youth Group +2890::Love Spirals Downwards +2891::Low +2892::Todd Rundgren +2893::Stereo Total +2894::Television +2895::The Blue Nile +2896::Hothouse Flowers +2897::Kirsty MacColl +2898::Billy Bragg +2899::Josef K +2900::Sid Vicious +2901::The Lightning Seeds +2902::UK Subs +2903::YACHT +2904::Young Marble Giants +2905::Talulah Gosh +2906::Faces +2907::The Teardrop Explodes +2908::Pere Ubu +2909::The Boomtown Rats +2910::Pop Will Eat Itself +2911::Das Ich +2912::Stromae +2913::Social Distortion +2914::Salem +2915::The Black Dahlia Murder +2916::Sonic Syndicate +2917::Emmure +2918::The Dillinger Escape Plan +2919::Dance Gavin Dance +2920::Agoraphobic Nosebleed +2921::Mastodon +2922::Naked City +2923::Rhapsody of Fire +2924::Exodus +2925::Primal Fear +2926::Tankard +2927::Artillery +2928::Toxic Holocaust +2929::Municipal Waste +2930::Napalm Death +2931::Bleeding Through +2932::Waking The Cadaver +2933::Impending Doom +2934::See You Next Tuesday +2935::Megaherz +2936::Architect +2937::ВFI +2938::Blind Witness +2939::We Butter The Bread With Butter +2940::It Dies Today +2941::Danko Jones +2942::Best Coast +2943::Protest The Hero +2944::Ляпис Трубецкой +2945::1349 +2946::Vader +2947::Dark Funeral +2948::Joe Bonamassa +2949::Machinae Supremacy +2950::Hypocrisy +2951::Converge +2952::The Ghost Inside +2953::Comeback Kid +2954::Have Heart +2955::New Years Day +2956::iwrestledabearonce +2957::Ektomorf +2958::Blood Red Shoes +2959::Misery Index +2960::The Faceless +2961::The Chariot +2962::Asesino +2963::H2O +2964::Possessed +2965::Dissection +2966::Altaria +2967::The Acacia Strain +2968::Terror +2969::In Fear and Faith +2970::Necrophagist +2971::Adept +2972::Anal Cunt +2973::I Declare War +2974::Dr. Acula +2975::And Hell Followed With +2976::Attila +2977::War From a Harlots Mouth +2978::Molotov Solution +2979::The Tony Danza Tapdance Extravaganza +2980::To/Die/For +2981::Throwdown +2982::Sadus +2983::Agnostic Front +2984::Emigrate +2985::Dungeon Elite [**] +2986::iamerror +2987::Arsonists Get All The Girls +2988::Greeley Estates +2989::Coroner +2990::I:Scintilla +2991::Conjure One +2992::De-Phazz +2993::Corrosion of Conformity +2994::Virgin Black +2995::Onslaught +2996::The Derek Trucks Band +2997::For the Fallen Dreams +2998::Sumatra +2999::Every Time I Die +3000::Memphis May Fire +3001::Xentrix +3002::Times of Grace +3003::Charlie Musselwhite +3004::Death Before Dishonor +3005::Kylesa +3006::The Locust +3007::Spectra Paris +3008::Raunchy +3009::Element Eighty +3010::Your Demise +3011::Spineshank +3012::Oceana +3013::Razor +3014::Beseech +3015::Imperanon +3016::An Albatross +3017::The Human Abstract +3018::Circle Jerks +3019::Envy +3020::United Nations +3021::Sybreed +3022::Prodigy +3023::Sick of It All +3024::Trap Them +3025::Walter Trout +3026::Dead Poetic +3027::Meg & Dia +3028::Cephalic Carnage +3029::Tesseract +3030::Bonded By Blood +3031::Casey Jones +3032::Silent Civilian +3033::Through the Eyes of the Dead +3034::HEARTSREVOLUTION +3035::Amanda Blank +3036::T.S.O.L. +3037::AKADO +3038::Arkaea +3039::Scanners +3040::Super Junior +3041::SHINee +3042::소녀시대 +3043::BoA +3044::M. Ward +3045::Devendra Banhart +3046::Nick Drake +3047::Tracy Chapman +3048::Tilly and the Wall +3049::The Magnetic Fields +3050::Jens Lekman +3051::Neutral Milk Hotel +3052::The Microphones +3053::Augustus Pablo +3054::King Tubby +3055::Lee "Scratch" Perry +3056::The Gun Club +3057::Spiritualized +3058::The Flying Burrito Brothers +3059::Loretta Lynn +3060::Hawkwind +3061::Leadbelly +3062::Grandaddy +3063::Guided by Voices +3064::Townes Van Zandt +3065::Red House Painters +3066::Madredeus +3067::Mediæval Bæbes +3068::Her Space Holiday +3069::Hood +3070::Ane Brun +3071::Son House +3072::Sopor Aeternus & The Ensemble of Shadows +3073::Parkway Drive +3074::Avantasia +3075::You Me At Six +3076::Mis-Teeq +3077::Adam Green +3078::Nina Simone +3079::Stacie Orrico +3080::Emma Shapplin +3081::4minute +3082::Eazy-E +3083::Mobb Deep +3084::Chayanne +3085::Royce da 5'9" +3086::Busta Rhymes +3087::Sara Bareilles +3088::Lenka +3089::A Static Lullaby +3090::Girl Talk +3091::Spinnerette +3092::Will Young +3093::Macy Gray +3094::This Mortal Coil +3095::Cold War Kids +3096::Marit Larsen +3097::Every Avenue +3098::Edenbridge +3099::Lisa Miskovsky +3100::Krystal Meyers +3101::Kirlian Camera +3102::The Organ +3103::Clannad +3104::Lisa "Left Eye" Lopes +3105::Millionaires +3106::The Casualties +3107::Evile +3108::Cadaveria +3109::Astarte +3110::Elis +3111::Jonathan Davis +3112::Android Lust +3113::Hillsong United +3114::The Toy Dolls +3115::A Place to Bury Strangers +3116::Crash Test Dummies +3117::The Wreckers +3118::Lunatica +3119::Draconian +3120::Trail of Tears +3121::Uh Huh Her +3122::Planetshakers +3123::Coal Chamber +3124::The Submarines +3125::Mortal Love +3126::M2M +3127::Danity Kane +3128::Doda +3129::Brodka +3130::GZA/Genius +3131::Ghostface Killah +3132::Natasha Bedingfield +3133::Aretha Franklin +3134::James Brown +3135::Alexandra Burke +3136::Ewa Farna +3137::Lady Sovereign +3138::Dan Balan +3139::Eve +3140::Carla Bruni +3141::Minnie Riperton +3142::Czesław Śpiewa +3143::Etta James +3144::Michael Bublé +3145::Beady Eye +3146::Eric B. & Rakim +3147::Shontelle +3148::Hey +3149::Édith Piaf +3150::Peter Doherty +3151::Angus & Julia Stone +3152::Strachy Na Lachy +3153::Yolanda Be Cool & DCUP +3154::Paloma Faith +3155::Stanfour +3156::Hellogoodbye +3157::Nosowska +3158::Ania +3159::Bow Wow +3160::Aura Dione +3161::Cody Simpson +3162::Natalia Kills +3163::James Horner +3164::Lea Michele +3165::Nneka +3166::Alexis Jordan +3167::Tinchy Stryder +3168::Lauryn Hill +3169::Mark Ronson & The Business Intl +3170::Box Car Racer +3171::Flipsyde +3172::Soulja Boy +3173::En Vogue +3174::Clipse +3175::Yael Naim +3176::Flogging Molly +3177::Smolik +3178::Ana Johnsson +3179::Sinéad O'Connor +3180::Clare Maguire +3181::Mike Posner +3182::Justin Nozuka +3183::T-Pain +3184::Kaki King +3185::Vanessa Paradis +3186::Tom Petty +3187::Rachael Yamagata +3188::Måns Zelmerlöw +3189::Moulin Rouge +3190::Hope +3191::Run-D.M.C. +3192::The Supremes +3193::Diana Ross and The Supremes +3194::Hurt +3195::Pretty Ricky +3196::Gotan Project +3197::The Last Goodnight +3198::Zabili Mi Żółwia +3199::Cee-Lo +3200::Cee Lo Green +3201::Lil Mama +3202::Anita Baker +3203::Julian Casablancas +3204::Poisonblack +3205::Black Stone Cherry +3206::Queensberry +3207::The Blackout +3208::deadmau5 +3209::Marianas Trench +3210::Aiden +3211::Sugarcult +3212::CKY +3213::Halestorm +3214::Emerson, Lake & Palmer +3215::Kix +3216::The Saturdays +3217::Jessie J +3218::Rebecca Black +3219::Самое Большое Простое Число +3220::Red Snapper +3221::Animal ДжаZ +3222::Laika +3223::Killwhitneydead +3224::Texas in July +3225::Elio e le Storie Tese +3226::TV on the Radio +3227::Blackfield +3228::Helena Paparizou +3229::Midge Ure +3230::Exposé +3231::X-Dream +3232::Lights of Euphoria +3233::Astrud Gilberto +3234::Athlete +3235::The Ark +3236::Alizée +3237::Huey Lewis & The News +3238::Morten Harket +3239::Bad Boys Blue +3240::Silent Circle +3241::Fancy +3242::Astrix +3243::Chris Spheeris +3244::عمر دياب +3245::Cesária Évora +3246::Supreme Beings of Leisure +3247::Bread +3248::Frou Frou +3249::Ace Ventura +3250::Guillemots +3251::Gus Gus +3252::Boy George +3253::Jay-Jay Johanson +3254::Aqualung +3255::Tahiti 80 +3256::Offer Nissim +3257::Orient Expressions +3258::Elegant Machinery +3259::Mel & Kim +3260::Bebel Gilberto +3261::Jody Watley +3262::Ghosts +3263::Mumm-Ra +3264::Bitter:Sweet +3265::Angtoria +3266::Terence Trent D'Arby +3267::Nicola Conte +3268::Alter Ego +3269::Samantha Fox +3270::Anouar Brahem +3271::Liza Minnelli +3272::Blue Stone +3273::Peter Schilling +3274::Omar Faruk Tekbilek +3275::Team Sleep +3276::Up, Bustle and Out +3277::Parov Stelar +3278::Asian Dub Foundation +3279::Chase & Status +3280::KOTOKO +3281::安室奈美恵 +3282::モーニング娘。 +3283::大塚愛 +3284::水樹奈々 +3285::林原めぐみ +3286::北出菜奈 +3287::Zola Jesus +3288::Blackmore's Night +3289::Stevie Ray Vaughan +3290::Rick Wakeman +3291::Geddy Lee +3292::Roger Waters +3293::Van der Graaf Generator +3294::Focus +3295::Bachman-Turner Overdrive +3296::Slade +3297::Traffic +3298::Premiata Forneria Marconi +3299::B.B. King & Eric Clapton +3300::Neil Young & Crazy Horse +3301::Inti-Illimani +3302::Thievery Corporation +3303::Ornette Coleman +3304::Michael Gray +3305::Madvillain +3306::Sneaker Pimps +3307::Skye +3308::Dangerous Muse +3309::Grizzly Bear +3310::Martina Topley-Bird +3311::Smoke City +3312::Halou +3313::H.U.V.A. Network +3314::Aes Dana +3315::Anja Garbarek +3316::dZihan & Kamien +3317::Days of the New +3318::Shirley Bassey +3319::Patti LaBelle +3320::The Field +3321::Daughter Darling +3322::Montefiori Cocktail +3323::Laurent Garnier +3324::Waldeck +3325::Rue du Soleil +3326::Kruder & Dorfmeister +3327::DeVotchKa +3328::O Teatro Mágico +3329::The Tallest Man on Earth +3330::New Young Pony Club +3331::Pizzicato Five +3332::The Dresden Dolls +3333::Those Dancing Days +3334::Laura Marling +3335::Super Furry Animals +3336::Nightmare +3337::Rory Gallagher +3338::Duke Ellington +3339::St. Vincent +3340::Brian Wilson +3341::Owen Pallett +3342::Jorge Drexler +3343::The Raveonettes +3344::Tim Maia +3345::Janelle Monáe +3346::Tujiko Noriko +3347::Vashti Bunyan +3348::Sons and Daughters +3349::Nico +3350::Rasputina +3351::The Zutons +3352::Harry and the Potters +3353::The Ditty Bops +3354::VHS or Beta +3355::The Seatbelts +3356::Louise Attaque +3357::Au Revoir Simone +3358::Emmy the Great +3359::Juli +3360::Hope Sandoval & The Warm Inventions +3361::Dum Dum Girls +3362::Blue Man Group +3363::Louis XIV +3364::The Grates +3365::The Cribs +3366::The Maccabees +3367::Envydust +3368::Head Automatica +3369::Boy Kill Boy +3370::The View +3371::The Futureheads +3372::Moptop +3373::Madina Lake +3374::Juliette and The Licks +3375::Sirenia +3376::Kristine Elezaj +3377::Ticon +3378::Asura +3379::Brigitte Bardot +3380::Hybrid +3381::Lützenkirchen +3382::Kiara Rocks +3383::嵐 +3384::玉置成実 +3385::Grave Digger +3386::Bonfire +3387::3 Inches of Blood +3388::Nazareth +3389::Sandy Leah +3390::Mat Kearney +3391::Nonpoint +3392::Turbonegro +3393::Scott Walker +3394::Gianna Nannini +3395::Velvet Acid Christ +3396::David Gray +3397::Rancid +3398::The Wallflowers +3399::Teitur +3400::Psapp +3401::Natalie Walker +3402::Deathstars +3403::My Life with the Thrill Kill Kult +3404::Hank Williams Jr. +3405::Hootie & the Blowfish +3406::Gov't Mule +3407::Lene Marlin +3408::Toadies +3409::Joy Williams +3410::Mr. Scruff +3411::Anna Nalick +3412::Olivia Ruiz +3413::Thomas Dybdahl +3414::Vermillion Lies +3415::Jerry Lee Lewis +3416::Charlie Daniels Band +3417::Blues Traveler +3418::Jimmy Cliff +3419::Better Than Ezra +3420::Vienna Teng +3421::Bel Canto +3422::Jonny Lang +3423::ohGr +3424::Pigface +3425::Crosby, Stills & Nash +3426::Celestial Aeon Project +3427::Powerman 5000 +3428::Ace Frehley +3429::Various Artists +3430::Alcest +3431::Heaven & Hell +3432::Tor Lundvall +3433::All My Faith Lost ... +3434::Magna Canta +3435::32Crash +3436::Jota Quest +3437::Scars on Broadway +3438::Upcdowncleftcrightcabc+start +3439::Banco de Gaia +3440::I Hear Sirens +3441::Yonderboi +3442::Kwoon +3443::Fuck Buttons +3444::Destroyalldreamers +3445::Пелагея +3446::Rachel's +3447::Tunturia +3448::Peter Tosh +3449::Damian Marley +3450::Vavamuffin +3451::Ziggy Marley +3452::Gentleman +3453::He Is Legend +3454::Dance Club Massacre +3455::Pogo +3456::Circa Survive +3457::Kill Paradise +3458::Tyler, The Creator +3459::Anna Calvi +3460::Rev Theory +3461::The Perishers +3462::José González +3463::The Wombats +3464::Madlib +3465::Paul Kalkbrenner +3466::James Blake +3467::Télépopmusik +3468::Tesla Boy +3469::Trentemøller +3470::Yoav +3471::Bent +3472::Sad Lovers and Giants +3473::The Chameleons +3474::HEALTH +3475::Toro y Moi +3476::SCSI-9 +3477::Zeigeist +3478::Beach Fossils +3479::Bad Lieutenant +3480::Gui Boratto +3481::Chairlift +3482::Nathan Fake +3483::Thieves Like Us +3484::Kollektiv Turmstrasse +3485::Extrawelt +3486::Stephan Bodzin +3487::Minilogue +3488::Sascha Funke +3489::A Camp +3490::Anthony Rother +3491::Matthew Dear +3492::The Mary Onettes +3493::Erik Satie +3494::Weather Report +3495::Nujabes +3496::Nick Cave & Warren Ellis +3497::Night Ranger +3498::Girlicious +3499::Blitz +3500::Worm Is Green +3501::Broken Social Scene +3502::Great Lake Swimmers +3503::Grateful Dead +3504::Anathallo +3505::Piano Magic +3506::Do Make Say Think +3507::Cartola +3508::The Mountain Goats +3509::Okkervil River +3510::Amália Rodrigues +3511::Celtic Woman +3512::João Gilberto +3513::Woods +3514::Ray LaMontagne +3515::The Brian Jonestown Massacre +3516::Streetlight Manifesto +3517::Ash +3518::Elis Regina +3519::Bang Gang +3520::Baden Powell +3521::The Radio Dept. +3522::Stafrænn Hákon +3523::Owen +3524::My Morning Jacket +3525::Amusement Parks on Fire +3526::Efterklang +3527::Gray Strawberries +3528::Omnia +3529::September Malevolence +3530::The Meters +3531::Chapterhouse +3532::Nara Leão +3533::Borko +3534::Electrelane +3535::Novos Baianos +3536::Carissa's Wierd +3537::Under Byen +3538::Huun-Huur-Tu +3539::Stan Getz +3540::Andrei Machado +3541::Say Hi to Your Mom +3542::Kitchens of Distinction +3543::Sun Kil Moon +3544::Casiotone for the Painfully Alone +3545::Drive-By Truckers +3546::Love +3547::Hermeto Pascoal +3548::Roger Miller +3549::Horse Feathers +3550::Akron/Family +3551::Tristeza +3552::A Hawk and a Hacksaw +3553::Delays +3554::Rilo Kiley +3555::Infernal +3556::dredg +3557::Trapt +3558::Billy Currington +3559::Richard Ashcroft +3560::From Autumn to Ashes +3561::Ronan Keating +3562::Cat Stevens +3563::Train +3564::Richie Sambora +3565::Air Traffic +3566::Entwine +3567::Brian McKnight +3568::Superchic[k] +3569::Globus +3570::Semisonic +3571::Skazi +3572::Shadow Gallery +3573::Dark Moor +3574::Nocturnal Rites +3575::Lost Horizon +3576::Evergrey +3577::TV-2 +3578::Common +3579::Faith Evans +3580::Otis Redding +3581::The Game +3582::Musiq +3583::Dizzee Rascal +3584::Redman +3585::Utada +3586::Akufen +3587::Black Star +3588::Third Eye Blind +3589::Jennifer Love Hewitt +3590::Example +3591::Coconut Records +3592::Ginuwine +3593::Jamie T +3594::Mario +3595::112 +3596::Ben Woods +3597::John Lee Hooker +3598::Missy Higgins +3599::Christina Milian +3600::Lisa Gerrard +3601::Black Lab +3602::Pete Yorn +3603::Ol' Dirty Bastard +3604::Alkaline Trio +3605::Pennywise +3606::Battlelore +3607::Lucinda Williams +3608::RZA +3609::Amber Pacific +3610::植松伸夫 +3611::Lemon Jelly +3612::The Blues Brothers +3613::The Living End +3614::The J. Geils Band +3615::Beatsteaks +3616::Meat Loaf +3617::Jagged Edge +3618::Marcy Playground +3619::Stealers Wheel +3620::The Click Five +3621::One Night Only +3622::Scouting for Girls +3623::The Crowns +3624::The Bird and The Bee +3625::Chiodos +3626::The Get Up Kids +3627::The Coasters +3628::Overkill +3629::Down +3630::Nek +3631::Gipsy Kings +3632::Ibrahim Ferrer +3633::Paco de Lucía +3634::Alejandro Fernández +3635::Moenia +3636::Karsh Kale +3637::Oliver Shanti +3638::Graham Coxon +3639::Maino +3640::Keyshia Cole +3641::Винтаж +3642::Booty Luv +3643::Three 6 Mafia +3644::Jordan Rudess +3645::Lunatic Soul +3646::David Gilmour +3647::Liquid Tension Experiment +3648::Al Di Meola +3649::John Petrucci +3650::Michael Giacchino +3651::Django Reinhardt +3652::Donovan +3653::Fish +3654::Fates Warning +3655::Obscura +3656::Camel +3657::Atheist +3658::Gentle Giant +3659::David Sylvian +3660::Nine Horses +3661::Harry Gregson-Williams +3662::Beardfish +3663::Phideaux +3664::Eloy +3665::Pestilence +3666::Kenny G +3667::Rain Tree Crow +3668::Goblin +3669::maudlin of the Well +3670::Caravan +3671::Gryphon +3672::Chroma Key +3673::Robin Trower +3674::Chick Corea +3675::Return to Forever +3676::Renaissance +3677::Trey Gunn +3678::The Rakes +3679::Dirty Pretty Things +3680::Milburn +3681::The Bravery +3682::Quietdrive +3683::The Automatic +3684::The Hoosiers +3685::Obie Trice +3686::Bizarre +3687::Cassiane +3688::Kim Carnes +3689::Brenda Lee +3690::Jack's Mannequin +3691::Motion City Soundtrack +3692::The John Butler Trio +3693::The Cloud Room +3694::Mark Knopfler +3695::Haircut 100 +3696::Olivia Newton-John +3697::Idlewild +3698::Edwyn Collins +3699::Orange Juice +3700::Trio +3701::Jane Wiedlin +3702::Passengers +3703::Andy Taylor +3704::Nuclear Assault +3705::Doves +3706::Hot Hot Heat +3707::Klaus Badelt +3708::Kidneythieves +3709::Grave +3710::D'espairsRay +3711::Benjamin Biolay +3712::Ian Brown +3713::Eddie Cochran +3714::Link Wray +3715::Gary Jules +3716::Immortal Technique +3717::Jurassic 5 +3718::Blackalicious +3719::Bone Thugs-N-Harmony +3720::Ice Cube +3721::Cam'ron +3722::Notorious B.I.G. +3723::Naughty by Nature +3724::Proof +3725::Big L +3726::Taj Mahal +3727::Andrew W.K. +3728::Joe +3729::Vanilla Ice +3730::Cap'n Jazz +3731::Less Than Jake +3732::Saves the Day +3733::American Football +3734::Matt Pond PA +3735::Karunesh +3736::Ravi Shankar +3737::Philip Glass +3738::Frozen Silence +3739::Current 93 +3740::Psychic TV +3741::Ryoji Ikeda +3742::Zoviet France +3743::Lustmord +3744::Alva Noto +3745::Sergei Rachmaninoff +3746::Lusine +3747::Kaya Project +3748::Tangerine Dream +3749::Atrium Carceri +3750::Kammarheit +3751::Kronos Quartet +3752::Niyaz +3753::Steve Roach +3754::Muslimgauze +3755::Yat-Kha +3756::Steve Reich +3757::Luc Ferrari +3758::Baskyl +3759::Modus +3760::大谷幸 +3761::DJ Food +3762::Jon Hopkins +3763::Mythos +3764::THEreminGIRL +3765::The Teenagers +3766::Solar Fields +3767::The Tear Garden +3768::Goran Bregović +3769::Michael Andrews +3770::Patrick Doyle +3771::Eric Serra +3772::Jan Hammer +3773::Swans +3774::John Barry +3775::Dario Marianelli +3776::Side Liner +3777::Revolting Cocks +3778::American Head Charge +3779::Lords of Acid +3780::Zeromancer +3781::Zombina and the Skeletones +3782::Dog Fashion Disco +3783::Mortiis +3784::Sevendust +3785::Stabbing Westward +3786::Godhead +3787::Fun Lovin' Criminals +3788::Pagoda +3789::Moonspell +3790::Gojira +3791::Balmorhea +3792::Glen Hansard & Markéta Irglová +3793::Peace Orchestra +3794::dEUS +3795::Diante do Trono +3796::Carter Burwell +3797::Dusty Kid +3798::Modjo +3799::Nada Surf +3800::Matia Bazar +3801::The Glove +3802::Sex Gang Children +3803::Altered Images +3804::The Tornados +3805::Them Crooked Vultures +3806::Ólafur Arnalds +3807::Remy Zero +3808::Inkubus Sukkubus +3809::Monty Python +3810::Steely Dan +3811::MUM +3812::Traveling Wilburys +3813::The Nitty Gritty Dirt Band +3814::Carly Simon +3815::This Will Destroy You +3816::Big Brother & The Holding Company +3817::Cage the Elephant +3818::Bill Hicks +3819::K's Choice +3820::Little Feat +3821::Sam & Dave +3822::Three Dog Night +3823::Dan Fogelberg +3824::Poe +3825::Indigo Girls +3826::Nikka Costa +3827::Crosby, Stills, Nash & Young +3828::And So I Watch You From Afar +3829::Elysian Fields +3830::pg.lost +3831::Maserati +3832::Dan Auerbach +3833::Eddie Izzard +3834::Firefall +3835::Zwan +3836::Cine +3837::Copacabana Club +3838::E.S. Posthumus +3839::Of the Wand and the Moon +3840::Rodrigo y Gabriela +3841::Bell X1 +3842::Les Savy Fav +3843::Steve Earle +3844::Cibo Matto +3845::Jonny Greenwood +3846::Susumu Yokota +3847::Get Cape. Wear Cape. Fly +3848::Fred Astaire +3849::Kay Starr +3850::Jamie Lidell +3851::Gustavo Santaolalla +3852::Gnawa Diffusion +3853::Michelle Branch +3854::Stephanie McIntosh +3855::Queen + Paul Rodgers +3856::Mägo de Oz +3857::Jill Scott +3858::The Easybeats +3859::El Cuarteto de Nos +3860::Horace Andy +3861::Os Paralamas do Sucesso +3862::Plastiscines +3863::Laurel Aitken +3864::Chico Science & Nação Zumbi +3865::The Wailers +3866::The Warlocks +3867::Spacemen 3 +3868::Mala Rodríguez +3869::Aesop Rock +3870::The Field Mice +3871::Gustavo Cerati +3872::Buju Banton +3873::Glasvegas +3874::Kinky +3875::The Rifles +3876::Gil Scott-Heron +3877::Elastica +3878::Paul Weller +3879::The English Beat +3880::Estelle +3881::Toots and the Maytals +3882::Mansun +3883::The Feelies +3884::The Duke Spirit +3885::Kula Shaker +3886::Gregory Isaacs +3887::Burning Spear +3888::Barrington Levy +3889::Ike & Tina Turner +3890::The Tears +3891::Easy Star All-Stars +3892::The Thrills +3893::Bernard Butler +3894::Free the Robots +3895::John Mayall & The Bluesbreakers +3896::Sleeper +3897::Pharrell +3898::The Telescopes +3899::Marianne Faithfull +3900::The Lucksmiths +3901::Tindersticks +3902::Julian Cope +3903::Pernice Brothers +3904::You Say Party! We Say Die! +3905::VETO +3906::Shout Out Louds +3907::Curve +3908::Art Brut +3909::Love and Rockets +3910::Fela Kuti +3911::Windy & Carl +3912::Grouper +3913::Dictaphone +3914::Porn Sword Tobacco +3915::Ada +3916::The Herbaliser +3917::Secos & Molhados +3918::Neu! +3919::Pentagram +3920::Le Orme +3921::Manfred Mann's Earth Band +3922::Blue Cheer +3923::Saint Vitus +3924::Miike Snow +3925::Atmosphere +3926::Roy Ayers +3927::Sarah Vaughan +3928::Deerhunter +3929::Fink +3930::The Temper Trap +3931::Maria Gadú +3932::Seu Jorge +3933::Zeca Baleiro +3934::Roberta Sá +3935::Yuksek +3936::Djavan +3937::Wax Poetic +3938::Elsiane +3939::Jorge Ben Jor +3940::Logh +3941::Donavon Frankenreiter +3942::The Naked and Famous +3943::Urge Overkill +3944::Paulinho Moska +3945::Mariana Aydar +3946::3-11 Porter +3947::Alessandro Safina +3948::Shaman +3949::Republica +3950::Canned Heat +3951::Natiruts +3952::Blaze +3953::Gong +3954::Derek and the Dominos +3955::Collective Soul +3956::Richard Wright +3957::The Servant +3958::Ananda Shake +3959::Library Tapes +3960::Divine Heresy +3961::Afghan Whigs +3962::Bayside +3963::The Courteeners +3964::Someone Still Loves You Boris Yeltsin +3965::The Apples in Stereo +3966::Final Fantasy +3967::Delorean +3968::Wild Nothing +3969::Set Your Goals +3970::The Bloody Beetroots +3971::The Feeling +3972::Pure Reason Revolution +3973::Atlas Sound +3974::Portugal. The Man +3975::Pnau +3976::Rotting Christ +3977::Midnight Juggernauts +3978::Ampop +3979::Saltillo +3980::Bane +3981::Acceptance +3982::NOFX +3983::No Use for a Name +3984::Tears Run Rings +3985::Noah and the Whale +3986::...And You Will Know Us by the Trail of Dead +3987::Jack Peñate +3988::Catherine Wheel +3989::Mute Math +3990::Goose +3991::Labradford +3992::Cloud Cult +3993::The Secret Handshake +3994::PlayRadioPlay! +3995::The Unicorns +3996::Spleen United +3997::Polvo +3998::Scratch Acid +3999::The Whip +4000::Zoot Woman +4001::Go:Audio +4002::Great Northern +4003::The Dears +4004::Hawk Nelson +4005::Destroy The Runner +4006::Frankmusik +4007::Van She +4008::No Age +4009::Voxtrot +4010::Lights Out Asia +4011::Sleater-Kinney +4012::We Have Band +4013::The Monochrome Set +4014::Mission of Burma +4015::Bishop Allen +4016::The Dodos +4017::Swervedriver +4018::Edward Sharpe & the Magnetic Zeros +4019::Steve Aoki +4020::Thurston Moore +4021::Plastilina Mosh +4022::Sleeping at Last +4023::French Teen Idol +4024::Hate Eternal +4025::Sugar Ray +4026::Film School +4027::Secret Shine +4028::Surfer Blood +4029::The Republic Tigers +4030::We Smoke Fags +4031::The Big Pink +4032::Under the Influence of Giants +4033::Soundpool +4034::Paper Route +4035::Sick Puppies +4036::BarlowGirl +4037::Ryan Cabrera +4038::Akcent +4039::Vanilla Sky +4040::Carolina Liar +4041::Casting Crowns +4042::Vertical Horizon +4043::Falling Up +4044::Orson +4045::T.M.Revolution +4046::Pain Confessor +4047::The Blood Brothers +4048::Diablo Swing Orchestra +4049::Satyricon +4050::Karnivool +4051::Winds of Plague +4052::Deathspell Omega +4053::Anata +4054::Blut aus Nord +4055::Closure In Moscow +4056::近藤浩治 +4057::Koop +4058::PMMP +4059::Boys Noize +4060::Orphaned Land +4061::Andromeda +4062::Hanni Kohl +4063::Steve Vai +4064::Haggard +4065::Mors Principium Est +4066::Café Tacuba +4067::Jarabe de Palo +4068::Ark +4069::Marty Friedman +4070::Maná +4071::Ojos de Brujo +4072::Cacophony +4073::I'm from Barcelona +4074::Diablo +4075::Paul Anka +4076::Damn Yankees +4077::Diabolical Masquerade +4078::Jumbo +4079::Banco del Mutuo Soccorso +4080::Sacred Reich +4081::Septic Flesh +4082::Legion of the Damned +4083::Rosetta Stone +4084::Jane Birkin & Serge Gainsbourg +4085::Bill Haley +4086::Bella Morte +4087::Museum +4088::The Airborne Toxic Event +4089::Legowelt +4090::Robert Plant +4091::Elmore James +4092::Sonny Boy Williamson +4093::Freddie King +4094::Albert King +4095::Citizen Cope +4096::Dr. John +4097::Otis Rush +4098::Grant Green +4099::Junior Wells +4100::Lightnin' Hopkins +4101::Koko Taylor +4102::Cursive +4103::Ted Leo and The Pharmacists +4104::Laura Veirs +4105::La Oreja de Van Gogh +4106::Fernanda Takai +4107::As Blood Runs Black +4108::akissforjersey +4109::Unearth +4110::Bury Your Dead +4111::Sonny Rollins +4112::Cauterize +4113::Rufio +4114::My American Heart +4115::The Hush Sound +4116::Andy McKee +4117::Breathe Electric +4118::The Audition +4119::Moneen +4120::The Bled +4121::Broadway +4122::LoveHateHero +4123::División Minúscula +4124::Daphne Loves Derby +4125::KSU +4126::Four Year Strong +4127::For Today +4128::Maroon +4129::The Agony Scene +4130::Earth Crisis +4131::Emarosa +4132::Morningwood +4133::Hird +4134::The Dave Brubeck Quartet +4135::Gustav Mahler +4136::Franz Joseph Haydn +4137::Farid Farjad +4138::梶浦由記 +4139::Marco Borsato +4140::Joe Walsh +4141::Sailor Moon +4142::Montrose +4143::Nephew +4144::Volbeat +4145::Colin Hay +4146::John Cale +4147::Beth Gibbons & Rustin Man +4148::Bay City Rollers +4149::Free +4150::Booker T. & The MG's +4151::Eddie Money +4152::Bob Seger +4153::Gene Vincent +4154::Peter & Gordon +4155::John Mellencamp +4156::Bill Haley and the Comets +4157::Wanda Jackson +4158::The Swinging Blue Jeans +4159::The Cowsills +4160::Foghat +4161::Fats Domino +4162::Harry Belafonte +4163::Ricky Nelson +4164::Lesley Gore +4165::The Jeff Healey Band +4166::Tommy James & The Shondells +4167::Little River Band +4168::The Marshall Tucker Band +4169::The Lively Ones +4170::Dion & The Belmonts +4171::The Music Machine +4172::Kenny Rogers +4173::Waylon Jennings +4174::The Beautiful South +4175::The Left Banke +4176::Carl Perkins +4177::Tennessee Ernie Ford +4178::Bo Diddley +4179::Blackfoot +4180::Heathen +4181::Forbidden +4182::Exumer +4183::Our Lady Peace +4184::Dishwalla +4185::Gama Bomb +4186::Dark Angel +4187::Joseph Arthur +4188::Saving Abel +4189::All About Eve +4190::The Breeders +4191::Letzte Instanz +4192::British Sea Power +4193::Dead Fish +4194::Fear Before the March of Flames +4195::Téléphone +4196::White Rose Movement +4197::Milla Jovovich +4198::Renaud +4199::Georges Brassens +4200::Alain Bashung +4201::Prince & The Revolution +4202::Prince and the New Power Generation +4203::Mariza +4204::Gal Costa +4205::Ry Cooder +4206::Francis Cabrel +4207::2002 +4208::Jane Birkin +4209::Phil Ochs +4210::Mitchel Musso +4211::Esmée Denters +4212::The Ready Set +4213::New Boyz +4214::Stereolab +4215::Throwing Muses +4216::Cranes +4217::Deadlock +4218::Innerpartysystem +4219::川井憲次 +4220::Empyrium +4221::Javier Navarrete +4222::Rick James +4223::Bobby Brown +4224::The Polyphonic Spree +4225::Chew Lips +4226::Soulwax +4227::Scarlett Johansson +4228::DatA +4229::2 Many DJ's +4230::Danger +4231::Filthy Dukes +4232::Danny +4233::Zac Efron +4234::Polly Scattergood +4235::Marié Digby +4236::Ben Lee +4237::Bethany Joy Lenz +4238::Tyler Hilton +4239::Grace Potter and the Nocturnals +4240::Heather Nova +4241::Die Antwoord +4242::Muchy +4243::Reverend and The Makers +4244::Wild Beasts +4245::Dying Fetus +4246::Trouble +4247::Summoning +4248::Autopsy +4249::Vanilla Ninja +4250::Moi dix Mois +4251::Charlie Clouser +4252::Azam Ali +4253::My Brightest Diamond +4254::Shearwater +4255::Slint +4256::Vas +4257::High on Fire +4258::Olivier Messiaen +4259::Richard Thompson +4260::Richard Wagner +4261::Count Basie +4262::Benny Goodman +4263::Shocking Blue +4264::Jermaine Jackson +4265::Frida +4266::Neneh Cherry +4267::Wendy Carlos +4268::Lalo Schifrin +4269::Doris Day +4270::Billy Preston +4271::The Waterboys +4272::Ian McCulloch +4273::Julee Cruise +4274::Beth Orton +4275::Shulman +4276::Ott +4277::坂本龍一 +4278::LFO +4279::Fila Brazillia +4280::Entheogenic +4281::Alpha +4282::Jon Kennedy +4283::Murcof +4284::Jega +4285::Jan Jelinek +4286::Medwyn Goodall +4287::Keiko Matsui +4288::Jim Brickman +4289::Urban Myth Club +4290::Moonbootica +4291::Sven Väth +4292::Dykehouse +4293::Dubtribe Sound System +4294::Deuter +4295::VFSix +4296::Raven-Symoné +4297::Adiemus +4298::Therapy? +4299::Can +4300::Terry Reid +4301::Secret Service +4302::Ours +4303::Krokus +4304::Cowboy Junkies +4305::Fountains of Wayne +4306::Nick Cave +4307::Del Shannon +4308::Randy Crawford +4309::Michael Angelo Batio +4310::Tokyo Blade +4311::Bernard Herrmann +4312::Renan Luce +4313::The Shangri-Las +4314::Juliana Hatfield +4315::John Scofield +4316::Brad Mehldau +4317::Nina Hagen +4318::Lizzy Borden +4319::Hellyeah +4320::Blake Lewis +4321::Jeremy Camp +4322::Neon Trees +4323::Flight of the Conchords +4324::Bushido +4325::Anders Manga +4326::Crematory +4327::Death Angel +4328::Virgin Steele +4329::Avalanch +4330::Farben Lehre +4331::The Pillows +4332::Tinariwen +4333::David Holmes +4334::Halford +4335::Billy Corgan +4336::Stephen Lynch +4337::Mercedes Sosa +4338::Peter Broderick +4339::Cirque du Soleil +4340::Luis Miguel +4341::Elbow +4342::Everclear +4343::Do As Infinity +4344::Griffin House +4345::Qntal +4346::Bacilos +4347::Lu +4348::We Are The Ocean +4349::This Town Needs Guns +4350::Immanu El +4351::Agnes +4352::The Starting Line +4353::Salt The Wound +4354::Nightmare of You +4355::Say Anything +4356::Burning Skies +4357::Still Remains +4358::Matchbook Romance +4359::Just Surrender +4360::The Red Chord +4361::The Music +4362::Reggie and the Full Effect +4363::fun. +4364::The Damned Things +4365::As Cities Burn +4366::Young Galaxy +4367::autoKratz +4368::The Echelon Effect +4369::Decoder +4370::Roberta Flack +4371::Pedro the Lion +4372::Rogue Wave +4373::Young Knives +4374::There For Tomorrow +4375::Seabear +4376::The Moldy Peaches +4377::Liquido +4378::Colour Haze +4379::Tiger Army +4380::Nerina Pallot +4381::Capsule +4382::鈴木あみ +4383::Sienna Skies +4384::3 +4385::Third Day +4386::El Canto del Loco +4387::Exilia +4388::Kiln +4389::Midlake +4390::Roots Manuva +4391::The Bouncing Souls +4392::Anouk +4393::Deaf Center +4394::Aidan Baker +4395::Jóhann Jóhannsson +4396::Battles +4397::Cut Chemist +4398::Gregor Samsa +4399::Jaga Jazzist +4400::The Kilimanjaro Darkjazz Ensemble +4401::Soldout +4402::Alex Smoke +4403::Two Lone Swordsmen +4404::Gabriel Ananda +4405::Mira Calix +4406::Sylvain Chauveau +4407::Dirty Three +4408::El-P +4409::Descendents +4410::Kingdom +4411::The Vandals +4412::Dance of Days +4413::Milow +4414::Lloyd +4415::Marques Houston +4416::Electric Wizard +4417::Propagandhi +4418::Lifelover +4419::Edge of Sanity +4420::dälek +4421::Restart +4422::Medicine +4423::Fobia +4424::Cool Kids of Death +4425::Strike +4426::Marjorie Estiano +4427::Ida Maria +4428::The Holloways +4429::oOoOO +4430::Modern Witch +4431::Bolt Action Five +4432::EPMD +4433::Discharge +4434::D.R.I. +4435::7Seconds +4436::Skip James +4437::Fear +4438::Adolescents +4439::Green River +4440::Cro-Mags +4441::Wax Tailor +4442::The Cooper Temple Clause +4443::Stina Nordenstam +4444::Lycia +4445::Audrey +4446::Harland +4447::Mýa +4448::Secede +4449::X-Marks the Pedwalk +4450::Solitary Experiments +4451::Seefeel +4452::T. Raumschmiere +4453::Klinik +4454::Quantic +4455::Northern Lite +4456::Audion +4457::Underground Resistance +4458::Jackson and His Computer Band +4459::GreenGender +4460::Alex Under +4461::Panik +4462::Baroness +4463::Bert Jansch +4464::Ashley Roberts +4465::Cordel do Fogo Encantado +4466::Teoman +4467::The Dubliners +4468::Darvin +4469::The Walkmen +4470::The Black Angels +4471::The Tea Party +4472::¡Forward, Russia! +4473::Carl Orff +4474::Georges Bizet +4475::Yasmin Levy +4476::Peter Brötzmann +4477::Mulatu Astatke +4478::Ali Farka Touré & Toumani Diabaté +4479::Erkan Oğur +4480::Irfan +4481::Joe Henderson +4482::Coleman Hawkins +4483::Wayne Shorter +4484::Zoë Keating +4485::Serkan Süleymaniye +4486::Mercan Dede +4487::Mark Owen +4488::Jesus Jones +4489::White Town +4490::Françoise Hardy +4491::Tim Urban +4492::Gladys Knight & The Pips +4493::Ben E. King +4494::Eve 6 +4495::Edwin McCain +4496::Montell Jordan +4497::mewithoutYou +4498::Copeland +4499::45 Grave +4500::4hero +4501::808 State +4502::Feeder +4503::James Dean Bradfield +4504::Louis Prima +4505::Gorefest +4506::Big Mama Thornton +4507::The Hooters +4508::Dar Williams +4509::Mates of State +4510::Ben Frost +4511::Oficina G3 +4512::NOMAK +4513::Swollen Members +4514::Jimmy Reed +4515::Billy Squier +4516::Julie London +4517::The Gaslight Anthem +4518::Nicole Atkins +4519::Sugarplum Fairy +4520::Little Man Tate +4521::New Radicals +4522::Chantal Kreviazuk +4523::Jackson Browne +4524::BBMak +4525::Lisa Loeb +4526::Wim Mertens +4527::Morton Feldman +4528::Pink Turns Blue +4529::Steve Bug +4530::Deee-Lite +4531::Scout Niblett +4532::I Monster +4533::Boozoo Bajou +4534::Maps And Diagrams +4535::Paris Combo +4536::Hildur Guðnadóttir +4537::Joe McElderry +4538::Britt Nicole +4539::Hillsong +4540::Chris & Cosey +4541::Telepathe +4542::Dima Bilan +4543::Luis Fonsi +4544::Dionne Bromfield +4545::Alex Ubago +4546::Franz Schubert +4547::Michael Nyman +4548::Nâdiya +4549::Fernanda Brum +4550::Twin Shadow +4551::Machine Drum +4552::Mest +4553::The Hold Steady +4554::Cannonball Adderley +4555::Platinum Blonde +4556::Ned's Atomic Dustbin +4557::Moist +4558::久石譲 +4559::Alpinestars +4560::Jonathan Coulton +4561::Carter the Unstoppable Sex Machine +4562::Martha and the Muffins +4563::Kenickie +4564::Magnet +4565::Giorgio Moroder +4566::Catatonia +4567::Pete Townshend +4568::Charlotte Martin +4569::Brooke Fraser +4570::György Ligeti +4571::Zbigniew Preisner +4572::Belleruche +4573::Molotov +4574::Jawbreaker +4575::Gomez +4576::Youssou N'Dour +4577::Nileppez +4578::Keith Moon +4579::Lulu +4580::Joan as Police Woman +4581::Dezerter +4582::O. Children +4583::Gevende +4584::Bülent Ortaçgil +4585::Feridun Düzağaç +4586::Be Your Own Pet +4587::A.C. Newman +4588::Zooey Deschanel +4589::Shantel +4590::Global Deejays +4591::Wonder Girls +4592::Brazilian Girls +4593::Drexciya +4594::Coeur de Pirate +4595::SoKo +4596::Nine Black Alps +4597::The Sunshine Underground +4598::Gridlock +4599::Sparta +4600::Elefant +4601::Fantasia +4602::Fikret Kızılok +4603::Astrobrite +4604::Darren Criss +4605::Abney Park diff --git a/data/ref/lastfm/train_data.df b/data/ref/lastfm/train_data.df new file mode 100644 index 0000000000000000000000000000000000000000..64d93ecd6334cc0b6429352c71e14cccb2e8ede6 --- /dev/null +++ b/data/ref/lastfm/train_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7db71a60d3da4c449091fbc254efc9602f81eec6eb9a60534811ccd61974dbc1 +size 2462846 diff --git a/data/ref/movielens/Test_data.df b/data/ref/movielens/Test_data.df new file mode 100644 index 0000000000000000000000000000000000000000..febfe8e95e86948b494cd6886af5b1b98c4cfbe2 --- /dev/null +++ b/data/ref/movielens/Test_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d38308a0078d4518dc9eeb619c8d1afb53d830712cc7d36ac51cc47eaafc97d6 +size 43718 diff --git a/data/ref/movielens/Val_data.df b/data/ref/movielens/Val_data.df new file mode 100644 index 0000000000000000000000000000000000000000..0311d6a32c81bec102d53a069b624ae066a6bd0a --- /dev/null +++ b/data/ref/movielens/Val_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a950900d0055649e2983ef403d189d5fdc5bd4f84d229a377806d371b32e460 +size 43200 diff --git a/data/ref/movielens/train_data.df b/data/ref/movielens/train_data.df new file mode 100644 index 0000000000000000000000000000000000000000..19684155c14a669229e9492c3702857ad1cc7dfd --- /dev/null +++ b/data/ref/movielens/train_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bac4c88b11e6f76d914c2b22aadbb97315a78432bb79f424f7015775053b9546 +size 9633075 diff --git a/data/ref/movielens/u.item b/data/ref/movielens/u.item new file mode 100644 index 0000000000000000000000000000000000000000..91bb56d53fcb5f8bbac079755593b48d34cfc9a7 --- /dev/null +++ b/data/ref/movielens/u.item @@ -0,0 +1,1682 @@ +1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +2|GoldenEye (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +3|Four Rooms (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Four%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +4|Get Shorty (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Get%20Shorty%20(1995)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +5|Copycat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Copycat%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +6|Shanghai Triad (Yao a yao yao dao waipo qiao) (1995)|01-Jan-1995||http://us.imdb.com/Title?Yao+a+yao+yao+dao+waipo+qiao+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +7|Twelve Monkeys (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Twelve%20Monkeys%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0 +8|Babe (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Babe%20(1995)|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +9|Dead Man Walking (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dead%20Man%20Walking%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +10|Richard III (1995)|22-Jan-1996||http://us.imdb.com/M/title-exact?Richard%20III%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +11|Seven (Se7en) (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Se7en%20(1995)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +12|Usual Suspects, The (1995)|14-Aug-1995||http://us.imdb.com/M/title-exact?Usual%20Suspects,%20The%20(1995)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +13|Mighty Aphrodite (1995)|30-Oct-1995||http://us.imdb.com/M/title-exact?Mighty%20Aphrodite%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +14|Postino, Il (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Postino,%20Il%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +15|Mr. Holland's Opus (1995)|29-Jan-1996||http://us.imdb.com/M/title-exact?Mr.%20Holland's%20Opus%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +16|French Twist (Gazon maudit) (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Gazon%20maudit%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +17|From Dusk Till Dawn (1996)|05-Feb-1996||http://us.imdb.com/M/title-exact?From%20Dusk%20Till%20Dawn%20(1996)|0|1|0|0|0|1|1|0|0|0|0|1|0|0|0|0|1|0|0 +18|White Balloon, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Badkonake%20Sefid%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +19|Antonia's Line (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Antonia%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +20|Angels and Insects (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Angels%20and%20Insects%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +21|Muppet Treasure Island (1996)|16-Feb-1996||http://us.imdb.com/M/title-exact?Muppet%20Treasure%20Island%20(1996)|0|1|1|0|0|1|0|0|0|0|0|0|1|0|0|0|1|0|0 +22|Braveheart (1995)|16-Feb-1996||http://us.imdb.com/M/title-exact?Braveheart%20(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +23|Taxi Driver (1976)|16-Feb-1996||http://us.imdb.com/M/title-exact?Taxi%20Driver%20(1976)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +24|Rumble in the Bronx (1995)|23-Feb-1996||http://us.imdb.com/M/title-exact?Hong%20Faan%20Kui%20(1995)|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +25|Birdcage, The (1996)|08-Mar-1996||http://us.imdb.com/M/title-exact?Birdcage,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +26|Brothers McMullen, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Brothers%20McMullen,%20The%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +27|Bad Boys (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Bad%20Boys%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +28|Apollo 13 (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Apollo%2013%20(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +29|Batman Forever (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Batman%20Forever%20(1995)|0|1|1|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +30|Belle de jour (1967)|01-Jan-1967||http://us.imdb.com/M/title-exact?Belle%20de%20jour%20(1967)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +31|Crimson Tide (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Crimson%20Tide%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|1|0 +32|Crumb (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Crumb%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +33|Desperado (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Desperado%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +34|Doom Generation, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Doom%20Generation,%20The%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +35|Free Willy 2: The Adventure Home (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Free%20Willy%202:%20The%20Adventure%20Home%20(1995)|0|0|1|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +36|Mad Love (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mad%20Love%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +37|Nadja (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Nadja%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +38|Net, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Net,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +39|Strange Days (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Strange%20Days%20(1995)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0 +40|To Wong Foo, Thanks for Everything! Julie Newmar (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?To%20Wong%20Foo,%20Thanks%20for%20Everything!%20Julie%20Newmar%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +41|Billy Madison (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Billy%20Madison%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +42|Clerks (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Clerks%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +43|Disclosure (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Disclosure%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +44|Dolores Claiborne (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Dolores%20Claiborne%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +45|Eat Drink Man Woman (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Yinshi%20Nan%20Nu%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +46|Exotica (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Exotica%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +47|Ed Wood (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Ed%20Wood%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +48|Hoop Dreams (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Hoop%20Dreams%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +49|I.Q. (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?I.Q.%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +50|Star Wars (1977)|01-Jan-1977||http://us.imdb.com/M/title-exact?Star%20Wars%20(1977)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0 +51|Legends of the Fall (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Legends%20of%20the%20Fall%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|1 +52|Madness of King George, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Madness%20of%20King%20George,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +53|Natural Born Killers (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Natural%20Born%20Killers%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +54|Outbreak (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Outbreak%20(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +55|Professional, The (1994)|01-Jan-1994||http://us.imdb.com/Title?L%E9on+(1994)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|1|0|1|0|0 +56|Pulp Fiction (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Pulp%20Fiction%20(1994)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +57|Priest (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Priest%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +58|Quiz Show (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Quiz%20Show%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +59|Three Colors: Red (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Trzy%20kolory:%20Czerwony%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +60|Three Colors: Blue (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Trzy%20kolory:%20Niebieski%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +61|Three Colors: White (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Trzy%20kolory:%20Bialy%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +62|Stargate (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Stargate%20(1994)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +63|Santa Clause, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Santa%20Clause,%20The%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +64|Shawshank Redemption, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Shawshank%20Redemption,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +65|What's Eating Gilbert Grape (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?What's%20Eating%20Gilbert%20Grape%20(1993)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +66|While You Were Sleeping (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?While%20You%20Were%20Sleeping%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +67|Ace Ventura: Pet Detective (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Ace%20Ventura:%20Pet%20Detective%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +68|Crow, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Crow,%20The%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +69|Forrest Gump (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Forrest%20Gump%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|1|0 +70|Four Weddings and a Funeral (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Four%20Weddings%20and%20a%20Funeral%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +71|Lion King, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Lion%20King,%20The%20(1994)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +72|Mask, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Mask,%20The%20(1994)|0|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0 +73|Maverick (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Maverick%20(1994)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +74|Faster Pussycat! Kill! Kill! (1965)|01-Jan-1965||http://us.imdb.com/M/title-exact?Faster%20Pussycat!%20Kill!%20Kill!%20(1965)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +75|Brother Minister: The Assassination of Malcolm X (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Brother%20Minister:%20The%20Assassination%20of%20Malcolm%20X%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +76|Carlito's Way (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Carlito's%20Way%20(1993)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +77|Firm, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Firm,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +78|Free Willy (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Free%20Willy%20(1993)|0|0|1|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +79|Fugitive, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Fugitive,%20The%20(1993)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +80|Hot Shots! Part Deux (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Hot%20Shots!%20Part%20Deux%20(1993)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +81|Hudsucker Proxy, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Hudsucker%20Proxy,%20The%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +82|Jurassic Park (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Jurassic%20Park%20(1993)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +83|Much Ado About Nothing (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Much%20Ado%20About%20Nothing%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +84|Robert A. Heinlein's The Puppet Masters (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Robert%20A.%20Heinlein's%20The%20Puppet%20Masters%20(1994)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +85|Ref, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Ref,%20The%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +86|Remains of the Day, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Remains%20of%20the%20Day,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +87|Searching for Bobby Fischer (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Searching%20for%20Bobby%20Fischer%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +88|Sleepless in Seattle (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Sleepless%20in%20Seattle%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +89|Blade Runner (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Blade%20Runner%20(1982)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0 +90|So I Married an Axe Murderer (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?So%20I%20Married%20an%20Axe%20Murderer%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|1|0|0 +91|Nightmare Before Christmas, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Nightmare%20Before%20Christmas,%20The%20(1993)|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +92|True Romance (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?True%20Romance%20(1993)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0 +93|Welcome to the Dollhouse (1995)|24-May-1996||http://us.imdb.com/Title?Welcome+to+the+Dollhouse+(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +94|Home Alone (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Home%20Alone%20(1990)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +95|Aladdin (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Aladdin%20(1992)|0|0|0|1|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +96|Terminator 2: Judgment Day (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Terminator%202:%20Judgment%20Day%20(1991)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +97|Dances with Wolves (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Dances%20with%20Wolves%20(1990)|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1 +98|Silence of the Lambs, The (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Silence%20of%20the%20Lambs,%20The%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +99|Snow White and the Seven Dwarfs (1937)|01-Jan-1937||http://us.imdb.com/M/title-exact?Snow%20White%20and%20the%20Seven%20Dwarfs%20(1937)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +100|Fargo (1996)|14-Feb-1997||http://us.imdb.com/M/title-exact?Fargo%20(1996)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +101|Heavy Metal (1981)|08-Mar-1981||http://us.imdb.com/M/title-exact?Heavy%20Metal%20(1981)|0|1|1|1|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +102|Aristocats, The (1970)|01-Jan-1970||http://us.imdb.com/M/title-exact?Aristocats,%20The%20(1970)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +103|All Dogs Go to Heaven 2 (1996)|29-Mar-1996||http://us.imdb.com/M/title-exact?All%20Dogs%20Go%20to%20Heaven%202%20(1996)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +104|Theodore Rex (1995)|29-Mar-1996||http://us.imdb.com/M/title-exact?Theodore%20Rex%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +105|Sgt. Bilko (1996)|29-Mar-1996||http://us.imdb.com/M/title-exact?Sgt.%20Bilko%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +106|Diabolique (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Diabolique%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +107|Moll Flanders (1996)|14-Jun-1996||http://us.imdb.com/M/title-exact?Moll%20Flanders%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +108|Kids in the Hall: Brain Candy (1996)|12-Apr-1996||http://us.imdb.com/M/title-exact?Kids%20in%20the%20Hall:%20Brain%20Candy%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +109|Mystery Science Theater 3000: The Movie (1996)|19-Apr-1996||http://us.imdb.com/M/title-exact?Mystery%20Science%20Theater%203000:%20The%20Movie%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +110|Operation Dumbo Drop (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Operation%20Dumbo%20Drop%20(1995)|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +111|Truth About Cats & Dogs, The (1996)|26-Apr-1996||http://us.imdb.com/M/title-exact?Truth%20About%20Cats%20&%20Dogs,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +112|Flipper (1996)|10-May-1996||http://us.imdb.com/M/title-exact?Flipper%20(1996)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +113|Horseman on the Roof, The (Hussard sur le toit, Le) (1995)|19-Apr-1996||http://us.imdb.com/M/title-exact?Hussard%20sur%20le%20toit,%20Le%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +114|Wallace & Gromit: The Best of Aardman Animation (1996)|05-Apr-1996||http://us.imdb.com/Title?Wallace+%26+Gromit%3A+The+Best+of+Aardman+Animation+(1996)|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +115|Haunted World of Edward D. Wood Jr., The (1995)|26-Apr-1996||http://us.imdb.com/Title?Haunted+World+of+Edward+D.+Wood+Jr.,+The+(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +116|Cold Comfort Farm (1995)|23-Apr-1996||http://us.imdb.com/M/title-exact?Cold%20Comfort%20Farm%20(1995)%20(TV)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +117|Rock, The (1996)|07-Jun-1996||http://us.imdb.com/M/title-exact?Rock,%20The%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +118|Twister (1996)|10-May-1996||http://us.imdb.com/M/title-exact?Twister%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +119|Maya Lin: A Strong Clear Vision (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Maya%20Lin:%20A%20Strong%20Clear%20Vision%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +120|Striptease (1996)|28-Jun-1996||http://us.imdb.com/M/title-exact?Striptease%20(1996)|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +121|Independence Day (ID4) (1996)|03-Jul-1996||http://us.imdb.com/M/title-exact?Independence%20Day%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0 +122|Cable Guy, The (1996)|14-Jun-1996||http://us.imdb.com/M/title-exact?Cable%20Guy,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +123|Frighteners, The (1996)|19-Jul-1996||http://us.imdb.com/M/title-exact?Frighteners,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +124|Lone Star (1996)|21-Jun-1996||http://us.imdb.com/M/title-exact?Lone%20Star%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0 +125|Phenomenon (1996)|29-Jun-1996||http://us.imdb.com/M/title-exact?Phenomenon%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +126|Spitfire Grill, The (1996)|06-Sep-1996||http://us.imdb.com/M/title-exact?Spitfire%20Grill,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +127|Godfather, The (1972)|01-Jan-1972||http://us.imdb.com/M/title-exact?Godfather,%20The%20(1972)|0|1|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +128|Supercop (1992)|26-Jul-1996||http://us.imdb.com/M/title-exact?Police%20Story%20III:%20Supercop%20(1992)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +129|Bound (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?Bound%20(1996)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|1|0|1|0|0 +130|Kansas City (1996)|16-Aug-1996||http://us.imdb.com/M/title-exact?Kansas%20City%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +131|Breakfast at Tiffany's (1961)|01-Jan-1961||http://us.imdb.com/M/title-exact?Breakfast%20at%20Tiffany's%20(1961)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +132|Wizard of Oz, The (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?Wizard%20of%20Oz,%20The%20(1939)|0|0|1|0|1|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +133|Gone with the Wind (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?Gone%20with%20the%20Wind%20(1939)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|0 +134|Citizen Kane (1941)|01-Jan-1941||http://us.imdb.com/M/title-exact?Citizen%20Kane%20(1941)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +135|2001: A Space Odyssey (1968)|01-Jan-1968||http://us.imdb.com/M/title-exact?2001:%20A%20Space%20Odyssey%20(1968)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|1|1|0|0 +136|Mr. Smith Goes to Washington (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?Mr.%20Smith%20Goes%20to%20Washington%20(1939)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +137|Big Night (1996)|20-Sep-1996||http://us.imdb.com/M/title-exact?Big%20Night%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +138|D3: The Mighty Ducks (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?D3:%20The%20Mighty%20Ducks%20(1996)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +139|Love Bug, The (1969)|01-Jan-1969||http://us.imdb.com/M/title-exact?Love%20Bug,%20The%20(1969)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +140|Homeward Bound: The Incredible Journey (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Homeward%20Bound:%20The%20Incredible%20Journey%20(1993)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +141|20,000 Leagues Under the Sea (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?20,000%20Leagues%20Under%20the%20Sea%20(1954)|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|1|0|0|0 +142|Bedknobs and Broomsticks (1971)|01-Jan-1971||http://us.imdb.com/M/title-exact?Bedknobs%20and%20Broomsticks%20(1971)|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +143|Sound of Music, The (1965)|01-Jan-1965||http://us.imdb.com/M/title-exact?Sound%20of%20Music,%20The%20(1965)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +144|Die Hard (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Die%20Hard%20(1988)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +145|Lawnmower Man, The (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Lawnmower%20Man,%20The%20(1992)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +146|Unhook the Stars (1996)|30-Oct-1996||http://us.imdb.com/M/title-exact?Unhook%20the%20Stars%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +147|Long Kiss Goodnight, The (1996)|05-Oct-1996||http://us.imdb.com/M/title-exact?Long%20Kiss%20Goodnight,%20The%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +148|Ghost and the Darkness, The (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Ghost%20and%20the%20Darkness,%20The%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +149|Jude (1996)|01-Nov-1996||http://us.imdb.com/M/title-exact?Jude%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +150|Swingers (1996)|18-Oct-1996||http://us.imdb.com/M/title-exact?Swingers%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +151|Willy Wonka and the Chocolate Factory (1971)|01-Jan-1971||http://us.imdb.com/M/title-exact?Willy%20Wonka%20and%20the%20Chocolate%20Factory%20(1971)|0|0|1|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +152|Sleeper (1973)|01-Jan-1973||http://us.imdb.com/M/title-exact?Sleeper%20(1973)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +153|Fish Called Wanda, A (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Fish%20Called%20Wanda,%20A%20(1988)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +154|Monty Python's Life of Brian (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Life%20of%20Brian%20(1979)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +155|Dirty Dancing (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Dirty%20Dancing%20(1987)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0 +156|Reservoir Dogs (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Reservoir%20Dogs%20(1992)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +157|Platoon (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Platoon%20(1986)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +158|Weekend at Bernie's (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Weekend%20at%20Bernie's%20(1989)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +159|Basic Instinct (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Basic%20Instinct%20(1992)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +160|Glengarry Glen Ross (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Glengarry%20Glen%20Ross%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +161|Top Gun (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Top%20Gun%20(1986)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +162|On Golden Pond (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?On%20Golden%20Pond%20(1981)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +163|Return of the Pink Panther, The (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Return%20of%20the%20Pink%20Panther,%20The%20(1974)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +164|Abyss, The (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Abyss,%20The%20(1989)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +165|Jean de Florette (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Jean%20de%20Florette%20(1986)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +166|Manon of the Spring (Manon des sources) (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Manon%20des%20sources%20(1986)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +167|Private Benjamin (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Private%20Benjamin%20(1980)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +168|Monty Python and the Holy Grail (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Monty%20Python%20and%20the%20Holy%20Grail%20(1974)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +169|Wrong Trousers, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Wrong%20Trousers,%20The%20(1993)|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +170|Cinema Paradiso (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Nuovo%20cinema%20Paradiso%20(1988)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +171|Delicatessen (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Delicatessen%20(1991)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +172|Empire Strikes Back, The (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Empire%20Strikes%20Back,%20The%20(1980)|0|1|1|0|0|0|0|0|1|0|0|0|0|0|1|1|0|1|0 +173|Princess Bride, The (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Princess%20Bride,%20The%20(1987)|0|1|1|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +174|Raiders of the Lost Ark (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Raiders%20of%20the%20Lost%20Ark%20(1981)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +175|Brazil (1985)|01-Jan-1985||http://us.imdb.com/M/title-exact?Brazil%20(1985)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +176|Aliens (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Aliens%20(1986)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|1|0 +177|Good, The Bad and The Ugly, The (1966)|01-Jan-1966||http://us.imdb.com/M/title-exact?Buono,%20il%20brutto,%20il%20cattivo,%20Il%20(1966)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +178|12 Angry Men (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?12%20Angry%20Men%20(1957)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +179|Clockwork Orange, A (1971)|01-Jan-1971||http://us.imdb.com/M/title-exact?Clockwork%20Orange,%20A%20(1971)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +180|Apocalypse Now (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Apocalypse%20Now%20(1979)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +181|Return of the Jedi (1983)|14-Mar-1997||http://us.imdb.com/M/title-exact?Return%20of%20the%20Jedi%20(1983)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0 +182|GoodFellas (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?GoodFellas%20(1990)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +183|Alien (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Alien%20(1979)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|1|1|0|0 +184|Army of Darkness (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Army%20of%20Darkness%20(1993)|0|1|1|0|0|1|0|0|0|0|0|1|0|0|0|1|0|0|0 +185|Psycho (1960)|01-Jan-1960||http://us.imdb.com/M/title-exact?Psycho%20(1960)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|1|0|0 +186|Blues Brothers, The (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Blues%20Brothers,%20The%20(1980)|0|1|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +187|Godfather: Part II, The (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Godfather:%20Part%20II,%20The%20(1974)|0|1|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +188|Full Metal Jacket (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Full%20Metal%20Jacket%20(1987)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +189|Grand Day Out, A (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Grand%20Day%20Out,%20A%20(1992)|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +190|Henry V (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Henry%20V%20(1989)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +191|Amadeus (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Amadeus%20(1984)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0 +192|Raging Bull (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Raging%20Bull%20(1980)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +193|Right Stuff, The (1983)|01-Jan-1983||http://us.imdb.com/M/title-exact?Right%20Stuff,%20The%20(1983)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +194|Sting, The (1973)|01-Jan-1973||http://us.imdb.com/M/title-exact?Sting,%20The%20(1973)|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +195|Terminator, The (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Terminator,%20The%20(1984)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +196|Dead Poets Society (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Dead%20Poets%20Society%20(1989)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +197|Graduate, The (1967)|01-Jan-1967||http://us.imdb.com/M/title-exact?Graduate,%20The%20(1967)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +198|Nikita (La Femme Nikita) (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Nikita%20(1990)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +199|Bridge on the River Kwai, The (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Bridge%20on%20the%20River%20Kwai,%20The%20(1957)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +200|Shining, The (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Shining,%20The%20(1980)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +201|Evil Dead II (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Evil%20Dead%20II%20(1987)|0|1|1|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +202|Groundhog Day (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Groundhog%20Day%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +203|Unforgiven (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Unforgiven%20(1992)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +204|Back to the Future (1985)|01-Jan-1985||http://us.imdb.com/M/title-exact?Back%20to%20the%20Future%20(1985)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +205|Patton (1970)|01-Jan-1970||http://us.imdb.com/M/title-exact?Patton%20(1970)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +206|Akira (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Akira%20(1988)|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +207|Cyrano de Bergerac (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Cyrano%20de%20Bergerac%20(1990)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +208|Young Frankenstein (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Young%20Frankenstein%20(1974)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +209|This Is Spinal Tap (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?This%20Is%20Spinal%20Tap%20(1984)|0|0|0|0|0|1|0|0|1|0|0|0|1|0|0|0|0|0|0 +210|Indiana Jones and the Last Crusade (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Indiana%20Jones%20and%20the%20Last%20Crusade%20(1989)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +211|M*A*S*H (1970)|01-Jan-1970||http://us.imdb.com/M/title-exact?MASH%20(1970)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +212|Unbearable Lightness of Being, The (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Unbearable%20Lightness%20of%20Being,%20The%20(1988)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +213|Room with a View, A (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Room%20with%20a%20View,%20A%20(1986)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +214|Pink Floyd - The Wall (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Pink%20Floyd%20-%20The%20Wall%20(1982)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|1|0 +215|Field of Dreams (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Field%20of%20Dreams%20(1989)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +216|When Harry Met Sally... (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?When%20Harry%20Met%20Sally...%20(1989)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +217|Bram Stoker's Dracula (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Bram%20Stoker's%20Dracula%20(1992)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0 +218|Cape Fear (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Cape%20Fear%20(1991)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +219|Nightmare on Elm Street, A (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Nightmare%20on%20Elm%20Street,%20A%20(1984)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +220|Mirror Has Two Faces, The (1996)|15-Nov-1996||http://us.imdb.com/M/title-exact?Mirror%20Has%20Two%20Faces,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +221|Breaking the Waves (1996)|15-Nov-1996||http://us.imdb.com/M/title-exact?Breaking%20the%20Waves%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +222|Star Trek: First Contact (1996)|22-Nov-1996||http://us.imdb.com/M/title-exact?Star%20Trek:%20First%20Contact%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +223|Sling Blade (1996)|22-Nov-1996||http://us.imdb.com/M/title-exact?Sling%20Blade%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +224|Ridicule (1996)|27-Nov-1996||http://us.imdb.com/M/title-exact?Ridicule%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +225|101 Dalmatians (1996)|27-Nov-1996||http://us.imdb.com/M/title-exact?101%20Dalmatians%20(1996)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +226|Die Hard 2 (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Die%20Hard%202%20(1990)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +227|Star Trek VI: The Undiscovered Country (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Star%20Trek%20VI:%20The%20Undiscovered%20Country%20(1991)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +228|Star Trek: The Wrath of Khan (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Star%20Trek:%20The%20Wrath%20of%20Khan%20(1982)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +229|Star Trek III: The Search for Spock (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Star%20Trek%20III:%20The%20Search%20for%20Spock%20(1984)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +230|Star Trek IV: The Voyage Home (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Star%20Trek%20IV:%20The%20Voyage%20Home%20(1986)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +231|Batman Returns (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Batman%20Returns%20(1992)|0|1|1|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +232|Young Guns (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Young%20Guns%20(1988)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +233|Under Siege (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Under%20Siege%20(1992)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +234|Jaws (1975)|01-Jan-1975||http://us.imdb.com/M/title-exact?Jaws%20(1975)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +235|Mars Attacks! (1996)|13-Dec-1996||http://us.imdb.com/M/title-exact?Mars%20Attacks!%20(1996)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|1|0 +236|Citizen Ruth (1996)|13-Dec-1996||http://us.imdb.com/M/title-exact?Citizen%20Ruth%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +237|Jerry Maguire (1996)|13-Dec-1996||http://us.imdb.com/M/title-exact?Jerry%20Maguire%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +238|Raising Arizona (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Raising%20Arizona%20(1987)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +239|Sneakers (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Sneakers%20(1992)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|1|0|0|0 +240|Beavis and Butt-head Do America (1996)|20-Dec-1996||http://us.imdb.com/M/title-exact?Beavis%20and%20Butt-head%20Do%20America%20(1996)|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +241|Last of the Mohicans, The (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Last%20of%20the%20Mohicans,%20The%20(1992)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0 +242|Kolya (1996)|24-Jan-1997||http://us.imdb.com/M/title-exact?Kolya%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +243|Jungle2Jungle (1997)|07-Mar-1997||http://us.imdb.com/M/title-exact?Jungle2Jungle%20(1997)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +244|Smilla's Sense of Snow (1997)|14-Mar-1997||http://us.imdb.com/M/title-exact?Smilla%27s%20Sense%20of%20Snow%20(1997)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +245|Devil's Own, The (1997)|26-Mar-1997||http://us.imdb.com/M/title-exact?Devil%27s%20Own%2C%20The%20(1997)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|1|0 +246|Chasing Amy (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Chasing+Amy+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +247|Turbo: A Power Rangers Movie (1997)|28-Mar-1997||http://us.imdb.com/M/title-exact?Turbo%3A%20A%20Power%20Rangers%20Movie%20%281997%29|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +248|Grosse Pointe Blank (1997)|11-Apr-1997||http://us.imdb.com/M/title-exact?Grosse%20Pointe%20Blank%20%281997%29|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +249|Austin Powers: International Man of Mystery (1997)|02-May-1997||http://us.imdb.com/M/title-exact?Austin%20Powers%3A%20International%20Man%20of%20Mystery%20%281997%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +250|Fifth Element, The (1997)|09-May-1997||http://us.imdb.com/M/title-exact?Fifth%20Element%2C%20The%20%281997%29|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +251|Shall We Dance? (1996)|11-Jul-1997||http://us.imdb.com/M/title-exact?Shall%20we%20DANSU%3F%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +252|Lost World: Jurassic Park, The (1997)|23-May-1997||http://us.imdb.com/M/title-exact?Lost%20World%3A%20Jurassic%20Park%2C%20The%20%281997%29|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +253|Pillow Book, The (1995)|13-Jun-1997||http://us.imdb.com/M/title-exact?Pillow%20Book%2C%20The%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +254|Batman & Robin (1997)|20-Jun-1997||http://us.imdb.com/M/title-exact?Batman+%26+Robin+(1997)|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +255|My Best Friend's Wedding (1997)|20-Jun-1997||http://us.imdb.com/M/title-exact?My+Best+Friend%27s+Wedding+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +256|When the Cats Away (Chacun cherche son chat) (1996)|20-Jun-1997||http://us.imdb.com/M/title-exact?Chacun+cherche+son+chat+(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +257|Men in Black (1997)|04-Jul-1997||http://us.imdb.com/M/title-exact?Men+in+Black+(1997)|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +258|Contact (1997)|11-Jul-1997||http://us.imdb.com/Title?Contact+(1997/I)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0 +259|George of the Jungle (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?George+of+the+Jungle+(1997)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +260|Event Horizon (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Event+Horizon+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|1|1|0|0 +261|Air Bud (1997)|01-Aug-1997||http://us.imdb.com/M/title-exact?Air+Bud+(1997)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +262|In the Company of Men (1997)|01-Aug-1997||http://us.imdb.com/M/title-exact?In+the+Company+of+Men+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +263|Steel (1997)|15-Aug-1997||http://us.imdb.com/M/title-exact?Steel+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +264|Mimic (1997)|22-Aug-1997||http://us.imdb.com/M/title-exact?Mimic+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +265|Hunt for Red October, The (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Hunt+for+Red+October%2C+The+(1990)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +266|Kull the Conqueror (1997)|29-Aug-1997||http://us.imdb.com/M/title-exact?Kull+the+Conqueror+(1997)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +267|unknown||||1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +268|Chasing Amy (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Chasing+Amy+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +269|Full Monty, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Full+Monty%2C+The+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +270|Gattaca (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Gattaca+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|1|0|0 +271|Starship Troopers (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Starship+Troopers+(1997)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0 +272|Good Will Hunting (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119217|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +273|Heat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Heat%20(1995)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +274|Sabrina (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Sabrina%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +275|Sense and Sensibility (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Sense%20and%20Sensibility%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +276|Leaving Las Vegas (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Leaving%20Las%20Vegas%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +277|Restoration (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Restoration%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +278|Bed of Roses (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Bed%20of%20Roses%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +279|Once Upon a Time... When We Were Colored (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Once%20Upon%20a%20Time... When%20We%20Were%20Colored%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +280|Up Close and Personal (1996)|01-Mar-1996||http://us.imdb.com/M/title-exact?Up%20Close%20and%20Personal%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +281|River Wild, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?River%20Wild,%20The%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +282|Time to Kill, A (1996)|13-Jul-1996||http://us.imdb.com/M/title-exact?Time%20to%20Kill,%20A%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +283|Emma (1996)|02-Aug-1996||http://us.imdb.com/M/title-exact?Emma%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +284|Tin Cup (1996)|16-Aug-1996||http://us.imdb.com/M/title-exact?Tin%20Cup%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +285|Secrets & Lies (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?Secrets%20&%20Lies%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +286|English Patient, The (1996)|15-Nov-1996||http://us.imdb.com/M/title-exact?English%20Patient,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|0 +287|Marvin's Room (1996)|18-Dec-1996||http://us.imdb.com/M/title-exact?Marvin's%20Room%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +288|Scream (1996)|20-Dec-1996||http://us.imdb.com/M/title-exact?Scream%20(1996)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +289|Evita (1996)|25-Dec-1996||http://us.imdb.com/M/title-exact?Evita%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +290|Fierce Creatures (1997)|10-Jan-1997||http://us.imdb.com/M/title-exact?Fierce%20Creatures%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +291|Absolute Power (1997)|14-Feb-1997||http://us.imdb.com/M/title-exact?Absolute%20Power%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +292|Rosewood (1997)|21-Feb-1997||http://us.imdb.com/M/title-exact?Rosewood%20(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +293|Donnie Brasco (1997)|28-Feb-1997||http://us.imdb.com/M/title-exact?Donnie%20Brasco%20(1997)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +294|Liar Liar (1997)|21-Mar-1997||http://us.imdb.com/Title?Liar+Liar+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +295|Breakdown (1997)|02-May-1997||http://us.imdb.com/M/title-exact?Breakdown%20%281997%29|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +296|Promesse, La (1996)|16-May-1997||http://us.imdb.com/M/title-exact?Promesse%2C%20La%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +297|Ulee's Gold (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Ulee%27s+Gold+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +298|Face/Off (1997)|27-Jun-1997||http://us.imdb.com/M/title-exact?Face/Off+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +299|Hoodlum (1997)|22-Aug-1997||http://us.imdb.com/M/title-exact?Hoodlum+(1997)|0|0|0|0|0|0|1|0|1|0|1|0|0|0|0|0|0|0|0 +300|Air Force One (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Air+Force+One+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +301|In & Out (1997)|19-Sep-1997||http://us.imdb.com/Title?In+%26+Out+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +302|L.A. Confidential (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?L%2EA%2E+Confidential+(1997)|0|0|0|0|0|0|1|0|0|0|1|0|0|1|0|0|1|0|0 +303|Ulee's Gold (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Ulee%27s+Gold+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +304|Fly Away Home (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?Fly%20Away%20Home%20(1996)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +305|Ice Storm, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Ice+Storm%2C+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +306|Mrs. Brown (Her Majesty, Mrs. Brown) (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Her+Majesty%2C+Mrs%2E+Brown+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +307|Devil's Advocate, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Devil's+Advocate,+The+(1997)|0|0|0|0|0|0|1|0|0|0|0|1|0|1|0|0|1|0|0 +308|FairyTale: A True Story (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Fairytale:+A+True+Story+(1997)|0|0|0|0|1|0|0|0|1|1|0|0|0|0|0|0|0|0|0 +309|Deceiver (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Liar+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +310|Rainmaker, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Rainmaker,+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +311|Wings of the Dove, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Wings+of+the+Dove%2C+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|1|0|0 +312|Midnight in the Garden of Good and Evil (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Midnight+in+the+Garden+of+Good+and+Evil+(1997)|0|0|0|0|0|1|1|0|1|0|0|0|0|1|0|0|0|0|0 +313|Titanic (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120338|0|1|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +314|3 Ninjas: High Noon At Mega Mountain (1998)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-118539|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +315|Apt Pupil (1998)|23-Oct-1998||http://us.imdb.com/Title?Apt+Pupil+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +316|As Good As It Gets (1997)|23-Dec-1997||http://us.imdb.com/Title?As+Good+As+It+Gets+(1997)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +317|In the Name of the Father (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?In%20the%20Name%20of%20the%20Father%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +318|Schindler's List (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Schindler's%20List%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +319|Everyone Says I Love You (1996)|06-Dec-1996||http://us.imdb.com/M/title-exact?Everyone%20Says%20I%20Love%20You%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +320|Paradise Lost: The Child Murders at Robin Hood Hills (1996)|06-Dec-1996||http://us.imdb.com/M/title-exact?Paradise%20Lost%3a%20The%20Child%20Murders%20at%20Robin%20Hood%20Hills%20(1996)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +321|Mother (1996)|25-Dec-1996||http://us.imdb.com/M/title-exact?Mother%20(1996/I)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +322|Murder at 1600 (1997)|18-Apr-1997||http://us.imdb.com/M/title-exact?Murder%20at%201600%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +323|Dante's Peak (1997)|07-Feb-1997||http://us.imdb.com/M/title-exact?Dante's%20Peak%20(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +324|Lost Highway (1997)|21-Feb-1997||http://us.imdb.com/Title?Lost+Highway+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0 +325|Crash (1996)|21-Mar-1997||http://us.imdb.com/M/title-exact?Crash%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +326|G.I. Jane (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?G%2EI%2E+Jane+(1997)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +327|Cop Land (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Cop+Land+(1997)|0|0|0|0|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0 +328|Conspiracy Theory (1997)|08-Aug-1997||http://us.imdb.com/M/title-exact?Conspiracy+Theory+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|0 +329|Desperate Measures (1998)|30-Jan-1998||http://us.imdb.com/Title?Desperate+Measures+(1998)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +330|187 (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?187+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +331|Edge, The (1997)|26-Sep-1997||http://us.imdb.com/M/title-exact?Edge%2C+The+(1997/I)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +332|Kiss the Girls (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Kiss+the+Girls+(1997)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +333|Game, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Game%2C+The+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +334|U Turn (1997)|01-Jan-1997||http://us.imdb.com/Title?U+Turn+(1997)|0|1|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0 +335|How to Be a Player (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?How+to+Be+a+Player+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +336|Playing God (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Playing+God+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +337|House of Yes, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?House+of+Yes,+The+(1997)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|1|0|0 +338|Bean (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Bean+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +339|Mad City (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Mad+City+(1997)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +340|Boogie Nights (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Boogie+Nights+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +341|Critical Care (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Critical+Care+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +342|Man Who Knew Too Little, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Man+Who+Knew+Too+Little%2C+The+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0 +343|Alien: Resurrection (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Alien%3A+Resurrection+(1997)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +344|Apostle, The (1997)|18-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-118632|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +345|Deconstructing Harry (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-118954|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +346|Jackie Brown (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119396|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +347|Wag the Dog (1997)|09-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120885|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +348|Desperate Measures (1998)|30-Jan-1998||http://us.imdb.com/Title?Desperate+Measures+(1998)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +349|Hard Rain (1998)|16-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120696|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +350|Fallen (1998)|16-Jan-1998||http://us.imdb.com/Title?Fallen+(1998)|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +351|Prophecy II, The (1998)|16-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-119959|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +352|Spice World (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120185|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +353|Deep Rising (1998)|30-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-118956|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +354|Wedding Singer, The (1998)|13-Feb-1998||http://us.imdb.com/M/title-exact?Wedding+Singer%2C+The+(1998)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +355|Sphere (1998)|13-Feb-1998||http://us.imdb.com/M/title-exact?Sphere+(1998)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +356|Client, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Client,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|1|0|0 +357|One Flew Over the Cuckoo's Nest (1975)|01-Jan-1975||http://us.imdb.com/M/title-exact?One%20Flew%20Over%20the%20Cuckoo's%20Nest%20(1975)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +358|Spawn (1997)|01-Aug-1997||http://us.imdb.com/M/title-exact?Spawn+(1997/I)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +359|Assignment, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Assignment%2C+The+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +360|Wonderland (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Wonderland+(1997)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +361|Incognito (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Incognito+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +362|Blues Brothers 2000 (1998)|06-Feb-1998||http://us.imdb.com/M/title-exact?Blues+Brothers+2000+(1998)|0|1|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +363|Sudden Death (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Sudden%20Death%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +364|Ace Ventura: When Nature Calls (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Ace%20Ventura:%20When%20Nature%20Calls%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +365|Powder (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Powder%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +366|Dangerous Minds (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dangerous%20Minds%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +367|Clueless (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Clueless%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +368|Bio-Dome (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Bio-Dome%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +369|Black Sheep (1996)|02-Feb-1996||http://us.imdb.com/M/title-exact?Black%20Sheep%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +370|Mary Reilly (1996)|23-Feb-1996||http://us.imdb.com/M/title-exact?Mary%20Reilly%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +371|Bridges of Madison County, The (1995)|09-Feb-1996||http://us.imdb.com/M/title-exact?Bridges%20of%20Madison%20County,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +372|Jeffrey (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Jeffrey%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +373|Judge Dredd (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Judge%20Dredd%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +374|Mighty Morphin Power Rangers: The Movie (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mighty%20Morphin%20Power%20Rangers:%20The%20Movie%20(1995)|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +375|Showgirls (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Showgirls%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +376|Houseguest (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Houseguest%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +377|Heavyweights (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Heavyweights%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +378|Miracle on 34th Street (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Miracle%20on%2034th%20Street%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +379|Tales From the Crypt Presents: Demon Knight (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tales%20From%20the%20Crypt%20Presents:%20Demon%20Knight%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +380|Star Trek: Generations (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Star%20Trek:%20Generations%20(1994)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +381|Muriel's Wedding (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Muriel's%20Wedding%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +382|Adventures of Priscilla, Queen of the Desert, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Adventures%20of%20Priscilla,%20Queen%20of%20the%20Desert,%20The%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +383|Flintstones, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Flintstones,%20The%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +384|Naked Gun 33 1/3: The Final Insult (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Naked%20Gun%2033%201/3:%20The%20Final%20Insult%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +385|True Lies (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?True%20Lies%20(1994)|0|1|1|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +386|Addams Family Values (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Addams%20Family%20Values%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +387|Age of Innocence, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Age%20of%20Innocence,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +388|Beverly Hills Cop III (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Beverly%20Hills%20Cop%20III%20(1994)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +389|Black Beauty (1994)|01-Jan-1994||http://us.imdb.com/Title?Black+Beauty+(1994/I)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +390|Fear of a Black Hat (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Fear%20of%20a%20Black%20Hat%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +391|Last Action Hero (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Last%20Action%20Hero%20(1993)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +392|Man Without a Face, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Man%20Without%20a%20Face,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +393|Mrs. Doubtfire (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Mrs.%20Doubtfire%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +394|Radioland Murders (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Radioland%20Murders%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|1|1|0|0|0|0 +395|Robin Hood: Men in Tights (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Robin%20Hood:%20Men%20in%20Tights%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +396|Serial Mom (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Serial%20Mom%20(1994)|0|0|0|0|0|1|1|0|0|0|0|1|0|0|0|0|0|0|0 +397|Striking Distance (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Striking%20Distance%20(1993)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +398|Super Mario Bros. (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Super%20Mario%20Bros.%20(1993)|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +399|Three Musketeers, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Three%20Musketeers,%20The%20(1993)|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +400|Little Rascals, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Little%20Rascals,%20The%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +401|Brady Bunch Movie, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Brady%20Bunch%20Movie,%20The%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +402|Ghost (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Ghost%20(1990)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|1|0|0 +403|Batman (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Batman%20(1989)|0|1|1|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +404|Pinocchio (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Pinocchio%20(1940)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +405|Mission: Impossible (1996)|22-May-1996||http://us.imdb.com/M/title-exact?Mission:%20Impossible%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0 +406|Thinner (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?Thinner%20(1996)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +407|Spy Hard (1996)|24-May-1996||http://us.imdb.com/M/title-exact?Spy%20Hard%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +408|Close Shave, A (1995)|28-Apr-1996||http://us.imdb.com/M/title-exact?Close%20Shave,%20A%20(1995)|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0 +409|Jack (1996)|07-Aug-1996||http://us.imdb.com/M/title-exact?Jack%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +410|Kingpin (1996)|12-Jul-1996||http://us.imdb.com/M/title-exact?Kingpin%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +411|Nutty Professor, The (1996)|28-Jun-1996||http://us.imdb.com/M/title-exact?Nutty%20Professor,%20The%20(1996)|0|0|0|0|0|1|0|0|0|1|0|0|0|0|1|1|0|0|0 +412|Very Brady Sequel, A (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Very%20Brady%20Sequel,%20A%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +413|Tales from the Crypt Presents: Bordello of Blood (1996)|19-Jul-1996||http://us.imdb.com/M/title-exact?Tales%20from%20the%20Crypt%20Presents:%20Bordello%20of%20Blood%20(1996)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +414|My Favorite Year (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?My%20Favorite%20Year%20(1982)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +415|Apple Dumpling Gang, The (1975)|01-Jan-1975||http://us.imdb.com/M/title-exact?Apple%20Dumpling%20Gang,%20The%20(1975)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +416|Old Yeller (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Old%20Yeller%20(1957)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +417|Parent Trap, The (1961)|01-Jan-1961||http://us.imdb.com/M/title-exact?Parent%20Trap,%20The%20(1961)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +418|Cinderella (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?Cinderella%20(1950)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +419|Mary Poppins (1964)|01-Jan-1964||http://us.imdb.com/M/title-exact?Mary%20Poppins%20(1964)|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +420|Alice in Wonderland (1951)|01-Jan-1951||http://us.imdb.com/M/title-exact?Alice%20in%20Wonderland%20(1951)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +421|William Shakespeare's Romeo and Juliet (1996)|25-Oct-1996||http://us.imdb.com/Title?Romeo+%2B+Juliet+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +422|Aladdin and the King of Thieves (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Aladdin%20and%20the%20King%20of%20Thieves%20(1996)%20(V)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +423|E.T. the Extra-Terrestrial (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?E%2ET%2E%20the%20Extra-Terrestrial%20%281982%29|0|0|0|0|1|0|0|0|1|1|0|0|0|0|0|1|0|0|0 +424|Children of the Corn: The Gathering (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Children%20of%20the%20Corn%3A%20The%20Gathering%20%281996%29|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +425|Bob Roberts (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Bob%20Roberts%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +426|Transformers: The Movie, The (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Transformers:%20The%20Movie,%20The%20(1986)|0|1|0|1|1|0|0|0|0|0|0|0|0|0|0|1|1|1|0 +427|To Kill a Mockingbird (1962)|01-Jan-1962||http://us.imdb.com/M/title-exact?To%20Kill%20a%20Mockingbird%20(1962)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +428|Harold and Maude (1971)|01-Jan-1971||http://us.imdb.com/M/title-exact?Harold%20and%20Maude%20(1971)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +429|Day the Earth Stood Still, The (1951)|01-Jan-1951||http://us.imdb.com/M/title-exact?Day%20the%20Earth%20Stood%20Still,%20The%20(1951)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0 +430|Duck Soup (1933)|01-Jan-1933||http://us.imdb.com/M/title-exact?Duck%20Soup%20(1933)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +431|Highlander (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Highlander%20(1986)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +432|Fantasia (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Fantasia%20(1940)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +433|Heathers (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Heathers%20(1989)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +434|Forbidden Planet (1956)|01-Jan-1956||http://us.imdb.com/M/title-exact?Forbidden%20Planet%20(1956)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +435|Butch Cassidy and the Sundance Kid (1969)|01-Jan-1969||http://us.imdb.com/M/title-exact?Butch%20Cassidy%20and%20the%20Sundance%20Kid%20(1969)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +436|American Werewolf in London, An (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?American%20Werewolf%20in%20London,%20An%20(1981)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +437|Amityville 1992: It's About Time (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Amityville%201992:%20It's%20About%20Time%20(1992)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +438|Amityville 3-D (1983)|01-Jan-1983||http://us.imdb.com/M/title-exact?Amityville%203-D%20(1983)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +439|Amityville: A New Generation (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Amityville:%20A%20New%20Generation%20(1993)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +440|Amityville II: The Possession (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Amityville%20II:%20The%20Possession%20(1982)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +441|Amityville Horror, The (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Amityville%20Horror,%20The%20(1979)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +442|Amityville Curse, The (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Amityville%20Curse,%20The%20(1990)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +443|Birds, The (1963)|01-Jan-1963||http://us.imdb.com/M/title-exact?Birds,%20The%20(1963)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +444|Blob, The (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Blob,%20The%20(1958)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +445|Body Snatcher, The (1945)|01-Jan-1945||http://us.imdb.com/M/title-exact?Body%20Snatcher,%20The%20(1945)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +446|Burnt Offerings (1976)|01-Jan-1976||http://us.imdb.com/M/title-exact?Burnt%20Offerings%20(1976)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +447|Carrie (1976)|01-Jan-1976||http://us.imdb.com/M/title-exact?Carrie%20(1976)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +448|Omen, The (1976)|01-Jan-1976||http://us.imdb.com/M/title-exact?Omen,%20The%20(1976)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +449|Star Trek: The Motion Picture (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Star%20Trek:%20The%20Motion%20Picture%20(1979)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +450|Star Trek V: The Final Frontier (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Star%20Trek%20V:%20The%20Final%20Frontier%20(1989)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +451|Grease (1978)|01-Jan-1978||http://us.imdb.com/M/title-exact?Grease%20(1978)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +452|Jaws 2 (1978)|01-Jan-1978||http://us.imdb.com/M/title-exact?Jaws%202%20(1978)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +453|Jaws 3-D (1983)|01-Jan-1983||http://us.imdb.com/M/title-exact?Jaws%203-D%20(1983)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +454|Bastard Out of Carolina (1996)|15-Dec-1996||http://us.imdb.com/M/title-exact?Bastard%20Out%20of%20Carolina%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +455|Jackie Chan's First Strike (1996)|10-Jan-1997||http://us.imdb.com/M/title-exact?Police%20Story%204:%20First%20Strike%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +456|Beverly Hills Ninja (1997)|17-Jan-1997||http://us.imdb.com/M/title-exact?Beverly%20Hills%20Ninja%20(1997)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +457|Free Willy 3: The Rescue (1997)|08-Aug-1997||http://us.imdb.com/M/title-exact?Free+Willy+3%3A+The+Rescue+(1997)|0|0|1|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +458|Nixon (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Nixon%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +459|Cry, the Beloved Country (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Cry,%20the%20Beloved%20Country%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +460|Crossing Guard, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Crossing%20Guard,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +461|Smoke (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Smoke%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +462|Like Water For Chocolate (Como agua para chocolate) (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Como%20agua%20para%20chocolate%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +463|Secret of Roan Inish, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Secret%20of%20Roan%20Inish,%20The%20(1994)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +464|Vanya on 42nd Street (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Vanya%20on%2042nd%20Street%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +465|Jungle Book, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Jungle%20Book,%20The%20(1994)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +466|Red Rock West (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Red%20Rock%20West%20(1992)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +467|Bronx Tale, A (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Bronx%20Tale,%20A%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +468|Rudy (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Rudy%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +469|Short Cuts (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Short%20Cuts%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +470|Tombstone (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Tombstone%20(1993)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +471|Courage Under Fire (1996)|08-Mar-1996||http://us.imdb.com/M/title-exact?Courage%20Under%20Fire%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +472|Dragonheart (1996)|31-May-1996||http://us.imdb.com/M/title-exact?Dragonheart%20(1996)|0|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +473|James and the Giant Peach (1996)|12-Apr-1996||http://us.imdb.com/M/title-exact?James%20and%20the%20Giant%20Peach%20(1996)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +474|Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb (1963)|01-Jan-1963||http://us.imdb.com/M/title-exact?Dr.%20Strangelove%20or:%20How%20I%20Learned%20to%20Stop%20Worrying%20and%20Love%20the%20Bomb%20(1963)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0 +475|Trainspotting (1996)|19-Jul-1996||http://us.imdb.com/Title?Trainspotting+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +476|First Wives Club, The (1996)|14-Sep-1996||http://us.imdb.com/M/title-exact?First%20Wives%20Club,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +477|Matilda (1996)|02-Aug-1996||http://us.imdb.com/M/title-exact?Matilda%20(1996)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +478|Philadelphia Story, The (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Philadelphia%20Story,%20The%20(1940)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +479|Vertigo (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Vertigo%20(1958)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +480|North by Northwest (1959)|01-Jan-1959||http://us.imdb.com/M/title-exact?North%20by%20Northwest%20(1959)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0 +481|Apartment, The (1960)|01-Jan-1960||http://us.imdb.com/M/title-exact?Apartment,%20The%20(1960)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +482|Some Like It Hot (1959)|01-Jan-1959||http://us.imdb.com/M/title-exact?Some%20Like%20It%20Hot%20(1959)|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +483|Casablanca (1942)|01-Jan-1942||http://us.imdb.com/M/title-exact?Casablanca%20(1942)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|0 +484|Maltese Falcon, The (1941)|01-Jan-1941||http://us.imdb.com/M/title-exact?Maltese%20Falcon,%20The%20(1941)|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0 +485|My Fair Lady (1964)|01-Jan-1964||http://us.imdb.com/M/title-exact?My%20Fair%20Lady%20(1964)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0 +486|Sabrina (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?Sabrina%20(1954)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +487|Roman Holiday (1953)|01-Jan-1953||http://us.imdb.com/M/title-exact?Roman%20Holiday%20(1953)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +488|Sunset Blvd. (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?Sunset%20Boulevard%20(1950)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0 +489|Notorious (1946)|01-Jan-1946||http://us.imdb.com/M/title-exact?Notorious%20(1946)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|1|0|0 +490|To Catch a Thief (1955)|01-Jan-1955||http://us.imdb.com/M/title-exact?To%20Catch%20a%20Thief%20(1955)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|1|0|0 +491|Adventures of Robin Hood, The (1938)|01-Jan-1938||http://us.imdb.com/M/title-exact?Adventures%20of%20Robin%20Hood,%20The%20(1938)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +492|East of Eden (1955)|01-Jan-1955||http://us.imdb.com/M/title-exact?East%20of%20Eden%20(1955)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +493|Thin Man, The (1934)|01-Jan-1934||http://us.imdb.com/M/title-exact?Thin%20Man,%20The%20(1934)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0 +494|His Girl Friday (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?His%20Girl%20Friday%20(1940)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +495|Around the World in 80 Days (1956)|01-Jan-1956||http://us.imdb.com/M/title-exact?Around%20the%20World%20in%2080%20Days%20(1956)|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +496|It's a Wonderful Life (1946)|01-Jan-1946||http://us.imdb.com/M/title-exact?It's%20a%20Wonderful%20Life%20(1946)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +497|Bringing Up Baby (1938)|01-Jan-1938||http://us.imdb.com/M/title-exact?Bringing%20Up%20Baby%20(1938)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +498|African Queen, The (1951)|01-Jan-1951||http://us.imdb.com/M/title-exact?African%20Queen,%20The%20(1951)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0 +499|Cat on a Hot Tin Roof (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Cat%20on%20a%20Hot%20Tin%20Roof%20(1958)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +500|Fly Away Home (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?Fly%20Away%20Home%20(1996)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +501|Dumbo (1941)|01-Jan-1941||http://us.imdb.com/M/title-exact?Dumbo%20(1941)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +502|Bananas (1971)|01-Jan-1971||http://us.imdb.com/M/title-exact?Bananas%20(1971)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +503|Candidate, The (1972)|01-Jan-1972||http://us.imdb.com/M/title-exact?Candidate,%20The%20(1972)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +504|Bonnie and Clyde (1967)|01-Jan-1967||http://us.imdb.com/M/title-exact?Bonnie%20and%20Clyde%20(1967)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +505|Dial M for Murder (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?Dial%20M%20for%20Murder%20(1954)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +506|Rebel Without a Cause (1955)|01-Jan-1955||http://us.imdb.com/M/title-exact?Rebel%20Without%20a%20Cause%20(1955)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +507|Streetcar Named Desire, A (1951)|01-Jan-1951||http://us.imdb.com/M/title-exact?Streetcar%20Named%20Desire,%20A%20(1951)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +508|People vs. Larry Flynt, The (1996)|27-Dec-1996||http://us.imdb.com/M/title-exact?People%20vs.%20Larry%20Flynt,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +509|My Left Foot (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?My%20Left%20Foot%20(1989)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +510|Magnificent Seven, The (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?Shichinin%20no%20samurai%20(1954)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1 +511|Lawrence of Arabia (1962)|01-Jan-1962||http://us.imdb.com/M/title-exact?Lawrence%20of%20Arabia%20(1962)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +512|Wings of Desire (1987)|01-Jan-1987||http://us.imdb.com/Title?Himmel+%FCber+Berlin,+Der+(1987)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +513|Third Man, The (1949)|01-Jan-1949||http://us.imdb.com/M/title-exact?Third%20Man,%20The%20(1949)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +514|Annie Hall (1977)|01-Jan-1977||http://us.imdb.com/M/title-exact?Annie%20Hall%20(1977)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +515|Boot, Das (1981)|04-Apr-1997||http://us.imdb.com/M/title-exact?Boot,%20Das%20(1981)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +516|Local Hero (1983)|01-Jan-1983||http://us.imdb.com/M/title-exact?Local%20Hero%20(1983)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +517|Manhattan (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Manhattan%20(1979)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +518|Miller's Crossing (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Miller's%20Crossing%20(1990)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +519|Treasure of the Sierra Madre, The (1948)|01-Jan-1948||http://us.imdb.com/M/title-exact?Treasure%20of%20the%20Sierra%20Madre,%20The%20(1948)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +520|Great Escape, The (1963)|01-Jan-1963||http://us.imdb.com/M/title-exact?Great%20Escape,%20The%20(1963)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +521|Deer Hunter, The (1978)|01-Jan-1978||http://us.imdb.com/M/title-exact?Deer%20Hunter,%20The%20(1978)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +522|Down by Law (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Down%20by%20Law%20(1986)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +523|Cool Hand Luke (1967)|01-Jan-1967||http://us.imdb.com/M/title-exact?Cool%20Hand%20Luke%20(1967)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +524|Great Dictator, The (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Great%20Dictator,%20The%20(1940)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +525|Big Sleep, The (1946)|01-Jan-1946||http://us.imdb.com/M/title-exact?Big%20Sleep,%20The%20(1946)|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0 +526|Ben-Hur (1959)|01-Jan-1959||http://us.imdb.com/M/title-exact?Ben-Hur%20(1959)|0|1|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +527|Gandhi (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Gandhi%20(1982)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +528|Killing Fields, The (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Killing%20Fields,%20The%20(1984)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +529|My Life as a Dog (Mitt liv som hund) (1985)|01-Jan-1985||http://us.imdb.com/M/title-exact?Mitt%20liv%20som%20hund%20(1985)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +530|Man Who Would Be King, The (1975)|01-Jan-1975||http://us.imdb.com/M/title-exact?Man%20Who%20Would%20Be%20King,%20The%20(1975)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +531|Shine (1996)|22-Nov-1996||http://us.imdb.com/M/title-exact?Shine%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +532|Kama Sutra: A Tale of Love (1996)|07-Mar-1997||http://us.imdb.com/M/title-exact?Kama%20Sutra%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +533|Daytrippers, The (1996)|21-Mar-1997||http://us.imdb.com/M/title-exact?Daytrippers%2C%20The%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0 +534|Traveller (1997)|18-Apr-1997||http://us.imdb.com/M/title-exact?Traveller%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +535|Addicted to Love (1997)|23-May-1997||http://us.imdb.com/M/title-exact?Addicted%20to%20Love%20%281997%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +536|Ponette (1996)|23-May-1997||http://us.imdb.com/M/title-exact?Ponette%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +537|My Own Private Idaho (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?My+Own+Private+Idaho+(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +538|Anastasia (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Anastasia+(1997)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +539|Mouse Hunt (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119715|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +540|Money Train (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Money%20Train%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +541|Mortal Kombat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mortal%20Kombat%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +542|Pocahontas (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Pocahontas%20(1995)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|1|0|0|0|0 +543|Misrables, Les (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mis%E9rables%2C%20Les%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +544|Things to Do in Denver when You're Dead (1995)|02-Feb-1996||http://us.imdb.com/M/title-exact?Things%20to%20Do%20in%20Denver%20when%20You're%20Dead%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|1|0|0|0|0 +545|Vampire in Brooklyn (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Vampire%20in%20Brooklyn%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +546|Broken Arrow (1996)|09-Feb-1996||http://us.imdb.com/M/title-exact?Broken%20Arrow%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +547|Young Poisoner's Handbook, The (1995)|23-Feb-1996||http://us.imdb.com/M/title-exact?Young%20Poisoner's%20Handbook,%20The%20(1995)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +548|NeverEnding Story III, The (1994)|02-Feb-1996||http://us.imdb.com/M/title-exact?NeverEnding%20Story%20III,%20The%20(1994)|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +549|Rob Roy (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Rob%20Roy%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|0 +550|Die Hard: With a Vengeance (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Die%20Hard:%20With%20a%20Vengeance%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +551|Lord of Illusions (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Lord%20of%20Illusions%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +552|Species (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Species%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +553|Walk in the Clouds, A (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Walk%20in%20the%20Clouds,%20A%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +554|Waterworld (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Waterworld%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +555|White Man's Burden (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?White%20Man's%20Burden%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +556|Wild Bill (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Wild%20Bill%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +557|Farinelli: il castrato (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Farinelli:%20il%20castrato%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +558|Heavenly Creatures (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Heavenly%20Creatures%20(1994)|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0 +559|Interview with the Vampire (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Interview%20with%20the%20Vampire%20(1994)|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0 +560|Kid in King Arthur's Court, A (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Kid%20in%20King%20Arthur's%20Court,%20A%20(1995)|0|0|1|0|1|1|0|0|0|1|0|0|0|0|1|1|0|0|0 +561|Mary Shelley's Frankenstein (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Mary%20Shelley's%20Frankenstein%20(1994)|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0 +562|Quick and the Dead, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Quick%20and%20the%20Dead,%20The%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +563|Stephen King's The Langoliers (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?%22Langoliers,%20The%22%20(1995)%20(mini)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +564|Tales from the Hood (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tales%20from%20the%20Hood%20(1995)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +565|Village of the Damned (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Village%20of%20the%20Damned%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +566|Clear and Present Danger (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Clear%20and%20Present%20Danger%20(1994)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +567|Wes Craven's New Nightmare (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Wes%20Craven's%20New%20Nightmare%20(1994)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +568|Speed (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Speed%20(1994/I)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +569|Wolf (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Wolf%20(1994)|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0 +570|Wyatt Earp (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Wyatt%20Earp%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +571|Another Stakeout (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Another%20Stakeout%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0 +572|Blown Away (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Blown%20Away%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +573|Body Snatchers (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Body%20Snatchers%20(1993)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|1|0|0 +574|Boxing Helena (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Boxing%20Helena%20(1993)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|0 +575|City Slickers II: The Legend of Curly's Gold (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?City%20Slickers%20II:%20The%20Legend%20of%20Curly's%20Gold%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +576|Cliffhanger (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Cliffhanger%20(1993)|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +577|Coneheads (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Coneheads%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +578|Demolition Man (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Demolition%20Man%20(1993)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +579|Fatal Instinct (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Fatal%20Instinct%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +580|Englishman Who Went Up a Hill, But Came Down a Mountain, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Englishman%20Who%20Went%20Up%20a%20Hill,%20But%20Came%20Down%20a%20Mountain,%20The%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +581|Kalifornia (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Kalifornia%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +582|Piano, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Piano,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +583|Romeo Is Bleeding (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Romeo%20Is%20Bleeding%20(1993)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +584|Secret Garden, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Secret%20Garden,%20The%20(1993)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +585|Son in Law (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Son%20in%20Law%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +586|Terminal Velocity (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Terminal%20Velocity%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +587|Hour of the Pig, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Hour%20of%20the%20Pig,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0 +588|Beauty and the Beast (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Beauty%20and%20the%20Beast%20(1991)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +589|Wild Bunch, The (1969)|01-Jan-1969||http://us.imdb.com/M/title-exact?Wild%20Bunch,%20The%20(1969)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +590|Hellraiser: Bloodline (1996)|08-Mar-1996||http://us.imdb.com/M/title-exact?Hellraiser:%20Bloodline%20(1996)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +591|Primal Fear (1996)|30-Mar-1996||http://us.imdb.com/M/title-exact?Primal%20Fear%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +592|True Crime (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?True%20Crime%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +593|Stalingrad (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Stalingrad%20(1993)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +594|Heavy (1995)|05-Jun-1996||http://us.imdb.com/M/title-exact?Heavy%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +595|Fan, The (1996)|16-Aug-1996||http://us.imdb.com/M/title-exact?Fan,%20The%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +596|Hunchback of Notre Dame, The (1996)|21-Jun-1996||http://us.imdb.com/M/title-exact?Hunchback%20of%20Notre%20Dame,%20The%20(1996)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +597|Eraser (1996)|21-Jun-1996||http://us.imdb.com/M/title-exact?Eraser%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +598|Big Squeeze, The (1996)|06-Sep-1996||http://us.imdb.com/M/title-exact?Big%20Squeeze,%20The%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +599|Police Story 4: Project S (Chao ji ji hua) (1993)|16-Aug-1996||http://us.imdb.com/M/title-exact?Project%20S%20(1993)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +600|Daniel Defoe's Robinson Crusoe (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Robinson%20Crusoe%20(1996)|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +601|For Whom the Bell Tolls (1943)|01-Jan-1943||http://us.imdb.com/M/title-exact?For%20Whom%20the%20Bell%20Tolls%20(1943)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +602|American in Paris, An (1951)|01-Jan-1951||http://us.imdb.com/M/title-exact?American%20in%20Paris,%20An%20(1951)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0 +603|Rear Window (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?Rear%20Window%20(1954)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +604|It Happened One Night (1934)|01-Jan-1934||http://us.imdb.com/M/title-exact?It%20Happened%20One%20Night%20(1934)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +605|Meet Me in St. Louis (1944)|01-Jan-1944||http://us.imdb.com/M/title-exact?Meet%20Me%20in%20St.%20Louis%20(1944)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +606|All About Eve (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?All%20About%20Eve%20(1950)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +607|Rebecca (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Rebecca%20(1940)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +608|Spellbound (1945)|01-Jan-1945||http://us.imdb.com/M/title-exact?Spellbound%20(1945)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|0 +609|Father of the Bride (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?Father%20of%20the%20Bride%20(1950)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +610|Gigi (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Gigi%20(1958)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +611|Laura (1944)|01-Jan-1944||http://us.imdb.com/M/title-exact?Laura%20(1944)|0|0|0|0|0|0|1|0|0|0|1|0|0|1|0|0|0|0|0 +612|Lost Horizon (1937)|01-Jan-1937||http://us.imdb.com/M/title-exact?Lost%20Horizon%20(1937)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +613|My Man Godfrey (1936)|01-Jan-1936||http://us.imdb.com/M/title-exact?My%20Man%20Godfrey%20(1936)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +614|Giant (1956)|01-Jan-1956||http://us.imdb.com/M/title-exact?Giant%20(1956)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +615|39 Steps, The (1935)|01-Jan-1935||http://us.imdb.com/M/title-exact?39%20Steps,%20The%20(1935)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +616|Night of the Living Dead (1968)|01-Jan-1968||http://us.imdb.com/M/title-exact?Night%20of%20the%20Living%20Dead%20(1968)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0 +617|Blue Angel, The (Blaue Engel, Der) (1930)|01-Jan-1930||http://us.imdb.com/M/title-exact?Blaue%20Engel,%20Der%20(1930)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +618|Picnic (1955)|01-Jan-1955||http://us.imdb.com/M/title-exact?Picnic%20(1955)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +619|Extreme Measures (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?Extreme%20Measures%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +620|Chamber, The (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Chamber,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +621|Davy Crockett, King of the Wild Frontier (1955)|01-Jan-1955||http://us.imdb.com/M/title-exact?Davy%20Crockett%2C%20King%20of%20the%20Wild%20Frontier%20%281955%29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +622|Swiss Family Robinson (1960)|01-Jan-1960||http://us.imdb.com/M/title-exact?Swiss%20Family%20Robinson%20(1960)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +623|Angels in the Outfield (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Angels%20in%20the%20Outfield%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +624|Three Caballeros, The (1945)|01-Jan-1945||http://us.imdb.com/M/title-exact?Three%20Caballeros,%20The%20(1945)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +625|Sword in the Stone, The (1963)|01-Jan-1963||http://us.imdb.com/M/title-exact?Sword%20in%20the%20Stone,%20The%20(1963)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +626|So Dear to My Heart (1949)|01-Jan-1949||http://us.imdb.com/Title?So+Dear+to+My+Heart+(1949)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +627|Robin Hood: Prince of Thieves (1991)|01-Jan-1991||http://us.imdb.com/Title?Robin+Hood%3A+Prince+of+Thieves+(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +628|Sleepers (1996)|18-Oct-1996||http://us.imdb.com/M/title-exact?Sleepers%20(1996)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +629|Victor/Victoria (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Victor/Victoria%20%281982%29|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +630|Great Race, The (1965)|01-Jan-1965||http://us.imdb.com/M/title-exact?Great%20Race,%20The%20(1965)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +631|Crying Game, The (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Crying%20Game,%20The%20(1992)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|0 +632|Sophie's Choice (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Sophie's%20Choice%20(1982)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +633|Christmas Carol, A (1938)|01-Jan-1938||http://us.imdb.com/M/title-exact?Christmas%20Carol,%20A%20(1938)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +634|Microcosmos: Le peuple de l'herbe (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Microcosmos%3A%20Le%20peuple%20de%20l%27herbe%20%281996%29|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +635|Fog, The (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Fog,%20The%20(1980)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +636|Escape from New York (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Escape%20from%20New%20York%20(1981)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +637|Howling, The (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Howling,%20The%20(1981)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +638|Return of Martin Guerre, The (Retour de Martin Guerre, Le) (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Retour%20de%20Martin%20Guerre,%20Le%20(1982)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +639|Tin Drum, The (Blechtrommel, Die) (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Blechtrommel,%20Die%20(1979)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +640|Cook the Thief His Wife & Her Lover, The (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Cook%20the%20Thief%20His%20Wife%20&%20Her%20Lover,%20The%20(1989)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +641|Paths of Glory (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Paths%20of%20Glory%20(1957)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +642|Grifters, The (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Grifters,%20The%20(1990)|0|0|0|0|0|0|1|0|1|0|1|0|0|0|0|0|0|0|0 +643|The Innocent (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Innocent,%20The%20(1994)%20(TV)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +644|Thin Blue Line, The (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Thin%20Blue%20Line,%20The%20(1988)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +645|Paris Is Burning (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Paris%20Is%20Burning%20(1990)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +646|Once Upon a Time in the West (1969)|01-Jan-1969||http://us.imdb.com/M/title-exact?C'era%20una%20volta%20il%20west%20(1969)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +647|Ran (1985)|01-Jan-1985||http://us.imdb.com/M/title-exact?Ran%20(1985)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +648|Quiet Man, The (1952)|01-Jan-1952||http://us.imdb.com/M/title-exact?Quiet%20Man,%20The%20(1952)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +649|Once Upon a Time in America (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Once%20Upon%20a%20Time%20in%20America%20(1984)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +650|Seventh Seal, The (Sjunde inseglet, Det) (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Sjunde%20inseglet,%20Det%20(1957)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +651|Glory (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Glory%20(1989)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +652|Rosencrantz and Guildenstern Are Dead (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Rosencrantz%20and%20Guildenstern%20Are%20Dead%20(1990)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +653|Touch of Evil (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Touch%20of%20Evil%20(1958)|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|1|0|0 +654|Chinatown (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Chinatown%20(1974)|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|1|0|0 +655|Stand by Me (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Stand%20by%20Me%20(1986)|0|0|1|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +656|M (1931)|01-Jan-1931||http://us.imdb.com/M/title-exact?M%20(1931)|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|1|0|0 +657|Manchurian Candidate, The (1962)|01-Jan-1962||http://us.imdb.com/M/title-exact?Manchurian%20Candidate,%20The%20(1962)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0 +658|Pump Up the Volume (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Pump%20Up%20the%20Volume%20(1990)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +659|Arsenic and Old Lace (1944)|01-Jan-1944||http://us.imdb.com/M/title-exact?Arsenic%20and%20Old%20Lace%20(1944)|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|1|0|0 +660|Fried Green Tomatoes (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Fried%20Green%20Tomatoes%20at%20the%20Whistle%20Stop%20Cafe%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +661|High Noon (1952)|01-Jan-1952||http://us.imdb.com/M/title-exact?High%20Noon%20(1952)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +662|Somewhere in Time (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Somewhere%20in%20Time%20(1980)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +663|Being There (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Being%20There%20(1979)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +664|Paris, Texas (1984)|01-Jan-1984||http://us.imdb.com/M/title-exact?Paris,%20Texas%20(1984)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +665|Alien 3 (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Alien%203%20(1992)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|1|1|0|0 +666|Blood For Dracula (Andy Warhol's Dracula) (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Andy%20Warhol's%20Dracula%20(1974)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +667|Audrey Rose (1977)|01-Jan-1977||http://us.imdb.com/M/title-exact?Audrey%20Rose%20(1977)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +668|Blood Beach (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Blood%20Beach%20(1981)|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +669|Body Parts (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Body%20Parts%20(1991)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +670|Body Snatchers (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Body%20Snatchers%20(1993)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|1|0|0 +671|Bride of Frankenstein (1935)|01-Jan-1935||http://us.imdb.com/M/title-exact?Bride%20of%20Frankenstein%20(1935)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +672|Candyman (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Candyman%20(1992)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +673|Cape Fear (1962)|01-Jan-1962||http://us.imdb.com/M/title-exact?Cape%20Fear%20(1962)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0 +674|Cat People (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Cat%20People%20(1982)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +675|Nosferatu (Nosferatu, eine Symphonie des Grauens) (1922)|01-Jan-1922||http://us.imdb.com/M/title-exact?Nosferatu,%20eine%20Symphonie%20des%20Grauens%20(1922)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +676|Crucible, The (1996)|27-Nov-1996||http://us.imdb.com/M/title-exact?Crucible,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +677|Fire on the Mountain (1996)|24-Jan-1997||http://us.imdb.com/M/title-exact?Fire%20on%20the%20Mountain%20(1996)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +678|Volcano (1997)|25-Apr-1997||http://us.imdb.com/M/title-exact?Volcano%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +679|Conan the Barbarian (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Conan+the+Barbarian+(1981)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +680|Kull the Conqueror (1997)|29-Aug-1997||http://us.imdb.com/M/title-exact?Kull+the+Conqueror+(1997)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +681|Wishmaster (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Wishmaster+(1997)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +682|I Know What You Did Last Summer (1997)|17-Oct-1997||http://us.imdb.com/M/title-exact?I+Know+What+You+Did+Last+Summer+(1997)|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|1|0|0 +683|Rocket Man (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Rocket+Man+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +684|In the Line of Fire (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?In%20the%20Line%20of%20Fire%20(1993)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +685|Executive Decision (1996)|09-Mar-1996||http://us.imdb.com/M/title-exact?Executive%20Decision%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +686|Perfect World, A (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Perfect%20World,%20A%20(1993)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +687|McHale's Navy (1997)|18-Apr-1997||http://us.imdb.com/M/title-exact?McHale's%20Navy%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +688|Leave It to Beaver (1997)|22-Aug-1997||http://us.imdb.com/M/title-exact?Leave+It+To+Beaver+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +689|Jackal, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Jackal%2C+The+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +690|Seven Years in Tibet (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Seven+Years+in+Tibet+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +691|Dark City (1998)|09-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-118929|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|1|0|0 +692|American President, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?American%20President,%20The%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +693|Casino (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Casino%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +694|Persuasion (1995)|25-Sep-1995||http://us.imdb.com/Title?Persuasion+(1995/I)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +695|Kicking and Screaming (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Kicking%20and%20Screaming%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +696|City Hall (1996)|16-Feb-1996||http://us.imdb.com/M/title-exact?City%20Hall%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +697|Basketball Diaries, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Basketball%20Diaries,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +698|Browning Version, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Browning%20Version,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +699|Little Women (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Little%20Women%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +700|Miami Rhapsody (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Miami%20Rhapsody%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +701|Wonderful, Horrible Life of Leni Riefenstahl, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Macht%20der%20Bilder:%20Leni%20Riefenstahl,%20Die%20(1993)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +702|Barcelona (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Barcelona%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +703|Widows' Peak (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Widows'%20Peak%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +704|House of the Spirits, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?House%20of%20the%20Spirits,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +705|Singin' in the Rain (1952)|01-Jan-1952||http://us.imdb.com/M/title-exact?Singin'%20in%20the%20Rain%20(1952)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0 +706|Bad Moon (1996)|01-Nov-1996||http://us.imdb.com/M/title-exact?Bad%20Moon%20(1996)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +707|Enchanted April (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Enchanted%20April%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +708|Sex, Lies, and Videotape (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?sex,%20lies,%20and%20videotape%20(1989)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +709|Strictly Ballroom (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Strictly%20Ballroom%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +710|Better Off Dead... (1985)|01-Jan-1985||http://us.imdb.com/Title?Better+Off+Dead...+(1985)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +711|Substance of Fire, The (1996)|06-Dec-1996||http://us.imdb.com/M/title-exact?Substance%20of%20Fire,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +712|Tin Men (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Tin%20Men%20(1987)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +713|Othello (1995)|18-Dec-1995||http://us.imdb.com/M/title-exact?Othello%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +714|Carrington (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Carrington%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +715|To Die For (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?To%20Die%20For%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +716|Home for the Holidays (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Home%20for%20the%20Holidays%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +717|Juror, The (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Juror,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +718|In the Bleak Midwinter (1995)|23-Feb-1996||http://us.imdb.com/M/title-exact?In%20the%20Bleak%20Midwinter%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +719|Canadian Bacon (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Canadian%20Bacon%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +720|First Knight (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?First%20Knight%20(1995)|0|1|1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +721|Mallrats (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mallrats%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +722|Nine Months (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Nine%20Months%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +723|Boys on the Side (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Boys%20on%20the%20Side%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +724|Circle of Friends (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Circle%20of%20Friends%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +725|Exit to Eden (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Exit%20to%20Eden%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +726|Fluke (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Fluke%20(1995)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +727|Immortal Beloved (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Immortal%20Beloved%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +728|Junior (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Junior%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +729|Nell (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Nell%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +730|Queen Margot (Reine Margot, La) (1994)|01-Jan-1996||http://us.imdb.com/Title?Reine+Margot,+La+(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +731|Corrina, Corrina (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Corrina,%20Corrina%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +732|Dave (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Dave%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +733|Go Fish (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Go%20Fish%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +734|Made in America (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Made%20in%20America%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +735|Philadelphia (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Philadelphia%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +736|Shadowlands (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Shadowlands%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +737|Sirens (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Sirens%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +738|Threesome (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Threesome%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +739|Pretty Woman (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Pretty%20Woman%20(1990)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +740|Jane Eyre (1996)|05-Apr-1996||http://us.imdb.com/M/title-exact?Jane%20Eyre%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +741|Last Supper, The (1995)|05-Apr-1996||http://us.imdb.com/M/title-exact?Last%20Supper,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +742|Ransom (1996)|08-Nov-1996||http://us.imdb.com/M/title-exact?Ransom%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +743|Crow: City of Angels, The (1996)|30-Aug-1996||http://us.imdb.com/M/title-exact?Crow%3A%20City%20of%20Angels%2C%20The%20%281996%29|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +744|Michael Collins (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Michael%20Collins%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +745|Ruling Class, The (1972)|01-Jan-1972||http://us.imdb.com/M/title-exact?Ruling%20Class,%20The%20(1972)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +746|Real Genius (1985)|01-Jan-1985||http://us.imdb.com/M/title-exact?Real%20Genius%20(1985)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +747|Benny & Joon (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Benny%20&%20Joon%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +748|Saint, The (1997)|14-Mar-1997||http://us.imdb.com/M/title-exact?Saint%2C%20The%20(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +749|MatchMaker, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Matchmaker%2C+The+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +750|Amistad (1997)|18-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-118607|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +751|Tomorrow Never Dies (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120347|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +752|Replacement Killers, The (1998)|06-Feb-1998||http://us.imdb.com/M/title-exact?Replacement+Killers%2C+The+(1998)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +753|Burnt By the Sun (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Utomlyonnye%20Solntsem%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +754|Red Corner (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Red+Corner+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +755|Jumanji (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Jumanji%20(1995)|0|1|1|0|1|0|0|0|0|1|0|0|0|0|0|1|0|0|0 +756|Father of the Bride Part II (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Father%20of%20the%20Bride%20Part%20II%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +757|Across the Sea of Time (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Across%20The%20Sea%20of%20Time%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +758|Lawnmower Man 2: Beyond Cyberspace (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Lawnmower%20Man%202:%20Beyond%20Cyberspace%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +759|Fair Game (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Fair%20Game%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +760|Screamers (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Screamers%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +761|Nick of Time (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Nick%20of%20Time%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +762|Beautiful Girls (1996)|09-Feb-1996||http://us.imdb.com/M/title-exact?Beautiful%20Girls%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +763|Happy Gilmore (1996)|16-Feb-1996||http://us.imdb.com/M/title-exact?Happy%20Gilmore%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +764|If Lucy Fell (1996)|08-Mar-1996||http://us.imdb.com/M/title-exact?If%20Lucy%20Fell%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +765|Boomerang (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Boomerang%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +766|Man of the Year (1995)|01-Mar-1996||http://us.imdb.com/M/title-exact?Man%20of%20the%20Year%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +767|Addiction, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Addiction,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +768|Casper (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Casper%20(1995)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +769|Congo (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Congo%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0 +770|Devil in a Blue Dress (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Devil%20in%20a%20Blue%20Dress%20(1995)|0|0|0|0|0|0|1|0|0|0|1|0|0|1|0|0|1|0|0 +771|Johnny Mnemonic (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Johnny%20Mnemonic%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +772|Kids (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Kids%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +773|Mute Witness (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Mute%20Witness%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +774|Prophecy, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Prophecy,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +775|Something to Talk About (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Something%20to%20Talk%20About%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +776|Three Wishes (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Three%20Wishes%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +777|Castle Freak (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Castle%20Freak%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +778|Don Juan DeMarco (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Don%20Juan%20DeMarco%20and%20the%20Centerfold%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +779|Drop Zone (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Drop%20Zone%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +780|Dumb & Dumber (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Dumb%20&%20Dumber%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +781|French Kiss (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?French%20Kiss%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +782|Little Odessa (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Little%20Odessa%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +783|Milk Money (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Milk%20Money%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +784|Beyond Bedlam (1993)|01-Jan-1993||http://us.imdb.com/Title?Beyond+Bedlam+(1993)|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0 +785|Only You (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Only%20You%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +786|Perez Family, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Perez%20Family,%20The%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +787|Roommates (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Roommates%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +788|Relative Fear (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Relative%20Fear%20(1994)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +789|Swimming with Sharks (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Swimming%20with%20Sharks%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +790|Tommy Boy (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tommy%20Boy%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +791|Baby-Sitters Club, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Baby-Sitters%20Club,%20The%20(1995)|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +792|Bullets Over Broadway (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Bullets%20Over%20Broadway%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +793|Crooklyn (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Crooklyn%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +794|It Could Happen to You (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?It%20Could%20Happen%20to%20You%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +795|Richie Rich (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Richie%20Rich%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +796|Speechless (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Speechless%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +797|Timecop (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Timecop%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +798|Bad Company (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Bad%20Company%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +799|Boys Life (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Boys%20Life%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +800|In the Mouth of Madness (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?In%20the%20Mouth%20of%20Madness%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +801|Air Up There, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Air%20Up%20There,%20The%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +802|Hard Target (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Hard%20Target%20(1993)|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +803|Heaven & Earth (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Heaven%20&%20Earth%20(1993)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +804|Jimmy Hollywood (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Jimmy%20Hollywood%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +805|Manhattan Murder Mystery (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Manhattan%20Murder%20Mystery%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0 +806|Menace II Society (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Menace%20II%20Society%20(1993)|0|1|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +807|Poetic Justice (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Poetic%20Justice%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +808|Program, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Program,%20The%20(1993)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +809|Rising Sun (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Rising%20Sun%20(1993)|0|1|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0 +810|Shadow, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Shadow,%20The%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +811|Thirty-Two Short Films About Glenn Gould (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Thirty-Two%20Short%20Films%20About%20Glenn%20Gould%20(1993)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +812|Andre (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Andre%20(1994)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +813|Celluloid Closet, The (1995)|15-Mar-1996||http://us.imdb.com/M/title-exact?Celluloid%20Closet,%20The%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +814|Great Day in Harlem, A (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Great%20Day%20in%20Harlem,%20A%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +815|One Fine Day (1996)|30-Nov-1996||http://us.imdb.com/M/title-exact?One%20Fine%20Day%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +816|Candyman: Farewell to the Flesh (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Candyman:%20Farewell%20to%20the%20Flesh%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +817|Frisk (1995)|29-Mar-1996||http://us.imdb.com/M/title-exact?Frisk%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +818|Girl 6 (1996)|22-Mar-1996||http://us.imdb.com/M/title-exact?Girl%206%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +819|Eddie (1996)|31-May-1996||http://us.imdb.com/M/title-exact?Eddie%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +820|Space Jam (1996)|15-Nov-1996||http://us.imdb.com/M/title-exact?Space%20Jam%20(1996)|0|0|1|1|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0 +821|Mrs. Winterbourne (1996)|19-Apr-1996||http://us.imdb.com/M/title-exact?Mrs.%20Winterbourne%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +822|Faces (1968)|01-Jan-1968||http://us.imdb.com/M/title-exact?Faces%20(1968)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +823|Mulholland Falls (1996)|26-Apr-1996||http://us.imdb.com/M/title-exact?Mulholland%20Falls%20(1996)|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|1|0|0 +824|Great White Hype, The (1996)|03-May-1996||http://us.imdb.com/M/title-exact?Great%20White%20Hype,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +825|Arrival, The (1996)|31-May-1996||http://us.imdb.com/M/title-exact?Arrival,%20The%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +826|Phantom, The (1996)|07-Jun-1996||http://us.imdb.com/M/title-exact?Phantom,%20The%20(1996)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +827|Daylight (1996)|06-Dec-1996||http://us.imdb.com/M/title-exact?Daylight%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +828|Alaska (1996)|21-Aug-1996||http://us.imdb.com/M/title-exact?Alaska%20(1996)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +829|Fled (1996)|19-Jul-1996||http://us.imdb.com/M/title-exact?Fled%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +830|Power 98 (1995)|17-May-1996||http://us.imdb.com/M/title-exact?Power%2098%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +831|Escape from L.A. (1996)|09-Aug-1996||http://us.imdb.com/M/title-exact?Escape%20from%20L.A.%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +832|Bogus (1996)|06-Sep-1996||http://us.imdb.com/M/title-exact?Bogus%20(1996)|0|0|0|0|1|0|0|0|1|1|0|0|0|0|0|0|0|0|0 +833|Bulletproof (1996)|06-Sep-1996||http://us.imdb.com/M/title-exact?Bulletproof%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +834|Halloween: The Curse of Michael Myers (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Halloween:%20The%20Curse%20of%20Michael%20Myers%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +835|Gay Divorcee, The (1934)|01-Jan-1934||http://us.imdb.com/M/title-exact?Gay%20Divorcee%2C%20The%20%281934%29|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +836|Ninotchka (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?Ninotchka%20(1939)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +837|Meet John Doe (1941)|01-Jan-1941||http://us.imdb.com/M/title-exact?Meet%20John%20Doe%20(1941)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +838|In the Line of Duty 2 (1987)|30-Aug-1996||http://us.imdb.com/M/title-exact?In%20the%20Line%20of%20Duty%202%20(1987)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +839|Loch Ness (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Loch%20Ness%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +840|Last Man Standing (1996)|20-Sep-1996||http://us.imdb.com/M/title-exact?Last%20Man%20Standing%20(1996/I)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1 +841|Glimmer Man, The (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?Glimmer%20Man,%20The%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +842|Pollyanna (1960)|01-Jan-1960||http://us.imdb.com/M/title-exact?Pollyanna%20(1960)|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +843|Shaggy Dog, The (1959)|01-Jan-1959||http://us.imdb.com/M/title-exact?Shaggy%20Dog,%20The%20(1959)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +844|Freeway (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Freeway%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +845|That Thing You Do! (1996)|28-Sep-1996||http://us.imdb.com/M/title-exact?That%20Thing%20You%20Do!%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +846|To Gillian on Her 37th Birthday (1996)|18-Oct-1996||http://us.imdb.com/M/title-exact?To%20Gillian%20on%20Her%2037th%20Birthday%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +847|Looking for Richard (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Looking%20for%20Richard%20(1996)|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0 +848|Murder, My Sweet (1944)|01-Jan-1944||http://us.imdb.com/M/title-exact?Murder,%20My%20Sweet%20(1944)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0 +849|Days of Thunder (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Days%20of%20Thunder%20(1990)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +850|Perfect Candidate, A (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?Perfect%20Candidate,%20A%20(1996)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +851|Two or Three Things I Know About Her (1966)|01-Jan-1966||http://us.imdb.com/M/title-exact?Deux%20ou%20trois%20choses%20que%20je%20sais%20d'elle%20(1966)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +852|Bloody Child, The (1996)|26-Oct-1996||http://us.imdb.com/M/title-exact?Bloody%20Child%2C%20The%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +853|Braindead (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Braindead%20(1992)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +854|Bad Taste (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Bad%20Taste%20(1987)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +855|Diva (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Diva%20(1981)|0|1|0|0|0|0|0|0|1|0|0|0|0|1|1|0|1|0|0 +856|Night on Earth (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Night%20on%20Earth%20(1991)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +857|Paris Was a Woman (1995)|08-Nov-1996||http://us.imdb.com/M/title-exact?Paris%20Was%20a%20Woman%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +858|Amityville: Dollhouse (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Amityville:%20Dollhouse%20(1996)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +859|April Fool's Day (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?April%20Fool's%20Day%20(1986)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +860|Believers, The (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Believers,%20The%20(1987)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +861|Nosferatu a Venezia (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Nosferatu%20a%20Venezia%20(1986)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +862|Jingle All the Way (1996)|22-Nov-1996||http://us.imdb.com/M/title-exact?Jingle%20All%20the%20Way%20(1996)|0|0|1|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +863|Garden of Finzi-Contini, The (Giardino dei Finzi-Contini, Il) (1970)|08-Nov-1996||http://us.imdb.com/M/title-exact?Giardino%20dei%20Finzi-Contini,%20Il%20(1970)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +864|My Fellow Americans (1996)|20-Dec-1996||http://us.imdb.com/M/title-exact?My%20Fellow%20Americans%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +865|Ice Storm, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Ice+Storm%2C+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +866|Michael (1996)|25-Dec-1996||http://us.imdb.com/M/title-exact?Michael%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +867|Whole Wide World, The (1996)|25-Dec-1996||http://us.imdb.com/M/title-exact?Whole%20Wide%20World,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +868|Hearts and Minds (1996)|10-Jan-1997||http://us.imdb.com/M/title-exact?Hearts%20and%20Minds%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +869|Fools Rush In (1997)|14-Feb-1997||http://us.imdb.com/M/title-exact?Fools%20Rush%20In%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +870|Touch (1997)|14-Feb-1997||http://us.imdb.com/M/title-exact?Touch%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +871|Vegas Vacation (1997)|14-Feb-1997||http://us.imdb.com/M/title-exact?Vegas%20Vacation%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +872|Love Jones (1997)|14-Mar-1997||http://us.imdb.com/M/title-exact?Love%20Jones%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +873|Picture Perfect (1997)|01-Aug-1997||http://us.imdb.com/M/title-exact?Picture+Perfect+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +874|Career Girls (1997)|08-Aug-1997||http://us.imdb.com/M/title-exact?Career+Girls+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +875|She's So Lovely (1997)|22-Aug-1997||http://us.imdb.com/M/title-exact?She%27s+So+Lovely+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +876|Money Talks (1997)|22-Aug-1997||http://us.imdb.com/M/title-exact?Money+Talks+(1997)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +877|Excess Baggage (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Excess+Baggage+(1997)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +878|That Darn Cat! (1997)|14-Feb-1997||http://us.imdb.com/M/title-exact?That%20Darn%20Cat%20(1997)|0|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0 +879|Peacemaker, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Peacemaker%2C+The+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0 +880|Soul Food (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Soul+Food+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +881|Money Talks (1997)|22-Aug-1997||http://us.imdb.com/M/title-exact?Money+Talks+(1997)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +882|Washington Square (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Washington+Square+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +883|Telling Lies in America (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Telling+Lies+in+America+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +884|Year of the Horse (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Year+of+the+Horse+(1997)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +885|Phantoms (1998)|01-Jan-1998||http://us.imdb.com/M/title-exact?Phantoms+(1998)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +886|Life Less Ordinary, A (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Life+Less+Ordinary,+A+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +887|Eve's Bayou (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Eve's+Bayou+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +888|One Night Stand (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?One+Night+Stand+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +889|Tango Lesson, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Tango+Lesson,+The+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +890|Mortal Kombat: Annihilation (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Mortal+Kombat%3A+Annihilation+(1997)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +891|Bent (1997)|18-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-118698|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +892|Flubber (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119137|0|0|0|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0 +893|For Richer or Poorer (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119142|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +894|Home Alone 3 (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119303|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +895|Scream 2 (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120082|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +896|Sweet Hereafter, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Sweet+Hereafter%2C+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +897|Time Tracers (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?imdb-title-128755|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +898|Postman, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119925|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +899|Winter Guest, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120521|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +900|Kundun (1997)|25-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-119485|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +901|Mr. Magoo (1997)|25-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-119718|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +902|Big Lebowski, The (1998)|26-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-118715|0|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0|1|0|0 +903|Afterglow (1997)|26-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-118566|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +904|Ma vie en rose (My Life in Pink) (1997)|26-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-119590|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +905|Great Expectations (1998)|01-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-119223|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +906|Oscar & Lucinda (1997)|31-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-119843|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +907|Vermin (1998)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120881|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +908|Half Baked (1998)|16-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120693|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +909|Dangerous Beauty (1998)|23-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-118892|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +910|Nil By Mouth (1997)|06-Feb-1998||http://us.imdb.com/Title?Nil+By+Mouth+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +911|Twilight (1998)|30-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-119594|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +912|U.S. Marshalls (1998)|10-Mar-1998||http://us.imdb.com/Title?U.S.+Marshals+(1998)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +913|Love and Death on Long Island (1997)|10-Mar-1998||http://us.imdb.com/Title?Love+and+Death+on+Long+Island+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +914|Wild Things (1998)|14-Mar-1998||http://us.imdb.com/Title?Wild+Things+(1998)|0|0|0|0|0|0|1|0|1|0|0|0|0|1|0|0|1|0|0 +915|Primary Colors (1998)|20-Mar-1998||http://us.imdb.com/Title?Primary+Colors+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +916|Lost in Space (1998)|27-Mar-1998||http://us.imdb.com/Title?Lost+in+Space+(1998)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +917|Mercury Rising (1998)|27-Mar-1998||http://us.imdb.com/Title?Mercury+Rising+(1998)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +918|City of Angels (1998)|03-Apr-1998||http://us.imdb.com/Title?City+of+Angels+(1998)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +919|City of Lost Children, The (1995)|01-Jan-1995||http://us.imdb.com/Title?Cit%E9+des+enfants+perdus,+La+(1995)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +920|Two Bits (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Two%20Bits%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +921|Farewell My Concubine (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Ba%20Wang%20Bie%20Ji%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +922|Dead Man (1995)|10-May-1996||http://us.imdb.com/M/title-exact?Dead%20Man%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +923|Raise the Red Lantern (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Da%20Hong%20Deng%20Long%20Gao%20Gao%20Gua%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +924|White Squall (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?White%20Squall%20(1996)|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +925|Unforgettable (1996)|23-Feb-1996||http://us.imdb.com/Title?Unforgettable+(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +926|Down Periscope (1996)|01-Mar-1996||http://us.imdb.com/M/title-exact?Down%20Periscope%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +927|Flower of My Secret, The (Flor de mi secreto, La) (1995)|08-Mar-1996||http://us.imdb.com/M/title-exact?Flor%20de%20mi%20secreto,%20La%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +928|Craft, The (1996)|26-Apr-1996||http://us.imdb.com/M/title-exact?Craft,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0 +929|Harriet the Spy (1996)|03-Jul-1996||http://us.imdb.com/M/title-exact?Harriet%20the%20Spy%20(1996)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +930|Chain Reaction (1996)|31-Jul-1996||http://us.imdb.com/M/title-exact?Chain%20Reaction%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +931|Island of Dr. Moreau, The (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Island%20of%20Dr.%20Moreau,%20The%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +932|First Kid (1996)|30-Aug-1996||http://us.imdb.com/M/title-exact?First%20Kid%20(1996)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +933|Funeral, The (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?Funeral,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +934|Preacher's Wife, The (1996)|13-Dec-1996||http://us.imdb.com/M/title-exact?Preacher's%20Wife,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +935|Paradise Road (1997)|18-Apr-1997||http://us.imdb.com/M/title-exact?Paradise%20Road%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +936|Brassed Off (1996)|13-Jun-1997||http://us.imdb.com/M/title-exact?Brassed%20Off%20%281996%29|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +937|Thousand Acres, A (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Thousand+Acres%2C+A+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +938|Smile Like Yours, A (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Smile+Like+Yours%2C+A+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +939|Murder in the First (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Murder%20in%20the%20First%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +940|Airheads (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Airheads%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +941|With Honors (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?With%20Honors%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +942|What's Love Got to Do with It (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?What's%20Love%20Got%20to%20Do%20with%20It%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +943|Killing Zoe (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Killing%20Zoe%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +944|Renaissance Man (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Renaissance%20Man%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|1|0 +945|Charade (1963)|01-Jan-1963||http://us.imdb.com/M/title-exact?Charade%20(1963)|0|0|0|0|0|1|0|0|0|0|0|0|0|1|1|0|1|0|0 +946|Fox and the Hound, The (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Fox%20and%20the%20Hound,%20The%20(1981)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +947|Big Blue, The (Grand bleu, Le) (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Grand%20bleu,%20Le%20(1988)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +948|Booty Call (1997)|28-Feb-1997||http://us.imdb.com/M/title-exact?Booty%20Call%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +949|How to Make an American Quilt (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?How%20to%20Make%20an%20American%20Quilt%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +950|Georgia (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Georgia%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +951|Indian in the Cupboard, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Indian%20in%20the%20Cupboard,%20The%20(1995)|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +952|Blue in the Face (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Blue%20in%20the%20Face%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +953|Unstrung Heroes (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Unstrung%20Heroes%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +954|Unzipped (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Unzipped%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +955|Before Sunrise (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Before%20Sunrise%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +956|Nobody's Fool (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Nobody's%20Fool%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +957|Pushing Hands (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Tui%20Shou%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +958|To Live (Huozhe) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Huozhe%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +959|Dazed and Confused (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Dazed%20and%20Confused%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +960|Naked (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Naked%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +961|Orlando (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Orlando%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +962|Ruby in Paradise (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Ruby%20in%20Paradise%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +963|Some Folks Call It a Sling Blade (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Some%20Folks%20Call%20It%20a%20Sling%20Blade%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +964|Month by the Lake, A (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Month%20by%20The%20Lake,%20A%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +965|Funny Face (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Funny%20Face%20(1957)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +966|Affair to Remember, An (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Affair%20to%20Remember,%20An%20(1957)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +967|Little Lord Fauntleroy (1936)|01-Jan-1936||http://us.imdb.com/M/title-exact?Little%20Lord%20Fauntleroy%20(1936)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +968|Inspector General, The (1949)|01-Jan-1949||http://us.imdb.com/M/title-exact?Inspector%20General,%20The%20(1949)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +969|Winnie the Pooh and the Blustery Day (1968)|01-Jan-1968||http://us.imdb.com/M/title-exact?Winnie%20the%20Pooh%20and%20the%20Blustery%20Day%20%281968%29|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +970|Hear My Song (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Hear%20My%20Song%20(1991)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +971|Mediterraneo (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Mediterraneo%20(1991)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +972|Passion Fish (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Passion%20Fish%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +973|Grateful Dead (1995)|18-Oct-1996||http://us.imdb.com/M/title-exact?Grateful%20Dead%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +974|Eye for an Eye (1996)|01-Jan-1996||http://us.imdb.com/Title?Eye+for+an+Eye+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +975|Fear (1996)|12-Apr-1996||http://us.imdb.com/M/title-exact?Fear%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +976|Solo (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Solo%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +977|Substitute, The (1996)|19-Apr-1996||http://us.imdb.com/M/title-exact?Substitute,%20The%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +978|Heaven's Prisoners (1996)|10-May-1996||http://us.imdb.com/M/title-exact?Heaven's%20Prisoners%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +979|Trigger Effect, The (1996)|30-Aug-1996||http://us.imdb.com/M/title-exact?Trigger%20Effect,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +980|Mother Night (1996)|01-Nov-1996||http://us.imdb.com/M/title-exact?Mother%20Night%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +981|Dangerous Ground (1997)|04-Sep-1996||http://us.imdb.com/M/title-exact?Dangerous%20Ground%20(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +982|Maximum Risk (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?Maximum%20Risk%20(1996)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +983|Rich Man's Wife, The (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?Rich%20Man's%20Wife,%20The%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +984|Shadow Conspiracy (1997)|31-Jan-1997||http://us.imdb.com/M/title-exact?Shadow%20Conspiracy%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +985|Blood & Wine (1997)|15-Nov-1996||http://us.imdb.com/Title?Blood+%26+Wine+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +986|Turbulence (1997)|10-Jan-1997||http://us.imdb.com/M/title-exact?Turbulence%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +987|Underworld (1997)|09-May-1997||http://us.imdb.com/M/title-exact?Underworld%20(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +988|Beautician and the Beast, The (1997)|07-Feb-1997||http://us.imdb.com/M/title-exact?Beautician%20and%20the%20Beast,%20The%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +989|Cats Don't Dance (1997)|26-Mar-1997||http://us.imdb.com/M/title-exact?Cats%20Don%27t%20Dance%20(1997)|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +990|Anna Karenina (1997)|04-Apr-1997||http://us.imdb.com/M/title-exact?Anna%20Karenina%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +991|Keys to Tulsa (1997)|11-Apr-1997||http://us.imdb.com/Title?Keys+to+Tulsa+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +992|Head Above Water (1996)|20-Jun-1997||http://us.imdb.com/M/title-exact?Head+Above+Water+(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0 +993|Hercules (1997)|27-Jun-1997||http://us.imdb.com/M/title-exact?Hercules+(1997)|0|0|1|1|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +994|Last Time I Committed Suicide, The (1997)|20-Jun-1997||http://us.imdb.com/M/title-exact?Last+Time+I+Committed+Suicide%2C+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +995|Kiss Me, Guido (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Kiss+Me%2C+Guido+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +996|Big Green, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Big%20Green,%20The%20(1995)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +997|Stuart Saves His Family (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Stuart%20Saves%20His%20Family%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +998|Cabin Boy (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Cabin%20Boy%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +999|Clean Slate (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Clean%20Slate%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1000|Lightning Jack (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Lightning%20Jack%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +1001|Stupids, The (1996)|30-Aug-1996||http://us.imdb.com/M/title-exact?Stupids,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1002|Pest, The (1997)|07-Feb-1997||http://us.imdb.com/M/title-exact?Pest,%20The%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1003|That Darn Cat! (1997)|14-Feb-1997||http://us.imdb.com/M/title-exact?That%20Darn%20Cat%20(1997)|0|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0 +1004|Geronimo: An American Legend (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Geronimo:%20An%20American%20Legend%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1 +1005|Double vie de Vronique, La (Double Life of Veronique, The) (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Podwojne%20zycie%20Weroniki%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1006|Until the End of the World (Bis ans Ende der Welt) (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Bis%20ans%20Ende%20der%20Welt%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0 +1007|Waiting for Guffman (1996)|31-Jan-1997||http://us.imdb.com/M/title-exact?Waiting%20for%20Guffman%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1008|I Shot Andy Warhol (1996)|01-May-1996||http://us.imdb.com/M/title-exact?I%20Shot%20Andy%20Warhol%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1009|Stealing Beauty (1996)|14-Jun-1996||http://us.imdb.com/M/title-exact?Stealing%20Beauty%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1010|Basquiat (1996)|16-Aug-1996||http://us.imdb.com/M/title-exact?Basquiat%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1011|2 Days in the Valley (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?2%20Days%20in%20the%20Valley%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1012|Private Parts (1997)|07-Mar-1997||http://us.imdb.com/M/title-exact?Private%20Parts%20(1997)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1013|Anaconda (1997)|11-Apr-1997||http://us.imdb.com/M/title-exact?Anaconda%20%281997%29|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1014|Romy and Michele's High School Reunion (1997)|25-Apr-1997||http://us.imdb.com/M/title-exact?Romy%20and%20Michele%27s%20High%20School%20Reunion%20%281997%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1015|Shiloh (1997)|23-May-1997||http://us.imdb.com/M/title-exact?Shiloh%20%281997%29|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1016|Con Air (1997)|06-Jun-1997||http://us.imdb.com/M/title-exact?Con%20Air%20%281997%29|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1017|Trees Lounge (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Trees%20Lounge%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1018|Tie Me Up! Tie Me Down! (1990)|01-Jan-1990||http://us.imdb.com/Title?%A1%C1tame%21+(1990)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1019|Die xue shuang xiong (Killer, The) (1989)|01-Jan-1989||http://us.imdb.com/M/title-exact?Die%20xue%20shuang%20xiong%20(1989)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1020|Gaslight (1944)|01-Jan-1944||http://us.imdb.com/M/title-exact?Gaslight%20(1944)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +1021|8 1/2 (1963)|01-Jan-1963||http://us.imdb.com/M/title-exact?8%201/2%20(1963)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1022|Fast, Cheap & Out of Control (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Fast,+Cheap+&+Out+of+Control+(1997)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1023|Fathers' Day (1997)|09-May-1997||http://us.imdb.com/M/title-exact?Fathers%27%20Day%20%281997%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1024|Mrs. Dalloway (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Mrs%2E+Dalloway+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1025|Fire Down Below (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Fire+Down+Below+(1997)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1026|Lay of the Land, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Lay+of+the+Land%2C+The+(1997)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1027|Shooter, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Shooter,%20The%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1028|Grumpier Old Men (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Grumpier%20Old%20Men%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1029|Jury Duty (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Jury%20Duty%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1030|Beverly Hillbillies, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Beverly%20Hillbillies,%20The%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1031|Lassie (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Lassie%20(1994)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1032|Little Big League (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Little%20Big%20League%20(1994)|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1033|Homeward Bound II: Lost in San Francisco (1996)|08-Mar-1996||http://us.imdb.com/M/title-exact?Homeward%20Bound%20II:%20Lost%20in%20San%20Francisco%20(1996)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1034|Quest, The (1996)|26-Apr-1996||http://us.imdb.com/M/title-exact?Quest,%20The%20(1996/I)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1035|Cool Runnings (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Cool%20Runnings%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1036|Drop Dead Fred (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Drop%20Dead%20Fred%20(1991)|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0 +1037|Grease 2 (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Grease%202%20(1982)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +1038|Switchback (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Switchback+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1039|Hamlet (1996)|24-Jan-1997||http://us.imdb.com/M/title-exact?Hamlet%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1040|Two if by Sea (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Two%20if%20by%20Sea%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1041|Forget Paris (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Forget%20Paris%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1042|Just Cause (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Just%20Cause%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +1043|Rent-a-Kid (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Rent-a-Kid%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1044|Paper, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Paper,%20The%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1045|Fearless (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Fearless%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1046|Malice (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Malice%20(1993)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1047|Multiplicity (1996)|12-Jul-1996||http://us.imdb.com/M/title-exact?Multiplicity%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1048|She's the One (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?She's%20the%20One%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1049|House Arrest (1996)|02-Aug-1996||http://us.imdb.com/Title?House+Arrest+(1996/I)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1050|Ghost and Mrs. Muir, The (1947)|01-Jan-1947||http://us.imdb.com/M/title-exact?Ghost%20and%20Mrs.%20Muir,%20The%20(1947)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1051|Associate, The (1996)|19-Oct-1996||http://us.imdb.com/M/title-exact?Associate,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1052|Dracula: Dead and Loving It (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dracula:%20Dead%20and%20Loving%20It%20(1995)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +1053|Now and Then (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Now%20and%20Then%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1054|Mr. Wrong (1996)|16-Feb-1996||http://us.imdb.com/M/title-exact?Mr.%20Wrong%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1055|Simple Twist of Fate, A (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Simple%20Twist%20of%20Fate,%20A%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1056|Cronos (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Cronos%20(1992)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +1057|Pallbearer, The (1996)|19-Apr-1996||http://us.imdb.com/M/title-exact?Pallbearer,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1058|War, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?War,%20The%20(1994)|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1059|Don't Be a Menace to South Central While Drinking Your Juice in the Hood (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Don't%20Be%20a%20Menace%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1060|Adventures of Pinocchio, The (1996)|26-Jul-1996||http://us.imdb.com/M/title-exact?Adventures%20of%20Pinocchio,%20The%20(1996)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1061|Evening Star, The (1996)|25-Dec-1996||http://us.imdb.com/M/title-exact?Evening%20Star,%20The%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1062|Four Days in September (1997)|23-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-119815|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1063|Little Princess, A (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Little%20Princess,%20A%20(1995)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1064|Crossfire (1947)|01-Jan-1947||http://us.imdb.com/M/title-exact?Crossfire%20(1947)|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0 +1065|Koyaanisqatsi (1983)|01-Jan-1983||http://us.imdb.com/M/title-exact?Koyaanisqatsi%20(1983)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0 +1066|Balto (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Balto%20(1995)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1067|Bottle Rocket (1996)|21-Feb-1996||http://us.imdb.com/M/title-exact?Bottle%20Rocket%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1068|Star Maker, The (Uomo delle stelle, L') (1995)|01-Mar-1996||http://us.imdb.com/M/title-exact?Uomo%20delle%20stelle,%20L'%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1069|Amateur (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Amateur%20(1994)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +1070|Living in Oblivion (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Living%20in%20Oblivion%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1071|Party Girl (1995)|01-Jan-1995||http://us.imdb.com/Title?Party+Girl+(1995/I)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1072|Pyromaniac's Love Story, A (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Pyromaniac's%20Love%20Story,%20A%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1073|Shallow Grave (1994)|01-Jan-1994||http://us.imdb.com/Title?Shallow+Grave+(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1074|Reality Bites (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Reality%20Bites%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1075|Man of No Importance, A (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Man%20of%20No%20Importance,%20A%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1076|Pagemaster, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Pagemaster,%20The%20(1994)|0|1|1|1|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +1077|Love and a .45 (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Love%20and%20a%20.45%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1078|Oliver & Company (1988)|29-Mar-1988||http://us.imdb.com/M/title-exact?Oliver%20&%20Company%20(1988)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1079|Joe's Apartment (1996)|26-Jul-1996||http://us.imdb.com/M/title-exact?Joe's%20Apartment%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +1080|Celestial Clockwork (1994)|12-Jul-1996||http://us.imdb.com/Title?Cort%E1zar+(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1081|Curdled (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?Curdled%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1082|Female Perversions (1996)|25-Apr-1997||http://us.imdb.com/M/title-exact?Female%20Perversions%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1083|Albino Alligator (1996)|17-Jan-1997||http://us.imdb.com/M/title-exact?Albino%20Alligator%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +1084|Anne Frank Remembered (1995)|23-Feb-1996||http://us.imdb.com/M/title-exact?Anne%20Frank%20Remembered%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1085|Carried Away (1996)|29-Mar-1996||http://us.imdb.com/M/title-exact?Carried%20Away%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1086|It's My Party (1995)|22-Mar-1996||http://us.imdb.com/M/title-exact?It's%20My%20Party%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1087|Bloodsport 2 (1995)|01-Mar-1996||http://us.imdb.com/M/title-exact?Bloodsport%202%20%281995%29|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1088|Double Team (1997)|04-Apr-1997||http://us.imdb.com/M/title-exact?Double%20Team%20%281997%29|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1089|Speed 2: Cruise Control (1997)|13-Jun-1997||http://us.imdb.com/M/title-exact?Speed%202%3A%20Cruise%20Control%20%281997%29|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +1090|Sliver (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Sliver%20(1993)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1091|Pete's Dragon (1977)|01-Jan-1977||http://us.imdb.com/M/title-exact?Pete's%20Dragon%20(1977)|0|0|1|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +1092|Dear God (1996)|01-Nov-1996||http://us.imdb.com/M/title-exact?Dear%20God%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1093|Live Nude Girls (1995)|01-Mar-1996||http://us.imdb.com/M/title-exact?Live%20Nude%20Girls%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1094|Thin Line Between Love and Hate, A (1996)|03-Apr-1996||http://us.imdb.com/M/title-exact?Thin%20Line%20Between%20Love%20and%20Hate,%20A%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1095|High School High (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?High%20School%20High%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1096|Commandments (1997)|02-May-1997||http://us.imdb.com/Title?Commandments+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1097|Hate (Haine, La) (1995)|09-Feb-1996||http://us.imdb.com/M/title-exact?Haine,%20La%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1098|Flirting With Disaster (1996)|22-Mar-1996||http://us.imdb.com/M/title-exact?Flirting%20With%20Disaster%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1099|Red Firecracker, Green Firecracker (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Pao%20Da%20Shuang%20Deng%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1100|What Happened Was... (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?What%20Happened%20Was...%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +1101|Six Degrees of Separation (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Six%20Degrees%20of%20Separation%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0 +1102|Two Much (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Two%20Much%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1103|Trust (1990)|01-Jan-1990||http://us.imdb.com/Title?Trust+(1990)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1104|C'est arriv prs de chez vous (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?C%27est%20arriv%E9%20pr%E8s%20de%20chez%20vous%20%281992%29|0|0|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0 +1105|Firestorm (1998)|09-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120670|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1106|Newton Boys, The (1998)|14-Mar-1998||http://us.imdb.com/Title?Newton+Boys,+The+(1998)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1107|Beyond Rangoon (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Beyond%20Rangoon%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1108|Feast of July (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Feast%20of%20July%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1109|Death and the Maiden (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Death%20and%20the%20Maiden%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1110|Tank Girl (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tank%20Girl%20(1995)|0|1|0|0|0|1|0|0|0|0|0|0|1|0|0|1|0|0|0 +1111|Double Happiness (1994)|01-Mar-1996||http://us.imdb.com/M/title-exact?Double%20Happiness%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1112|Cobb (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Cobb%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1113|Mrs. Parker and the Vicious Circle (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Mrs.%20Parker%20and%20the%20Vicious%20Circle%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1114|Faithful (1996)|03-Apr-1996||http://us.imdb.com/M/title-exact?Faithful%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1115|Twelfth Night (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?Twelfth%20Night:%20Or%20What%20You%20Will%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +1116|Mark of Zorro, The (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Mark%20of%20Zorro,%20The%20(1940)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1117|Surviving Picasso (1996)|20-Sep-1996||http://us.imdb.com/M/title-exact?Surviving%20Picasso%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1118|Up in Smoke (1978)|01-Jan-1978||http://us.imdb.com/M/title-exact?Up%20in%20Smoke%20(1978)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1119|Some Kind of Wonderful (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Some%20Kind%20of%20Wonderful%20(1987)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1120|I'm Not Rappaport (1996)|13-Nov-1996||http://us.imdb.com/M/title-exact?I'm%20Not%20Rappaport%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1121|Umbrellas of Cherbourg, The (Parapluies de Cherbourg, Les) (1964)|05-Apr-1996||http://us.imdb.com/M/title-exact?Parapluies%20de%20Cherbourg,%20Les%20(1964)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +1122|They Made Me a Criminal (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?They%20Made%20Me%20a%20Criminal%20(1939)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1123|Last Time I Saw Paris, The (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?Last%20Time%20I%20Saw%20Paris,%20The%20(1954)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1124|Farewell to Arms, A (1932)|01-Jan-1932||http://us.imdb.com/M/title-exact?Farewell%20to%20Arms,%20A%20(1932)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0 +1125|Innocents, The (1961)|01-Jan-1961||http://us.imdb.com/M/title-exact?Innocents,%20The%20(1961)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1126|Old Man and the Sea, The (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Old%20Man%20and%20the%20Sea,%20The%20(1958)|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1127|Truman Show, The (1998)|01-Jan-1998||http://us.imdb.com/Title?Truman+Show,+The+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1128|Heidi Fleiss: Hollywood Madam (1995) |09-Feb-1996||http://us.imdb.com/M/title-exact?Heidi%20Fleiss:%20Hollywood%20Madam%20(1995)%20(TV)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1129|Chungking Express (1994)|16-Feb-1996||http://us.imdb.com/M/title-exact?Chongqing%20Senlin%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|1|0|0|0|0 +1130|Jupiter's Wife (1994)|09-Feb-1996||http://us.imdb.com/M/title-exact?Jupiter's%20Wife%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1131|Safe (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Safe%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1132|Feeling Minnesota (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?Feeling%20Minnesota%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1133|Escape to Witch Mountain (1975)|01-Jan-1975||http://us.imdb.com/M/title-exact?Escape%20to%20Witch%20Mountain%20(1975)|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +1134|Get on the Bus (1996)|16-Oct-1996||http://us.imdb.com/M/title-exact?Get%20on%20the%20Bus%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1135|Doors, The (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Doors,%20The%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +1136|Ghosts of Mississippi (1996)|20-Dec-1996||http://us.imdb.com/M/title-exact?Ghosts%20of%20Mississippi%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1137|Beautiful Thing (1996)|09-Oct-1996||http://us.imdb.com/M/title-exact?Beautiful%20Thing%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1138|Best Men (1997)|01-Sep-1997||http://us.imdb.com/M/title-exact/Independence%20(1997)|0|1|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0 +1139|Hackers (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Hackers%20(1995)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +1140|Road to Wellville, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Road%20to%20Wellville,%20The%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1141|War Room, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?War%20Room,%20The%20(1993)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1142|When We Were Kings (1996)|14-Feb-1997||http://us.imdb.com/M/title-exact?When%20We%20Were%20Kings%20(1996)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1143|Hard Eight (1996)|28-Feb-1997||http://us.imdb.com/Title?Hard+Eight+(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +1144|Quiet Room, The (1996)|02-May-1997||http://us.imdb.com/M/title-exact?Quiet%20Room%2C%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1145|Blue Chips (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Blue%20Chips%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1146|Calendar Girl (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Calendar%20Girl%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1147|My Family (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?My%20Family%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1148|Tom & Viv (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Tom%20&%20Viv%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1149|Walkabout (1971)|20-Dec-1971||http://us.imdb.com/M/title-exact?Walkabout%20(1971)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1150|Last Dance (1996)|03-May-1996||http://us.imdb.com/M/title-exact?Last%20Dance%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1151|Original Gangstas (1996)|10-May-1996||http://us.imdb.com/M/title-exact?Original%20Gangstas%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1152|In Love and War (1996)|24-Jan-1997||http://us.imdb.com/M/title-exact?In%20Love%20and%20War%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0 +1153|Backbeat (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Backbeat%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +1154|Alphaville (1965)|01-Jan-1965||http://us.imdb.com/M/title-exact?Alphaville%20(1965)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1155|Rendezvous in Paris (Rendez-vous de Paris, Les) (1995)|28-Jun-1996||http://us.imdb.com/M/title-exact?Rendez-vous%20de%20Paris,%20Les%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1156|Cyclo (1995)|02-Aug-1996||http://us.imdb.com/M/title-exact?Cyclo%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1157|Relic, The (1997)|17-Jan-1997||http://us.imdb.com/M/title-exact?Relic,%20The%20(1997)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +1158|Fille seule, La (A Single Girl) (1995)|30-Oct-1996||http://us.imdb.com/M/title-exact?Fille%20seule,%20La%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1159|Stalker (1979)|01-Jan-1979||http://us.imdb.com/M/title-exact?Stalker%20(1979)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0 +1160|Love! Valour! Compassion! (1997)|16-May-1997||http://us.imdb.com/Title?Love%21+Valour%21+Compassion%21+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1161|Palookaville (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?Palookaville%20(1996)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1162|Phat Beach (1996)|02-Aug-1996||http://us.imdb.com/M/title-exact?Phat%20Beach%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1163|Portrait of a Lady, The (1996)|27-Dec-1996||http://us.imdb.com/M/title-exact?Portrait%20of%20a%20Lady%2C%20The%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1164|Zeus and Roxanne (1997)|10-Jan-1997||http://us.imdb.com/M/title-exact?Zeus%20and%20Roxanne%20(1997)|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1165|Big Bully (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Big%20Bully%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1166|Love & Human Remains (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Love%20&%20Human%20Remains%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1167|Sum of Us, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Sum%20of%20Us,%20The%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1168|Little Buddha (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Little%20Buddha%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1169|Fresh (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Fresh%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1170|Spanking the Monkey (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Spanking%20the%20Monkey%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1171|Wild Reeds (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Roseaux%20sauvages%2C%20Les%20%281994%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1172|Women, The (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?Women,%20The%20(1939)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1173|Bliss (1997)|06-Jun-1997||http://us.imdb.com/M/title-exact?Bliss%20(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1174|Caught (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?Caught%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1175|Hugo Pool (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Hugo+Pool+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1176|Welcome To Sarajevo (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Welcome+To+Sarajevo+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +1177|Dunston Checks In (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Dunston%20Checks%20In%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1178|Major Payne (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Major%20Payne%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1179|Man of the House (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Man%20of%20the%20House%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1180|I Love Trouble (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?I%20Love%20Trouble%20(1994)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1181|Low Down Dirty Shame, A (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Low%20Down%20Dirty%20Shame,%20A%20(1994)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1182|Cops and Robbersons (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Cops%20and%20Robbersons%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1183|Cowboy Way, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Cowboy%20Way,%20The%20(1994)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1184|Endless Summer 2, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Endless%20Summer%202,%20The%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1185|In the Army Now (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?In%20the%20Army%20Now%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0 +1186|Inkwell, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Inkwell,%20The%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1187|Switchblade Sisters (1975)|17-May-1975||http://us.imdb.com/M/title-exact?Switchblade%20Sisters%20(1975)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1188|Young Guns II (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Young%20Guns%20II%20(1990)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1 +1189|Prefontaine (1997)|24-Jan-1997||http://us.imdb.com/M/title-exact?Prefontaine%20(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1190|That Old Feeling (1997)|04-Apr-1997||http://us.imdb.com/M/title-exact?That%20Old%20Feeling%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1191|Letter From Death Row, A (1998)|01-Feb-1998||http://us.imdb.com/M/title-exact?Letter+From+Death+Row%2C+A+(1998)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1192|Boys of St. Vincent, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Boys%20of%20St.%20Vincent,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1193|Before the Rain (Pred dozhdot) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Pred%20dozhdot%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1194|Once Were Warriors (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Once%20Were%20Warriors%20(1994)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1195|Strawberry and Chocolate (Fresa y chocolate) (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Fresa%20y%20chocolate%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1196|Savage Nights (Nuits fauves, Les) (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Nuits%20fauves,%20Les%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1197|Family Thing, A (1996)|23-Mar-1996||http://us.imdb.com/M/title-exact?Family%20Thing,%20A%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1198|Purple Noon (1960)|28-Jun-1960||http://us.imdb.com/M/title-exact?Plein%20soleil%20(1960)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +1199|Cemetery Man (Dellamorte Dellamore) (1994)|12-Apr-1996||http://us.imdb.com/M/title-exact?Dellamorte%20Dellamore%20(1994)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +1200|Kim (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?Kim%20(1950)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1201|Marlene Dietrich: Shadow and Light (1996) |02-Apr-1996||http://us.imdb.com/M/title-exact?Marlene%20Dietrich:%20Shadow%20and%20Light%20(1996)%20(TV)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1202|Maybe, Maybe Not (Bewegte Mann, Der) (1994)|19-Jul-1996||http://us.imdb.com/M/title-exact?Bewegte%20Mann,%20Der%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1203|Top Hat (1935)|01-Jan-1935||http://us.imdb.com/M/title-exact?Top%20Hat%20(1935)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +1204|To Be or Not to Be (1942)|01-Jan-1942||http://us.imdb.com/M/title-exact?To%20Be%20or%20Not%20to%20Be%20(1942)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|1|0 +1205|Secret Agent, The (1996)|08-Nov-1996||http://us.imdb.com/M/title-exact?Secret%20Agent,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1206|Amos & Andrew (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Amos%20&%20Andrew%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1207|Jade (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Jade%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1208|Kiss of Death (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Kiss%20of%20Death%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +1209|Mixed Nuts (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Mixed%20Nuts%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1210|Virtuosity (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Virtuosity%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +1211|Blue Sky (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Blue%20Sky%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1212|Flesh and Bone (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Flesh%20and%20Bone%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|1|0|0|0|0 +1213|Guilty as Sin (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Guilty%20as%20Sin%20(1993)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 +1214|In the Realm of the Senses (Ai no corrida) (1976)|08-Mar-1976||http://us.imdb.com/M/title-exact?Ai%20no%20Corrida%20(1976)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1215|Barb Wire (1996)|03-May-1996||http://us.imdb.com/M/title-exact?Barb%20Wire%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1216|Kissed (1996)|18-Apr-1997||http://us.imdb.com/M/title-exact?Kissed%20%281996%29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1217|Assassins (1995)|01-Jan-1995||http://us.imdb.com/Title?Assassins+(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1218|Friday (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Friday%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1219|Goofy Movie, A (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Goofy%20Movie,%20A%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1220|Higher Learning (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Higher%20Learning%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1221|When a Man Loves a Woman (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?When%20a%20Man%20Loves%20a%20Woman%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1222|Judgment Night (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Judgment%20Night%20(1993)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1223|King of the Hill (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?King%20of%20the%20Hill%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1224|Scout, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Scout,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1225|Angus (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Angus%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1226|Night Falls on Manhattan (1997)|16-May-1997||http://us.imdb.com/M/title-exact?Night%20Falls%20on%20Manhattan%20(1997)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1227|Awfully Big Adventure, An (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Awfully%20Big%20Adventure,%20An%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1228|Under Siege 2: Dark Territory (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Under%20Siege%202:%20Dark%20Territory%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1229|Poison Ivy II (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Poison%20Ivy%20II%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1230|Ready to Wear (Pret-A-Porter) (1994)|01-Jan-1994||http://us.imdb.com/Title?Pr%EAt-%E0-Porter+(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1231|Marked for Death (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Marked%20for%20Death%20(1990)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1232|Madonna: Truth or Dare (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Madonna:%20Truth%20or%20Dare%20(1991)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1233|Nnette et Boni (1996)|01-Jan-1996||http://us.imdb.com/Title?N%E9nette+et+Boni+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1234|Chairman of the Board (1998)|01-Jan-1998||http://us.imdb.com/Title?Chairman+of+the+Board+(1998)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1235|Big Bang Theory, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?imdb-title-109266|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1236|Other Voices, Other Rooms (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119845|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1237|Twisted (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?imdb-title-117994|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1238|Full Speed (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?imdb-title-118230|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1239|Cutthroat Island (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Cutthroat%20Island%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1240|Ghost in the Shell (Kokaku kidotai) (1995)|12-Apr-1996||http://us.imdb.com/M/title-exact?Kokaku%20Kidotai%20(1995)|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1241|Van, The (1996)|27-Jun-1997||http://us.imdb.com/M/title-exact?Van%2C%20The%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1242|Old Lady Who Walked in the Sea, The (Vieille qui marchait dans la mer, La) (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?Vieille%20qui%20marchait%20dans%20la%20mer,%20La%20(1991)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1243|Night Flier (1997)|06-Feb-1998||http://us.imdb.com/M/title-exact?Night+Flier+(1997)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +1244|Metro (1997)|17-Jan-1997||http://us.imdb.com/M/title-exact?Metro%20(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1245|Gridlock'd (1997)|29-Jan-1997||http://us.imdb.com/M/title-exact?Gridlock'd%20(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1246|Bushwhacked (1995)|01-Jan-1995||http://us.imdb.com/Title?Bushwhacked+(1995/I)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1247|Bad Girls (1994)|01-Jan-1994||http://us.imdb.com/Title?Bad+Girls+(1994/I)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +1248|Blink (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Blink%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1249|For Love or Money (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?For%20Love%20or%20Money%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1250|Best of the Best 3: No Turning Back (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Best%20of%20the%20Best%203:%20No%20Turning%20Back%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1251|A Chef in Love (1996)|25-Apr-1997||http://us.imdb.com/M/title-exact?Mille%20et%20une%20recettes%20du%20cuisinier%20amoureux%2C%20Les%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1252|Contempt (Mpris, Le) (1963)|27-Jun-1997||http://us.imdb.com/M/title-exact?M%E9pris%2C+Le+(1963)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1253|Tie That Binds, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tie%20That%20Binds,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1254|Gone Fishin' (1997)|30-May-1997||http://us.imdb.com/M/title-exact?Gone%20Fishin'%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1255|Broken English (1996)|02-May-1997||http://us.imdb.com/M/title-exact?Broken%20English%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1256|Designated Mourner, The (1997)|23-May-1997||http://us.imdb.com/M/title-exact?Designated%20Mourner%2C%20The%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1257|Designated Mourner, The (1997)|23-May-1997||http://us.imdb.com/M/title-exact?Designated%20Mourner%2C%20The%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1258|Trial and Error (1997)|30-May-1997||http://us.imdb.com/M/title-exact?Trial%20and%20Error%20%281997%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1259|Pie in the Sky (1995)|09-Feb-1996||http://us.imdb.com/M/title-exact?Pie%20in%20the%20Sky%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1260|Total Eclipse (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Total%20Eclipse%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1261|Run of the Country, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Run%20of%20the%20Country,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1262|Walking and Talking (1996)|12-Jul-1996||http://us.imdb.com/M/title-exact?Walking%20and%20Talking%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1263|Foxfire (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Foxfire%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1264|Nothing to Lose (1994)|16-Aug-1996||http://us.imdb.com/M/title-exact?Nothing%20to%20Lose%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1265|Star Maps (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Star+Maps+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1266|Bread and Chocolate (Pane e cioccolata) (1973)|01-Jan-1973||http://us.imdb.com/M/title-exact?Pane%20e%20Cioccolata%20(1973)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1267|Clockers (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Clockers%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1268|Bitter Moon (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Lunes%20de%20fiel%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1269|Love in the Afternoon (1957)|01-Jan-1957||http://us.imdb.com/M/title-exact?Love%20in%20the%20Afternoon%20(1957)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1270|Life with Mikey (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Life%20with%20Mikey%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1271|North (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?North%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1272|Talking About Sex (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Talking%20About%20Sex%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1273|Color of Night (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Color%20of%20Night%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1274|Robocop 3 (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Robocop%203%20(1993)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +1275|Killer (Bulletproof Heart) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Killer%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1276|Sunset Park (1996)|26-Apr-1996||http://us.imdb.com/M/title-exact?Sunset%20Park%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1277|Set It Off (1996)|25-Sep-1996||http://us.imdb.com/M/title-exact?Set%20It%20Off%20(1996)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1278|Selena (1997)|21-Mar-1997||http://us.imdb.com/M/title-exact?Selena%20(1997)|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0 +1279|Wild America (1997)|04-Jul-1997||http://us.imdb.com/M/title-exact?Wild+America+(1997)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1280|Gang Related (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Gang+Related+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1281|Manny & Lo (1996)|26-Jul-1996||http://us.imdb.com/M/title-exact?Manny%20&%20Lo%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1282|Grass Harp, The (1995)|11-Oct-1996||http://us.imdb.com/M/title-exact?Grass%20Harp,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1283|Out to Sea (1997)|04-Jul-1997||http://us.imdb.com/M/title-exact?Out+to+Sea+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1284|Before and After (1996)|23-Feb-1996||http://us.imdb.com/M/title-exact?Before%20and%20After%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0 +1285|Princess Caraboo (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Princess%20Caraboo%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1286|Shall We Dance? (1937)|01-Jan-1937||http://us.imdb.com/M/title-exact?Shall%20We%20Dance?%20(1937)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +1287|Ed (1996)|08-Mar-1996||http://us.imdb.com/M/title-exact?Ed%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1288|Denise Calls Up (1995)|29-Mar-1996||http://us.imdb.com/M/title-exact?Denise%20Calls%20Up%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1289|Jack and Sarah (1995)|22-Mar-1996||http://us.imdb.com/M/title-exact?Jack%20and%20Sarah%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1290|Country Life (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Country%20Life%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1291|Celtic Pride (1996)|19-Apr-1996||http://us.imdb.com/M/title-exact?Celtic%20Pride%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1292|Simple Wish, A (1997)|11-Jul-1997||http://us.imdb.com/M/title-exact?Simple+Wish%2C+A+(1997)|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +1293|Star Kid (1997)|16-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120478|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|1|0|0|0 +1294|Ayn Rand: A Sense of Life (1997)|13-Feb-1998||http://us.imdb.com/Title?Ayn+Rand%3A+A+Sense+of+Life+(1997)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1295|Kicked in the Head (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Kicked+in+the+Head+(1997)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1296|Indian Summer (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Indian+Summer+(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1297|Love Affair (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Love%20Affair%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1298|Band Wagon, The (1953)|01-Jan-1953||http://us.imdb.com/M/title-exact?Band%20Wagon,%20The%20(1953)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0 +1299|Penny Serenade (1941)|01-Jan-1941||http://us.imdb.com/M/title-exact?Penny%20Serenade%20(1941)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1300|'Til There Was You (1997)|30-May-1997||http://us.imdb.com/Title?%27Til+There+Was+You+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1301|Stripes (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Stripes+(1981)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1302|Late Bloomers (1996)|06-Jun-1997||http://us.imdb.com/M/title-exact?Late%20Bloomers%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1303|Getaway, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Getaway,%20The%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1304|New York Cop (1996)|01-Jan-1996||http://us.imdb.com/Title?New+York+Cop+(1996)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1305|National Lampoon's Senior Trip (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?National%20Lampoon's%20Senior%20Trip%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1306|Delta of Venus (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Delta%20of%20Venus%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1307|Carmen Miranda: Bananas Is My Business (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Carmen%20Miranda:%20Bananas%20Is%20My%20Business%20(1994)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1308|Babyfever (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Babyfever%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1309|Very Natural Thing, A (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Very%20Natural%20Thing,%20A%20(1974)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1310|Walk in the Sun, A (1945)|01-Jan-1945||http://us.imdb.com/M/title-exact?Walk%20in%20the%20Sun,%20A%20(1945)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1311|Waiting to Exhale (1995)|15-Jan-1996||http://us.imdb.com/M/title-exact?Waiting%20to%20Exhale%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1312|Pompatus of Love, The (1996)|26-Jul-1996||http://us.imdb.com/M/title-exact?Pompatus%20of%20Love,%20The%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1313|Palmetto (1998)|20-Feb-1998||http://us.imdb.com/M/title-exact?Palmetto+(1998)|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|1|0|0 +1314|Surviving the Game (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Surviving%20the%20Game%20(1994)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1315|Inventing the Abbotts (1997)|04-Apr-1997||http://us.imdb.com/M/title-exact?Inventing%20the%20Abbotts%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1316|Horse Whisperer, The (1998)|25-Dec-1997||http://us.imdb.com/M/title-exact?imdb-title-119314|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1317|Journey of August King, The (1995)|22-Mar-1996||http://us.imdb.com/M/title-exact?Journey%20of%20August%20King,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1318|Catwalk (1995)|07-Jun-1996||http://us.imdb.com/Title?Catwalk+(1995/I)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1319|Neon Bible, The (1995)|01-Mar-1996||http://us.imdb.com/M/title-exact?Neon%20Bible,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1320|Homage (1995)|03-May-1996||http://us.imdb.com/M/title-exact?Homage%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1321|Open Season (1996)|10-May-1996||http://us.imdb.com/Title?Open+Season+(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1322|Metisse (Caf au Lait) (1993)|01-Jan-1993||http://us.imdb.com/Title?M%E9tisse+(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1323|Wooden Man's Bride, The (Wu Kui) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Wu%20Kui%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1324|Loaded (1994)|12-Apr-1996||http://us.imdb.com/M/title-exact?Loaded%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1325|August (1996)|12-Apr-1996||http://us.imdb.com/M/title-exact?August%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1326|Boys (1996)|10-May-1996||http://us.imdb.com/M/title-exact?Boys%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1327|Captives (1994)|16-Sep-1994||http://us.imdb.com/Title?Captives+(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1328|Of Love and Shadows (1994)|10-May-1996||http://us.imdb.com/M/title-exact?Of%20Love%20and%20Shadows%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1329|Low Life, The (1994)|10-May-1996||http://us.imdb.com/Title?Low+Life,+The+(1994/I)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1330|An Unforgettable Summer (1994)|01-Jan-1994||http://us.imdb.com/Title?Un+%E9t%E9+inoubliable+(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1331|Last Klezmer: Leopold Kozlowski, His Life and Music, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Last%20Klezmer%3A%20Leopold%20Kozlowski%2C%20His%20Life%20and%20Music%2C%20The%20%281995%29|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1332|My Life and Times With Antonin Artaud (En compagnie d'Antonin Artaud) (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?En%20compagnie%20d'Antonin%20Artaud%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1333|Midnight Dancers (Sibak) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Sibak%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1334|Somebody to Love (1994)|14-Jun-1996||http://us.imdb.com/Title?Somebody+to+Love+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1335|American Buffalo (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?American%20Buffalo%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1336|Kazaam (1996)|17-Jul-1996||http://us.imdb.com/M/title-exact?Kazaam%20(1996)|0|0|0|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0 +1337|Larger Than Life (1996)|01-Nov-1996||http://us.imdb.com/M/title-exact?Larger%20Than%20Life%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1338|Two Deaths (1995)|09-Aug-1996||http://us.imdb.com/Title?Two+Deaths+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1339|Stefano Quantestorie (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Stefano%20Quantestorie%20%281993%29|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1340|Crude Oasis, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Crude%20Oasis,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1341|Hedd Wyn (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Hedd%20Wyn%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1342|Convent, The (Convento, O) (1995)|14-Jun-1996||http://us.imdb.com/M/title-exact?Convento,%20O%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1343|Lotto Land (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Lotto%20Land%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1344|Story of Xinghua, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Story%20of%20Xinghua,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1345|Day the Sun Turned Cold, The (Tianguo niezi) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Tianguo%20Niezi%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1346|Dingo (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Dingo%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1347|Ballad of Narayama, The (Narayama Bushiko) (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Narayama%20Bushiko%20%281958%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1348|Every Other Weekend (1990)|01-Jan-1990||http://us.imdb.com/Title?Un+week-end+sur+deux+(1990)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1349|Mille bolle blu (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Mille%20bolle%20blu%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1350|Crows and Sparrows (1949)|01-Jan-1949||http://us.imdb.com/Title?Wuya+yu+maque+(1949)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1351|Lover's Knot (1996)|12-Jul-1996||http://us.imdb.com/M/title-exact?Lover's%20Knot%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1352|Shadow of Angels (Schatten der Engel) (1976)|01-Jan-1976||http://us.imdb.com/M/title-exact?Schatten%20der%20Engel%20(1976)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1353|1-900 (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?06%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1354|Venice/Venice (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Venice/Venice%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1355|Infinity (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?Infinity%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1356|Ed's Next Move (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?Ed%27s%20Next%20Move%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1357|For the Moment (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?For%20the%20Moment%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0 +1358|The Deadly Cure (1996)|16-Sep-1996|||0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1359|Boys in Venice (1996)|24-Sep-1996|||0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1360|Sexual Life of the Belgians, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Vie%20sexuelle%20des%20Belges,%20La%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1361|Search for One-eye Jimmy, The (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Search%20for%20One-eye%20Jimmy,%20The%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1362|American Strays (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?American%20Strays%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1363|Leopard Son, The (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?Leopard%20Son,%20The%20(1996)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1364|Bird of Prey (1996)|04-Oct-1996||http://us.imdb.com/M/title-exact?Bird%20of%20Prey%20(1996)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1365|Johnny 100 Pesos (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Johnny%20100%20Pesos%20(1993)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1366|JLG/JLG - autoportrait de dcembre (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?JLG/JLG%20-%20autoportrait%20de%20d%E9cembre%20%281994%29|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0 +1367|Faust (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Faust%20%281994%29|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1368|Mina Tannenbaum (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Mina%20Tannenbaum%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1369|Forbidden Christ, The (Cristo proibito, Il) (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?Cristo%20proibito%2C%20Il%20%281950%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1370|I Can't Sleep (J'ai pas sommeil) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?J'ai%20pas%20sommeil%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1371|Machine, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Machine,%20La%20(1994)|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0 +1372|Stranger, The (1994)|01-Jan-1994||http://us.imdb.com/Title?Stranger,+The+(1994/II)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1373|Good Morning (1971)|4-Feb-1971||http://us.imdb.com/M/title-exact?Good%20Morning%20(1971)|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1374|Falling in Love Again (1980)|01-Jan-1980||http://us.imdb.com/M/title-exact?Falling%20in%20Love%20Again%20(1980)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1375|Cement Garden, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Cement%20Garden,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1376|Meet Wally Sparks (1997)|31-Jan-1997||http://us.imdb.com/M/title-exact?Meet%20Wally%20Sparks%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1377|Hotel de Love (1996)|07-Feb-1997||http://us.imdb.com/M/title-exact?Hotel%20de%20Love%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1378|Rhyme & Reason (1997)|05-Mar-1997||http://us.imdb.com/M/title-exact?Rhyme%20%26%20Reason%20(1997)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1379|Love and Other Catastrophes (1996)|28-Mar-1997||http://us.imdb.com/M/title-exact?Love%20and%20Other%20Catastrophes%20%281996%29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1380|Hollow Reed (1996)|02-May-1997||http://us.imdb.com/Title?Hollow+Reed+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1381|Losing Chase (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Losing%20Chase%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1382|Bonheur, Le (1965)|16-May-1997||http://us.imdb.com/M/title-exact?Bonheur%2C%20Le%20%281965%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1383|Second Jungle Book: Mowgli & Baloo, The (1997)|16-May-1997||http://us.imdb.com/M/title-exact?Second%20Jungle%20Book%3A%20Mowgli%20%26%20Baloo%2C%20The%20%281997%29|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1384|Squeeze (1996)|13-Jun-1997||http://us.imdb.com/M/title-exact?Squeeze%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1385|Roseanna's Grave (For Roseanna) (1997)|20-Jun-1997||http://us.imdb.com/M/title-exact?Roseanna%27s+Grave+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1386|Tetsuo II: Body Hammer (1992)|20-Jun-1997||http://us.imdb.com/M/title-exact?Tetsuo+II%3A+Body+Hammer+(1992)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1387|Fall (1997)|27-Jun-1997||http://us.imdb.com/M/title-exact?Fall+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1388|Gabbeh (1996)|27-Jun-1997||http://us.imdb.com/M/title-exact?Gabbeh+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1389|Mondo (1996)|27-Jun-1997||http://us.imdb.com/M/title-exact?Mondo+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1390|Innocent Sleep, The (1995)|27-Jun-1997||http://us.imdb.com/M/title-exact?Innocent+Sleep%2C+The+(1995)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1391|For Ever Mozart (1996)|04-Jul-1997||http://us.imdb.com/M/title-exact?For+Ever+Mozart+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1392|Locusts, The (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Locusts%2C+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1393|Stag (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Stag+(1997)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1394|Swept from the Sea (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Swept+from+the+Sea+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1395|Hurricane Streets (1998)|01-Jan-1998||http://us.imdb.com/Title?Hurricane+Streets+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1396|Stonewall (1995)|26-Jul-1996||http://us.imdb.com/M/title-exact?Stonewall%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1397|Of Human Bondage (1934)|01-Jan-1934||http://us.imdb.com/M/title-exact?Of%20Human%20Bondage%20(1934)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1398|Anna (1996)|13-Nov-1996||http://us.imdb.com/M/title-exact?Anna%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1399|Stranger in the House (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-120222|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1400|Picture Bride (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Picture%20Bride%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1401|M. Butterfly (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?M.%20Butterfly%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1402|Ciao, Professore! (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Io%20speriamo%20che%20me%20la%20cavo%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1403|Caro Diario (Dear Diary) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Caro%20diario%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1404|Withnail and I (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Withnail%20and%20I%20(1987)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1405|Boy's Life 2 (1997)|07-Mar-1997||http://us.imdb.com/M/title-exact?Boy%27s%20Life%202%20(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1406|When Night Is Falling (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?When%20Night%20is%20Falling%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1407|Specialist, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Specialist,%20The%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1408|Gordy (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Gordy%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1409|Swan Princess, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Swan%20Princess,%20The%20(1994)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1410|Harlem (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Harlem%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1411|Barbarella (1968)|01-Jan-1968||http://us.imdb.com/M/title-exact?Barbarella%20(1968)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1412|Land Before Time III: The Time of the Great Giving (1995) (V)|01-Jan-1995||http://us.imdb.com/M/title-exact?Land%20Before%20Time%20III%3A%20The%20Time%20of%20the%20Great%20Giving%20%281995%29%20%28V%29|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1413|Street Fighter (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Street%20Fighter%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1414|Coldblooded (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Coldblooded%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1415|Next Karate Kid, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Next%20Karate%20Kid,%20The%20(1994)|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1416|No Escape (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?No%20Escape%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1417|Turning, The (1992)|02-May-1997||http://us.imdb.com/M/title-exact?Turning%2C%20The%20%281992%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1418|Joy Luck Club, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Joy+Luck+Club%2C+The+(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1419|Highlander III: The Sorcerer (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Highlander%20III:%20The%20Sorcerer%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0 +1420|Gilligan's Island: The Movie (1998)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119195|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1421|My Crazy Life (Mi vida loca) (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Mi%20vida%20loca%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1422|Suture (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Suture%20(1993)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0 +1423|Walking Dead, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Walking%20Dead,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +1424|I Like It Like That (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?I%20Like%20It%20Like%20That%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|0 +1425|I'll Do Anything (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?I'll%20Do%20Anything%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1426|Grace of My Heart (1996)|13-Sep-1996||http://us.imdb.com/M/title-exact?Grace%20of%20My%20Heart%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1427|Drunks (1995)|01-Nov-1996||http://us.imdb.com/M/title-exact?Drunks%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1428|SubUrbia (1997)|07-Feb-1997||http://us.imdb.com/M/title-exact?SubUrbia%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1429|Sliding Doors (1998)|01-Jan-1998||http://us.imdb.com/Title?Sliding+Doors+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1430|Ill Gotten Gains (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119352|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1431|Legal Deceit (1997)|01-Jan-1997||http://us.imdb.com/Title?Legal+Deceit+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1432|Mighty, The (1998)|09-Oct-1998||http://us.imdb.com/Title?Mighty,+The+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1433|Men of Means (1998)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119655|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1434|Shooting Fish (1997)|16-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1435|Steal Big, Steal Little (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Steal%20Big,%20Steal%20Little%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1436|Mr. Jones (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Mr.%20Jones%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1437|House Party 3 (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?House%20Party%203%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1438|Panther (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Panther%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1439|Jason's Lyric (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Jason's%20Lyric%20(1994)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1440|Above the Rim (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Above%20the%20Rim%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1441|Moonlight and Valentino (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Moonlight%20and%20Valentino%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1442|Scarlet Letter, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Scarlet%20Letter,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1443|8 Seconds (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?8%20Seconds%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1444|That Darn Cat! (1965)|01-Jan-1965||http://us.imdb.com/Title?That+Darn+Cat%21+(1965)|0|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0 +1445|Ladybird Ladybird (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Ladybird%20Ladybird%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1446|Bye Bye, Love (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Bye%20Bye,%20Love%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1447|Century (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Century%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1448|My Favorite Season (1993)|19-Apr-1996||http://us.imdb.com/Title?Ma+saison+pr%E9f%E9r%E9e+(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1449|Pather Panchali (1955)|22-Mar-1996||http://us.imdb.com/M/title-exact?Pather%20Panchali%20(1955)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1450|Golden Earrings (1947)|01-Jan-1947||http://us.imdb.com/M/title-exact?Golden%20Earrings%20%281947%29|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1451|Foreign Correspondent (1940)|01-Jan-1940||http://us.imdb.com/M/title-exact?Foreign%20Correspondent%20(1940)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1452|Lady of Burlesque (1943)|01-Jan-1943||http://us.imdb.com/M/title-exact?Lady%20of%20Burlesque%20(1943)|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0 +1453|Angel on My Shoulder (1946)|01-Jan-1946||http://us.imdb.com/M/title-exact?Angel%20on%20My%20Shoulder%20(1946)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1454|Angel and the Badman (1947)|01-Jan-1947||http://us.imdb.com/M/title-exact?Angel%20and%20the%20Badman%20(1947)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +1455|Outlaw, The (1943)|01-Jan-1943||http://us.imdb.com/M/title-exact?Outlaw,%20The%20(1943)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +1456|Beat the Devil (1954)|01-Jan-1954||http://us.imdb.com/M/title-exact?Beat%20the%20Devil%20(1954)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1457|Love Is All There Is (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Love%20Is%20All%20There%20Is%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1458|Damsel in Distress, A (1937)|01-Jan-1937||http://us.imdb.com/M/title-exact?Damsel%20in%20Distress,%20A%20(1937)|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0 +1459|Madame Butterfly (1995)|20-Sep-1996||http://us.imdb.com/M/title-exact?Madame%20Butterfly%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0 +1460|Sleepover (1995)|25-Oct-1996||http://us.imdb.com/M/title-exact?Sleepover%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1461|Here Comes Cookie (1935)|01-Jan-1935||http://us.imdb.com/M/title-exact?Here%20Comes%20Cookie%20(1935)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1462|Thieves (Voleurs, Les) (1996)|25-Dec-1996||http://us.imdb.com/M/title-exact?Voleurs,%20Les%20(1996)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|1|0|0|0|0 +1463|Boys, Les (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-118764|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1464|Stars Fell on Henrietta, The (1995)|01-Jan-1995||http://us.imdb.com/Title?Stars+Fell+on+Henrietta,+The+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1465|Last Summer in the Hamptons (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Last%20Summer%20in%20the%20Hamptons%20(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1466|Margaret's Museum (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Margaret's%20Museum%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1467|Saint of Fort Washington, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Saint%20of%20Fort%20Washington,%20The%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1468|Cure, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Cure,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1469|Tom and Huck (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tom%20and%20Huck%20(1995)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1470|Gumby: The Movie (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Gumby:%20The%20Movie%20(1995)|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1471|Hideaway (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Hideaway%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1472|Visitors, The (Visiteurs, Les) (1993)|19-Jul-1996||http://us.imdb.com/M/title-exact?Visiteurs,%20Les%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0 +1473|Little Princess, The (1939)|01-Jan-1939||http://us.imdb.com/M/title-exact?Little%20Princess,%20The%20(1939)|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1474|Nina Takes a Lover (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Nina%20Takes%20a%20Lover%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1475|Bhaji on the Beach (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Bhaji%20on%20the%20Beach%20(1993)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1476|Raw Deal (1948)|01-Jan-1948||http://us.imdb.com/M/title-exact?Raw%20Deal%20(1948)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0 +1477|Nightwatch (1997)|22-Apr-1997||http://us.imdb.com/M/title-exact?Nightwatch%20(1997)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +1478|Dead Presidents (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dead%20Presidents%20(1995)|0|1|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1479|Reckless (1995)|01-Jan-1995||http://us.imdb.com/Title?Reckless+(1995/I)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1480|Herbie Rides Again (1974)|01-Jan-1974||http://us.imdb.com/M/title-exact?Herbie%20Rides%20Again%20(1974)|0|0|1|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1481|S.F.W. (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?S.F.W.%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1482|Gate of Heavenly Peace, The (1995)|10-May-1996||http://us.imdb.com/M/title-exact?Gate%20of%20Heavenly%20Peace,%20The%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1483|Man in the Iron Mask, The (1998)|17-Mar-1998||http://us.imdb.com/Title?Man+in+the+Iron+Mask,+The+(1998/I)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1484|Jerky Boys, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Jerky%20Boys,%20The%20(1994)|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1485|Colonel Chabert, Le (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Colonel%20Chabert,%20Le%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|1|0 +1486|Girl in the Cadillac (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Girl%20in%20the%20Cadillac%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1487|Even Cowgirls Get the Blues (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Even%20Cowgirls%20Get%20the%20Blues%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1488|Germinal (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Germinal%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1489|Chasers (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Chasers%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1490|Fausto (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Fausto%20%281993%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1491|Tough and Deadly (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Tough%20and%20Deadly%20(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1492|Window to Paris (1994)|01-Jan-1994||http://us.imdb.com/Title?Okno+v+Parizh+(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1493|Modern Affair, A (1995)|06-Sep-1996||http://us.imdb.com/M/title-exact?Modern%20Affair,%20A%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1494|Mostro, Il (1994)|19-Apr-1996||http://us.imdb.com/M/title-exact?Mostro,%20Il%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1495|Flirt (1995)|07-Aug-1996||http://us.imdb.com/Title?Flirt+(1995/I)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1496|Carpool (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Carpool%20(1996)|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +1497|Line King: Al Hirschfeld, The (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Line%20King,%20The%20(1996)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1498|Farmer & Chase (1995)|10-Jan-1997||http://us.imdb.com/M/title-exact?Farmer%20&%20Chase%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1499|Grosse Fatigue (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Grosse%20fatigue%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1500|Santa with Muscles (1996)|08-Nov-1996||http://us.imdb.com/M/title-exact?Santa%20with%20Muscles%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1501|Prisoner of the Mountains (Kavkazsky Plennik) (1996)|31-Jan-1997||http://us.imdb.com/M/title-exact?Kavkazsky%20Plennik%20(1996)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +1502|Naked in New York (1994)|01-Jan-1994||http://us.imdb.com/Title?Naked+in+New+York+(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1503|Gold Diggers: The Secret of Bear Mountain (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Gold%20Diggers:%20The%20Secret%20of%20Bear%20Mountain%20(1995)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1504|Bewegte Mann, Der (1994)|12-Jul-1996||http://us.imdb.com/M/title-exact?Bewegte%20Mann%2C%20Der%20%281994%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1505|Killer: A Journal of Murder (1995)|06-Sep-1996||http://us.imdb.com/M/title-exact?Killer:%20A%20Journal%20of%20Murder%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1506|Nelly & Monsieur Arnaud (1995)|12-Apr-1996||http://us.imdb.com/M/title-exact?Nelly%20%26%20Monsieur%20Arnaud%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1507|Three Lives and Only One Death (1996)|11-Oct-1996||http://us.imdb.com/M/title-exact?Trois%20vies%20et%20une%20seule%20mort%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1508|Babysitter, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Babysitter,%20The%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1509|Getting Even with Dad (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Getting%20Even%20with%20Dad%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1510|Mad Dog Time (1996)|08-Nov-1996||http://us.imdb.com/M/title-exact?Mad%20Dog%20Time%20(1996)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1511|Children of the Revolution (1996)|01-May-1997||http://us.imdb.com/M/title-exact?Children%20of%20the%20Revolution%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1512|World of Apu, The (Apur Sansar) (1959)|05-Apr-1996||http://us.imdb.com/M/title-exact?Apur%20Sansar%20(1959)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1513|Sprung (1997)|14-May-1997||http://us.imdb.com/M/title-exact?Sprung%20%281997%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1514|Dream With the Fishes (1997)|20-Jun-1997||http://us.imdb.com/M/title-exact?Dream+With+the+Fishes+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1515|Wings of Courage (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Wings%20of%20Courage%20(1995)|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1516|Wedding Gift, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Wedding%20Gift,%20The%20(1994)%20(TV)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1517|Race the Sun (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?Race%20the%20Sun%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1518|Losing Isaiah (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Losing%20Isaiah%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1519|New Jersey Drive (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?New%20Jersey%20Drive%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1520|Fear, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Fear,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +1521|Mr. Wonderful (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Mr.%20Wonderful%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1522|Trial by Jury (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Trial%20by%20Jury%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1523|Good Man in Africa, A (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Good%20Man%20in%20Africa,%20A%20(1994)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1524|Kaspar Hauser (1993)|07-Jun-1996||http://us.imdb.com/Title?Kaspar+Hauser+(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1525|Object of My Affection, The (1998)|20-Mar-1998||http://us.imdb.com/Title?Object+of+My+Affection,+The+(1998)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1526|Witness (1985)|01-Jan-1985||http://us.imdb.com/M/title-exact?Witness+(1985)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|1|0|0 +1527|Senseless (1998)|09-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-120820|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1528|Nowhere (1997)|09-May-1997||http://us.imdb.com/M/title-exact?Nowhere%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1529|Underground (1995)|29-Mar-1996||http://us.imdb.com/M/title-exact?Underground%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +1530|Jefferson in Paris (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Jefferson%20in%20Paris%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1531|Far From Home: The Adventures of Yellow Dog (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Far%20From%20Home:%20The%20Adventures%20of%20Yellow%20Dog%20(1995)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1532|Foreign Student (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Foreign%20Student%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1533|I Don't Want to Talk About It (De eso no se habla) (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?De%20Eso%20No%20Se%20Habla%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1534|Twin Town (1997)|30-May-1997||http://us.imdb.com/M/title-exact?Twin%20Town%20%281997%29|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0 +1535|Enfer, L' (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Enfer,%20L'%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1536|Aiqing wansui (1994)|22-Jul-1996||http://us.imdb.com/M/title-exact?Aiqing%20Wansui%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1537|Cosi (1996)|11-Apr-1997||http://us.imdb.com/M/title-exact?Cosi%20(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1538|All Over Me (1997)|25-Apr-1997||http://us.imdb.com/M/title-exact?All%20Over%20Me%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1539|Being Human (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Being%20Human%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1540|Amazing Panda Adventure, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Amazing%20Panda%20Adventure,%20The%20(1995)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1541|Beans of Egypt, Maine, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Beans%20of%20Egypt,%20Maine,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1542|Scarlet Letter, The (1926)|01-Jan-1926||http://us.imdb.com/M/title-exact?Scarlet%20Letter,%20The%20(1926)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1543|Johns (1996)|18-Oct-1996||http://us.imdb.com/M/title-exact?Johns%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1544|It Takes Two (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?It%20Takes%20Two%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1545|Frankie Starlight (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Frankie%20Starlight%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1546|Shadows (Cienie) (1988)|01-Jan-1988||http://us.imdb.com/M/title-exact?Cienie%20(1988)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1547|Show, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Show,%20The%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1548|The Courtyard (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Courtyard,%20The%20(1995)%20(TV)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1549|Dream Man (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dream%20Man%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1550|Destiny Turns on the Radio (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Destiny%20Turns%20on%20the%20Radio%20(1995)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1551|Glass Shield, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Glass%20Shield,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1552|Hunted, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Hunted,%20The%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1553|Underneath, The (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Underneath,%20The%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0 +1554|Safe Passage (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Safe%20Passage%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1555|Secret Adventures of Tom Thumb, The (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Secret%20Adventures%20of%20Tom%20Thumb,%20The%20(1993)|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0 +1556|Condition Red (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Condition%20Red%20(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1557|Yankee Zulu (1994)|16-Feb-1996||http://us.imdb.com/M/title-exact?Yankee%20Zulu%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1558|Aparajito (1956)|29-Mar-1996||http://us.imdb.com/M/title-exact?Aparajito%20(1956)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1559|Hostile Intentions (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Hostile%20Intentions%20(1994)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1560|Clean Slate (Coup de Torchon) (1981)|01-Jan-1981||http://us.imdb.com/M/title-exact?Coup%20de%20torchon%20(1981)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1561|Tigrero: A Film That Was Never Made (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Tigrero:%20A%20Film%20That%20Was%20Never%20Made%20(1994)|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0 +1562|Eye of Vichy, The (Oeil de Vichy, L') (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Oeil%20de%20Vichy,%20L'%20(1993)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1563|Promise, The (Versprechen, Das) (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Versprechen,%20Das%20(1994)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1564|To Cross the Rubicon (1991)|01-Jan-1991||http://us.imdb.com/M/title-exact?To%20Cross%20the%20Rubicon%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1565|Daens (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Daens%20(1992)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1566|Man from Down Under, The (1943)|01-Jan-1943||http://us.imdb.com/Title?Man+from+Down+Under,+The+(1943)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1567|Careful (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Careful%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1568|Vermont Is For Lovers (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Vermont%20Is%20For%20Lovers%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1569|Vie est belle, La (Life is Rosey) (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Vie%20est%20belle,%20La%20(1987)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1570|Quartier Mozart (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Quartier%20Mozart%20(1992)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1571|Touki Bouki (Journey of the Hyena) (1973)|01-Jan-1973||http://us.imdb.com/M/title-exact?Touki%20Bouki%20(1973)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1572|Wend Kuuni (God's Gift) (1982)|01-Jan-1982||http://us.imdb.com/M/title-exact?Wend%20Kuuni%20(1982)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1573|Spirits of the Dead (Tre passi nel delirio) (1968)|01-Jan-1968||http://us.imdb.com/M/title-exact?Tre%20passi%20nel%20delirio%20(1968)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0 +1574|Pharaoh's Army (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Pharaoh's%20Army%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +1575|I, Worst of All (Yo, la peor de todas) (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?Yo,%20la%20Peor%20de%20Todas%20(1990)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1576|Hungarian Fairy Tale, A (1987)|01-Jan-1987||http://us.imdb.com/M/title-exact?Hol%20volt,%20hol%20nem%20volt%20(1987)|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +1577|Death in the Garden (Mort en ce jardin, La) (1956)|01-Jan-1956||http://us.imdb.com/Title?Mort+en+ce+jardin,+La+(1956)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1578|Collectionneuse, La (1967)|01-Jan-1967||http://us.imdb.com/M/title-exact?Collectionneuse,%20La%20(1967)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1579|Baton Rouge (1988)|01-Jan-1988||http://us.imdb.com/Title?B%E2ton+rouge+(1988)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1580|Liebelei (1933)|01-Jan-1933||http://us.imdb.com/M/title-exact?Liebelei%20(1933)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1581|Woman in Question, The (1950)|01-Jan-1950||http://us.imdb.com/M/title-exact?Woman%20in%20Question,%20The%20(1950)|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0 +1582|T-Men (1947)|01-Jan-1947||http://us.imdb.com/M/title-exact?T-Men%20(1947)|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0 +1583|Invitation, The (Zaproszenie) (1986)|01-Jan-1986||http://us.imdb.com/M/title-exact?Zaproszenie%20(1986)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1584|Symphonie pastorale, La (1946)|01-Jan-1946||http://us.imdb.com/M/title-exact?Symphonie%20pastorale,%20La%20(1946)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1585|American Dream (1990)|01-Jan-1990||http://us.imdb.com/M/title-exact?American%20Dream%20(1990)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1586|Lashou shentan (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Lashou%20Shentan%20(1992)|0|1|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1587|Terror in a Texas Town (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Terror%20in%20a%20Texas%20Town%20(1958)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 +1588|Salut cousin! (1996)|21-Feb-1997||http://us.imdb.com/M/title-exact?Salut%20cousin!%20(1996)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1589|Schizopolis (1996)|23-May-1997||http://us.imdb.com/Title?Schizopolis+(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1590|To Have, or Not (1995)|06-Jun-1997||http://us.imdb.com/M/title-exact?En%20avoir%20%28ou%20pas%29%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1591|Duoluo tianshi (1995)|21-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-112913|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1592|Magic Hour, The (1998)|30-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-119594|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1593|Death in Brunswick (1991)|16-Aug-1996||http://us.imdb.com/M/title-exact?Death%20in%20Brunswick%20(1991)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1594|Everest (1998)|10-Mar-1998||http://us.imdb.com/Title?Everest+(1998)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1595|Shopping (1994)|09-Feb-1996||http://us.imdb.com/M/title-exact?Shopping%20(1994)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1596|Nemesis 2: Nebula (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Nemesis%202:%20Nebula%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0 +1597|Romper Stomper (1992)|01-Jan-1992||http://us.imdb.com/M/title-exact?Romper%20Stomper%20(1992)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1598|City of Industry (1997)|14-Mar-1997||http://us.imdb.com/M/title-exact?City%20of%20Industry%20(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0 +1599|Someone Else's America (1995)|10-May-1996||http://us.imdb.com/M/title-exact?Someone%20Else's%20America%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1600|Guantanamera (1994)|16-May-1997||http://us.imdb.com/M/title-exact?Guantanamera%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1601|Office Killer (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?imdb-title-119819|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1602|Price Above Rubies, A (1998)|20-Mar-1998||http://us.imdb.com/Title?Price+Above+Rubies,+A+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1603|Angela (1995)|16-Feb-1996||http://us.imdb.com/M/title-exact?Angela%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1604|He Walked by Night (1948)|01-Jan-1948||http://us.imdb.com/M/title-exact?He%20Walked%20by%20Night%20(1948)|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|1|0|0 +1605|Love Serenade (1996)|11-Jul-1997||http://us.imdb.com/M/title-exact?Love+Serenade+(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1606|Deceiver (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Liar+(1997)|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1607|Hurricane Streets (1998)|01-Jan-1998||http://us.imdb.com/Title?Hurricane+Streets+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1608|Buddy (1997)|06-Jun-1997||http://us.imdb.com/M/title-exact?Buddy%20%281997%29|0|0|1|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1609|B*A*P*S (1997)|28-Mar-1997||http://us.imdb.com/M/title-exact?B%2EA%2EP%2ES%2E%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1610|Truth or Consequences, N.M. (1997)|02-May-1997||http://us.imdb.com/Title?Truth+or+Consequences,+N.M.+(1997)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0 +1611|Intimate Relations (1996)|09-May-1997||http://us.imdb.com/M/title-exact?Intimate%20Relations%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1612|Leading Man, The (1996)|16-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-116845|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1613|Tokyo Fist (1995)|11-Feb-1998||http://us.imdb.com/M/title-exact?Tokyo+Fist+(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1614|Reluctant Debutante, The (1958)|01-Jan-1958||http://us.imdb.com/M/title-exact?Reluctant%20Debutante,%20The%20(1958)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1615|Warriors of Virtue (1997)|02-May-1997||http://us.imdb.com/M/title-exact?Warriors%20of%20Virtue%20%281997%29|0|1|1|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0 +1616|Desert Winds (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Desert%20Winds%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1617|Hugo Pool (1997)|01-Jan-1997||http://us.imdb.com/M/title-exact?Hugo+Pool+(1997)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1618|King of New York (1990)|01-Jan-1990||http://us.imdb.com/Title?King+of+New+York+(1990)|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0 +1619|All Things Fair (1996)|08-Mar-1996||http://us.imdb.com/Title?Lust+och+f%E4gring+stor+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1620|Sixth Man, The (1997)|28-Mar-1997||http://us.imdb.com/M/title-exact?Sixth%20Man%2C%20The%20(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1621|Butterfly Kiss (1995)|26-Apr-1996||http://us.imdb.com/M/title-exact?Butterfly%20Kiss%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1622|Paris, France (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Paris,%20France%20(1993)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1623|Crmonie, La (1995)|20-Dec-1996||http://us.imdb.com/M/title-exact?C%E9r%E9monie%2C%20La%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1624|Hush (1998)|10-Mar-1998||http://us.imdb.com/Title?Hush+(1998)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1625|Nightwatch (1997)|22-Apr-1997||http://us.imdb.com/M/title-exact?Nightwatch%20(1997)|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0 +1626|Nobody Loves Me (Keiner liebt mich) (1994)|09-Feb-1996||http://us.imdb.com/M/title-exact?Keiner%20liebt%20mich%20(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1627|Wife, The (1995)|26-Jul-1996||http://us.imdb.com/Title?Wife,+The+(1995)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1628|Lamerica (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Lamerica%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1629|Nico Icon (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Nico%20Icon%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1630|Silence of the Palace, The (Saimt el Qusur) (1994)|02-Feb-1996||http://us.imdb.com/M/title-exact?Saimt%20el%20Qusur%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1631|Slingshot, The (1993)|01-Jan-1993||http://us.imdb.com/Title?K%E5disbellan+(1993)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1632|Land and Freedom (Tierra y libertad) (1995)|29-Mar-1996||http://us.imdb.com/M/title-exact?Tierra%20y%20libertad%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0 +1633| kldum klaka (Cold Fever) (1994)|08-Mar-1996||http://us.imdb.com/Title?%C1+k%F6ldum+klaka+(1994)|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 +1634|Etz Hadomim Tafus (Under the Domin Tree) (1994)|19-Apr-1996||http://us.imdb.com/M/title-exact?Etz%20Hadomim%20Tafus%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1635|Two Friends (1986) |26-Apr-1986||http://us.imdb.com/M/title-exact?Two%20Friends%20(1986)%20(TV)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1636|Brothers in Trouble (1995)|26-Apr-1996||http://us.imdb.com/M/title-exact?Brothers%20in%20Trouble%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1637|Girls Town (1996)|23-Aug-1996||http://us.imdb.com/M/title-exact?Girls%20Town%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1638|Normal Life (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?Normal%20Life%20(1996)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0 +1639|Bitter Sugar (Azucar Amargo) (1996)|22-Nov-1996||http://us.imdb.com/M/title-exact?Bitter%20Sugar%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1640|Eighth Day, The (1996)|01-Nov-1996||http://us.imdb.com/Title?Huiti%E8me+jour,+Le+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1641|Dadetown (1995)|18-Sep-1996||http://us.imdb.com/M/title-exact?Dadetown%20(1995)|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0 +1642|Some Mother's Son (1996)|27-Dec-1996||http://us.imdb.com/M/title-exact?Some%20Mother's%20Son%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1643|Angel Baby (1995)|10-Jan-1997||http://us.imdb.com/Title?Angel+Baby+(1995/I)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1644|Sudden Manhattan (1996)|13-Jun-1997||http://us.imdb.com/M/title-exact?Sudden%20Manhattan%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1645|Butcher Boy, The (1998)|01-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-118804|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1646|Men With Guns (1997)|06-Mar-1998||http://us.imdb.com/Title?Men+with+Guns+(1997/I)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1647|Hana-bi (1997)|20-Mar-1998||http://us.imdb.com/Title?Hana-bi+(1997)|0|0|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0 +1648|Niagara, Niagara (1997)|20-Mar-1998||http://us.imdb.com/Title?Niagara,+Niagara+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1649|Big One, The (1997)|27-Mar-1998||http://us.imdb.com/Title?Big+One,+The+(1997)|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0 +1650|Butcher Boy, The (1998)|01-Jan-1998||http://us.imdb.com/M/title-exact?imdb-title-118804|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1651|Spanish Prisoner, The (1997)|27-Mar-1998||http://us.imdb.com/Title?Spanish+Prisoner,+The+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0 +1652|Temptress Moon (Feng Yue) (1996)|13-Jun-1997||http://us.imdb.com/M/title-exact?Feng%20Yue%20%281996%29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0 +1653|Entertaining Angels: The Dorothy Day Story (1996)|27-Sep-1996||http://us.imdb.com/M/title-exact?Entertaining%20Angels:%20The%20Dorothy%20Day%20Story%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1654|Chairman of the Board (1998)|01-Jan-1998||http://us.imdb.com/Title?Chairman+of+the+Board+(1998)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1655|Favor, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?Favor,%20The%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1656|Little City (1998)|20-Feb-1998||http://us.imdb.com/M/title-exact?Little+City+(1998)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0 +1657|Target (1995)|28-Feb-1996||http://us.imdb.com/M/title-exact?Target%20(1995)|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1658|Substance of Fire, The (1996)|06-Dec-1996||http://us.imdb.com/M/title-exact?Substance%20of%20Fire,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1659|Getting Away With Murder (1996)|12-Apr-1996||http://us.imdb.com/Title?Getting+Away+With+Murder+(1996)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1660|Small Faces (1995)|09-Aug-1996||http://us.imdb.com/M/title-exact?Small%20Faces%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1661|New Age, The (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?New%20Age,%20The%20(1994)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1662|Rough Magic (1995)|30-May-1997||http://us.imdb.com/M/title-exact?Rough%20Magic%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1663|Nothing Personal (1995)|30-Apr-1997||http://us.imdb.com/M/title-exact?Nothing%20Personal%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0 +1664|8 Heads in a Duffel Bag (1997)|18-Apr-1997||http://us.imdb.com/Title?8+Heads+in+a+Duffel+Bag+(1997)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1665|Brother's Kiss, A (1997)|25-Apr-1997||http://us.imdb.com/M/title-exact?Brother%27s%20Kiss%2C%20A%20%281997%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1666|Ripe (1996)|02-May-1997||http://us.imdb.com/M/title-exact?Ripe%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1667|Next Step, The (1995)|13-Jun-1997||http://us.imdb.com/M/title-exact?Next%20Step%2C%20The%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1668|Wedding Bell Blues (1996)|13-Jun-1997||http://us.imdb.com/M/title-exact?Wedding%20Bell%20Blues%20%281996%29|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1669|MURDER and murder (1996)|20-Jun-1997||http://us.imdb.com/M/title-exact?MURDER+and+murder+(1996)|0|0|0|0|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0 +1670|Tainted (1998)|01-Feb-1998||http://us.imdb.com/M/title-exact?Tainted+(1998)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0 +1671|Further Gesture, A (1996)|20-Feb-1998||http://us.imdb.com/M/title-exact?Further+Gesture%2C+A+(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1672|Kika (1993)|01-Jan-1993||http://us.imdb.com/M/title-exact?Kika%20(1993)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1673|Mirage (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mirage%20(1995)|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 +1674|Mamma Roma (1962)|01-Jan-1962||http://us.imdb.com/M/title-exact?Mamma%20Roma%20(1962)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1675|Sunchaser, The (1996)|25-Oct-1996||http://us.imdb.com/M/title-exact?Sunchaser,%20The%20(1996)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1676|War at Home, The (1996)|01-Jan-1996||http://us.imdb.com/M/title-exact?War%20at%20Home%2C%20The%20%281996%29|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1677|Sweet Nothing (1995)|20-Sep-1996||http://us.imdb.com/M/title-exact?Sweet%20Nothing%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1678|Mat' i syn (1997)|06-Feb-1998||http://us.imdb.com/M/title-exact?Mat%27+i+syn+(1997)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 +1679|B. Monkey (1998)|06-Feb-1998||http://us.imdb.com/M/title-exact?B%2E+Monkey+(1998)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0 +1680|Sliding Doors (1998)|01-Jan-1998||http://us.imdb.com/Title?Sliding+Doors+(1998)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0 +1681|You So Crazy (1994)|01-Jan-1994||http://us.imdb.com/M/title-exact?You%20So%20Crazy%20(1994)|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0 +1682|Scream of Stone (Schrei aus Stein) (1991)|08-Mar-1996||http://us.imdb.com/M/title-exact?Schrei%20aus%20Stein%20(1991)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 diff --git a/data/ref/steam/Test_data.df b/data/ref/steam/Test_data.df new file mode 100644 index 0000000000000000000000000000000000000000..d0b08bf9c8aa38f62bb51f4894b04f1a99b2fc4e --- /dev/null +++ b/data/ref/steam/Test_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2766b9faf90e3531a35207c01fbef2f655af97c21a6ba7d18581bbef2bc6ad59 +size 59142 diff --git a/data/ref/steam/id2name.txt b/data/ref/steam/id2name.txt new file mode 100644 index 0000000000000000000000000000000000000000..4e244f9a5e10bb46eac3895a802f973b37508572 --- /dev/null +++ b/data/ref/steam/id2name.txt @@ -0,0 +1,3581 @@ +0::Ironbound +1::Real Pool 3D - Poolians +2::Half-Life +3::The Ship: Murder Party +4::DEFCON +5::The Ship: Single Player +6::Garry's Mod +7::Gumboy - Crazy Adventures™ +8::Vegas: Make It Big™ +9::Civilization IV®: Warlords +10::X-COM: Terror From the Deep +11::Tomb Raider: Anniversary +12::Final DOOM +13::Master Levels for Doom II +14::DOOM II +15::Wolfenstein 3D +16::QUAKE Mission Pack 1: Scourge of Armagon +17::QUAKE Mission Pack 2: Dissolution of Eternity +18::Genesis Rising +19::Warhammer® 40,000: Dawn of War® - Dark Crusade +20::Command & Conquer: Red Alert 3 +21::Prison Tycoon 3™: Lockdown +22::18 Wheels of Steel: American Long Haul +23::Tycoon City: New York +24::Death to Spies +25::Unreal 2: The Awakening +26::Silent Hunter® III +27::Luxor 3 +28::Sprint Cars Road to Knoxville +29::Ride! Carnival Tycoon +30::Eternity's Child +31::X-COM: Enforcer +32::X-COM: Apocalypse +33::S.T.A.L.K.E.R.: Clear Sky +34::The Witcher: Enhanced Edition Director's Cut +35::Multiwinia +36::Sid Meier's Civilization IV: Colonization +37::Brothers in Arms: Hell's Highway™ +38::Xpand Rally Xtreme +39::Heroes of Might & Magic V: Hammers of Fate +40::Brothers in Arms: Earned in Blood™ +41::The Settlers®: Rise Of An Empire Gold Edition +42::Bully: Scholarship Edition +43::Saints Row 2 +44::Rise of the Argonauts +45::Knights of Honor +46::Unreal Tournament 3 Black +47::The Graveyard +48::Burnout Paradise: The Ultimate Box +49::The Maw +50::Puzzle Kingdoms +51::X-Blades +52::Zeno Clash +53::King's Bounty: The Legend +54::Death Track®: Resurrection +55::Freedom Force +56::Darkest Hour: Europe '44-'45 +57::Prototype™ +58::The Elder Scrolls III: Morrowind® Game of the Year Edition +59::Armored Fist 3 +60::BRAINPIPE: A Plunge to Unhumanity +61::Hunting Unlimited 2010 +62::Tales of Monkey Island Complete Pack +63::Armed and Dangerous® +64::The Secret of Monkey Island: Special Edition +65::TimeShift™ +66::Bionic Commando +67::Osmos +68::Fallout 2: A Post Nuclear Role Playing Game +69::Crash Time 2 +70::World of Zoo +71::Windosill +72::Machinarium +73::Need for Speed: Shift +74::Command & Conquer: Red Alert 3 - Uprising +75::Painkiller: Resurrection +76::SpellForce 2 - Anniversary Edition +77::Rush for Berlin Gold +78::Hammerfight +79::SpellForce - Platinum Edition +80::Secret Files 2: Puritas Cordis +81::Dragon Age: Origins +82::Aztaka +83::LEGO® Star Wars™ - The Complete Saga +84::Command & Conquer 3: Kane's Wrath +85::Wings of Prey +86::Fallout 3: Game of the Year Edition +87::Roogoo +88::Pirates, Vikings, and Knights II +89::Super Laser Racer +90::Mount & Blade: Warband +91::M.U.D. TV +92::The Misadventures of P.B. Winterbottom +93::Iron Grip: Warlord +94::Flight of the Icarus +95::Ziro +96::SEGA Mega Drive and Genesis Classics +97::Alpha Protocol™ +98::Kane & Lynch 2: Dog Days +99::Puzzle Quest 2 +100::Burn Zombie Burn! +101::Victoria I Complete +102::Arma 2: British Armed Forces +103::Chime +104::Swarm Arena +105::Serious Sam Classic: The Second Encounter +106::X: Tension +107::Governor of Poker 2 - Premium Edition +108::Grotesque Tactics: Evil Heroes +109::Doc Clock: The Toasted Sandwich of Time +110::Puzzle Bots +111::Nimbus +112::Flight Control HD +113::Pound of Ground +114::Pat & Mat +115::Alternativa +116::Call of Duty®: Black Ops +117::Arcadia +118::Oddworld: Stranger's Wrath HD +119::Grand Theft Auto III +120::A.R.E.S.: Extinction Agenda +121::Dead Space™ 2 +122::The Sims™ 3 +123::YOU DON’T KNOW JACK® +124::DUNGEONS - Steam Special Edition +125::BIT.TRIP RUNNER +126::Dinner Date +127::Majesty 2 Collection +128::A.V.A. Alliance of Valiant Arms™ +129::Spiral Knights +130::Solar 2 +131::F.E.A.R. 3 +132::Dungeons and Dragons: Daggerdale +133::Nancy Drew®: Secrets Can Kill REMASTERED +134::Nancy Drew®: The Captive Curse +135::EDGE +136::Puzzle Pirates +137::Warhammer 40,000: Space Marine +138::Men of War: Vietnam +139::Wasteland Angel +140::Nancy Drew®: Shadow at the Water's Edge +141::Bunch of Heroes +142::The Binding of Isaac +143::Off-Road Drive +144::Dead Rising 2: Off the Record +145::Memoir '44 Online +146::Serious Sam: The Random Encounter +147::Puzzler World 2 +148::Airline Tycoon 2 +149::The Haunted: Hells Reach +150::DC Universe™ Online +151::Saints Row: The Third Initiation Station +152::Fractal: Make Blooms Not War +153::Galactic Civilizations® II: Ultimate Edition +154::Earth Defense Force: Insect Armageddon +155::X3: Albion Prelude +156::Trine 2: Complete Story +157::Oil Rush +158::King Arthur II: The Role-Playing Wargame +159::Fortune Summoners +160::Star Trek Online +161::Jagged Alliance - Back in Action +162::Titan Attacks! +163::Alan Wake +164::Realm of the Mad God +165::Painkiller: Recurring Evil +166::Stacking +167::Wizorb +168::Myst V +169::Yesterday +170::Midnight Mysteries 4: Haunted Houdini +171::Ridge Racer™ Unbounded +172::Imagine Earth +173::Scary Girl +174::Binary Domain +175::Analogue: A Hate Story +176::Toy Soldiers +177::Resident Evil: Operation Raccoon City +178::Ticket to Ride +179::The Lord of the Rings Online™ +180::Indie Game: The Movie +181::Krater +182::The Dark Eye: Chains of Satinav +183::Tom Clancy's Ghost Recon: Future Soldier™ +184::Quantum Conundrum +185::Tribes: Ascend +186::Source Filmmaker +187::eXceed 2nd - Vampire REX +188::eXceed 3rd - Jade Penetrate Black Package +189::Death Rally +190::Hero Academy +191::Iron Brigade +192::Galaxy on Fire 2™ Full HD +193::Sleeping Dogs +194::Din's Curse +195::Batman: Arkham City - Game of the Year Edition +196::To the Moon +197::Intrusion 2 +198::Carrier Command: Gaea Mission +199::3D-Coat V4.8 +200::Cortex Command +201::Rocketbirds: Hardboiled Chicken +202::Doom 3: BFG Edition +203::A Game of Dwarves +204::Hotline Miami +205::Guns of Icarus Online +206::POSTAL 2 +207::F1 RACE STARS™ +208::Sine Mora +209::Stealth Bastard Deluxe +210::The Book of Unwritten Tales: The Critter Chronicles +211::Mabinogi +212::Triple Town +213::Legacy of Kain: Defiance +214::Iron Sky: Invasion +215::Angelica Weaver: Catch Me When You Can +216::Fieldrunners 2 +217::Ace Combat Assault Horizon - Enhanced Edition +218::Retrovirus +219::Cities XL Platinum +220::Super House of Dead Ninjas +221::Highborn +222::Tomb Raider - The Final Hours Digital Book +223::Monster Loves You! +224::Alien Spidy +225::POSTAL +226::Cut the Rope +227::Anodyne +228::Another World – 20th Anniversary Edition +229::Sang-Froid - Tales of Werewolves +230::Cubemen 2 +231::Surgeon Simulator +232::Poker Night 2 +233::StarDrive +234::Sanctum 2 +235::Reus +236::Resident Evil Revelations / Biohazard Revelations +237::Remember Me +238::Penny Arcade's On the Rain-Slick Precipice of Darkness 4 +239::Mortal Kombat Komplete Edition +240::Soldier Front 2 +241::TrackMania² Valley +242::FINAL FANTASY VII +243::BIT.TRIP FATE +244::Ittle Dew +245::CastleStorm +246::Skulls of the Shogun +247::Rise of the Triad +248::Cloudberry Kingdom™ +249::Inquisitor +250::Worms Clan Wars +251::Electronic Super Joy +252::PixelJunk™ Monsters Ultimate +253::Lilly Looking Through +254::America's Army: Proving Grounds +255::Game Dev Tycoon +256::Delver +257::MirrorMoon EP +258::Castle of Illusion +259::Ironclad Tactics +260::Foul Play +261::Scribblenauts Unmasked: A DC Comics Adventure +262::Farming Simulator 2013 Titanium Edition +263::SNOW +264::Soundodger+ +265::Iesabel +266::Knights and Merchants +267::Eleusis +268::Bridge Constructor +269::Bad Hotel +270::140 +271::Anachronox +272::Knytt Underground +273::Deus Ex: Human Revolution - Director's Cut +274::Contagion +275::Blood of the Werewolf +276::Master Reboot +277::Alone in the Dark +278::Deadly Premonition: The Director's Cut +279::State of Decay +280::Long Live The Queen +281::Rain Blood Chronicles: Mirage +282::Vox +283::Kingdoms Rise +284::Ring Runner: Flight of the Sages +285::9.03m +286::The Mysterious Cities of Gold +287::The Last Express Gold Edition +288::Finding Teddy +289::Dark Fall 2: Lights Out +290::Dark Fall: The Journal +291::LogoMaker 4 +292::Broken Sword 5 - the Serpent's Curse +293::Darkout +294::Dominions 4: Thrones of Ascension +295::Wooden Sen'SeY +296::Shufflepuck Cantina Deluxe +297::King’s Bounty: Legions +298::FATE +299::RaySupreme 3D +300::Cold War +301::CONSORTIUM +302::Nidhogg +303::Galcon Legends +304::Humans Must Answer +305::Estranged: Act I +306::Paper Sorcerer +307::Hero Siege +308::The Castle Doctrine +309::Saturday Morning RPG +310::Serena +311::Octodad: Dadliest Catch +312::Aqua Kitty - Milk Mine Defender +313::Sentinel 3: Homeworld +314::Aces Wild: Manic Brawling Action! +315::GTGD S1: More Than a Gamer +316::BlazBlue: Calamity Trigger +317::Disciples III: Reincarnation +318::The Plan +319::LocoCycle +320::Girls Like Robots +321::METAL SLUG 3 +322::Card City Nights +323::Ikaruga +324::Hexcells +325::Epic Battle Fantasy 4 +326::Assassin's Creed Freedom Cry +327::Castlevania: Lords of Shadow 2 +328::Towtruck Simulator 2015 +329::Dominique Pamplemousse +330::1954 Alcatraz +331::Constant C +332::Deus Ex: The Fall +333::LUFTRAUSERS +334::Danmaku Unlimited 2 +335::Heroine's Quest: The Herald of Ragnarok +336::Quest of Dungeons +337::Black Mirror II +338::Abyss: The Wraiths of Eden +339::The Tomorrow War +340::El Matador +341::Marauder +342::Harvester +343::Evolution RTS +344::House of 1,000 Doors: Family Secrets Collector's Edition +345::Volt +346::Secrets of Rætikon +347::Putt-Putt® Joins the Parade +348::Heldric - The legend of the shoemaker +349::Abalone +350::UFO: Aftermath +351::RC Cars +352::Ascension to the Throne +353::FarSky +354::Depths of Fear :: Knossos +355::Nostradamus: The Last Prophecy +356::Vangers +357::Street Racing Syndicate +358::Clockwork Tales: Of Glass and Ink +359::Rogue Shooter: The FPS Roguelike +360::Brigade E5: New Jagged Union +361::7,62 High Calibre +362::Black Rainbow +363::BloodRayne Betrayal +364::Sweezy Gunner +365::Indie Graphics Bundle - Royalty Free Sprites +366::The Whispered World Special Edition +367::Descent: FreeSpace – The Great War +368::Coldfire Keep +369::Fantasy Grounds +370::Chronology +371::The Last Tinker™: City of Colors +372::Wildlife Park 3 +373::Rhiannon: Curse of the Four Branches +374::Fearless Fantasy +375::Orc Attack: Flatulent Rebellion +376::Spy Fox 3 "Operation Ozone" +377::Pajama Sam 3: You Are What You Eat From Your Head To Your Feet +378::Rage Runner +379::Pretentious Game +380::Legionwood 2: Rise of the Eternal's Realm - Director's Cut +381::DRAKERZ-Confrontation +382::Paradigm Shift +383::Retro Game Crunch +384::I Am Vegend - Zombiegeddon +385::A.I.M.2 Clan Wars +386::Numba Deluxe +387::CAPSULE +388::Defense Zone 2 +389::GearCity +390::The Fall +391::The Campaign Series: Fall Weiss +392::Dysan the Shapeshifter +393::Enigmatis 2: The Mists of Ravenwood +394::Richard & Alice +395::Lifeless Planet Premier Edition +396::Magicite +397::Castle: Never Judge a Book by its Cover +398::Echo of the Wilds +399::Reversion - The Escape (1st Chapter) +400::Enemy Front +401::Faery - Legends of Avalon +402::A Wizard's Lizard +403::Bot Colony +404::Stick RPG 2: Director's Cut +405::Heroes Rise: The Hero Project +406::Beyond Space Remastered Edition +407::MotoGP™14 +408::Spoiler Alert +409::Monsters Ate My Birthday Cake +410::Claire +411::Deponia: The Complete Journey +412::House of 1000 Doors: The Palm of Zoroaster Collector's Edition +413::Namariel Legends: Iron Lord Premium Edition +414::Evil Pumpkin: The Lost Halloween +415::Rooms: The Main Building +416::Necronomicon: The Dawning of Darkness +417::Pivvot +418::Steel & Steam: Episode 1 +419::Scooby Doo! & Looney Tunes Cartoon Universe: Adventure +420::Wildlife Park 2 +421::Wildlife Park 2 - Fantasy +422::Wildlife Park 2 - Dino World +423::Wildlife Park 2 - Horses +424::Pixel Hunter +425::Detective Case and Clown Bot in: Murder in the Hotel Lisbon +426::Pressured +427::Toxic Bunny HD +428::Ghostship Aftermath +429::Lantern Forge +430::Sokobond +431::Data Hacker: Initiation +432::My Ex-Boyfriend the Space Tyrant +433::Dungeon Defenders Eternity +434::Third Eye Crime +435::Machines At War 3 +436::Vertical Drop Heroes HD +437::Crazy Plant Shop +438::The Tower +439::Road Not Taken +440::War on Folvos +441::Wyv and Keep: The Temple of the Lost Idol +442::Another Perspective +443::Mega Coin Squad +444::Heavy Fire: Afghanistan +445::Pixeluvo +446::Platypus II +447::Advanced Tactics Gold +448::Platypus +449::Nux +450::Heroes & Legends: Conquerors of Kolhar +451::Shadowgate (2014) +452::Curse: The Eye of Isis +453::Deep Under the Sky +454::Amerzone: The Explorer’s Legacy +455::The Journey Down: Chapter Two +456::How to Survive +457::One Day For Ched +458::The Flying Dutchman +459::Fable Anniversary +460::Jacob Jones and the Bigfoot Mystery : Episode 1 +461::The Collider +462::Color Symphony +463::My Lands: Black Gem Hunting +464::WAKFU +465::Pro Rugby Manager 2015 +466::Enola +467::Wasteland 2: Director's Cut +468::Cho Dengeki Stryker All Ages Version +469::Magicmaker +470::Middle-earth™: Shadow of Mordor™ +471::Front Page Sports Football +472::Left in the Dark: No One on Board +473::METAL SLUG X +474::Moto Racer Collection +475::Disney Princess: My Fairytale Adventure +476::Metal Dead +477::Styx: Master of Shadows +478::Crow +479::Costume Quest 2 +480::Tron 2.0 +481::Sigils of Elohim +482::The Evil Within +483::Enigmatis: The Ghosts of Maple Creek +484::The Treasures of Montezuma 3 +485::Time Rifters +486::Screencheat +487::Vampires: Guide Them to Safety! +488::Sign Motion +489::Sproggiwood +490::Enforcer: Police Crime Action +491::REVOLVER360 RE:ACTOR +492::The Stalin Subway: Red Veil +493::Daedalus - No Escape +494::The Moon Sliver +495::Miscreated +496::The Interactive Adventures of Dog Mendonça & Pizzaboy® +497::Alea Jacta Est +498::The Binding of Isaac: Rebirth +499::Broken Sword 4 - the Angel of Death +500::Command HQ +501::Eradicator +502::Winged Sakura: Mindy's Arc +503::Pitiri 1977 +504::Gunspell - Steam Edition +505::Gold Rush! Anniversary +506::Deadlings: Rotten Edition +507::Toybox Turbos +508::Amphora +509::Randal's Monday +510::Ski-World Simulator +511::The Blue Flamingo +512::Adventure Time: The Secret Of The Nameless Kingdom +513::WARMACHINE: Tactics +514::Letter Quest: Grimm's Journey +515::Death Skid Marks +516::AppGameKit: Easy Game Development +517::Luna: Shattered Hearts: Episode 1 +518::Brink of Consciousness: The Lonely Hearts Murders +519::Craft The World +520::If My Heart Had Wings +521::Shroud of the Avatar: Forsaken Virtues +522::Haunted House: Cryptic Graves +523::Tesla Breaks the World! +524::Joe Dever's Lone Wolf HD Remastered +525::Mining Industry Simulator +526::Galcon 2: Galactic Conquest +527::iO +528::Bet On Soldier +529::Elegy for a Dead World +530::JUJU +531::FINAL FANTASY® XIII-2 +532::SunAge: Battle for Elysium +533::Town of Salem +534::Dead Effect +535::BLOCKADE 3D +536::Shadows of War +537::Mechs & Mercs: Black Talons +538::Squirreltopia +539::Disorder +540::TRISTOY +541::Crystal Catacombs +542::Witch's Pranks: Frog's Fortune Collector's Edition +543::HuniePop +544::Cat Goes Fishing +545::Resident Evil / biohazard HD REMASTER +546::PARTICLE MACE +547::Among Ripples +548::Stranded Deep +549::Guild Commander +550::Venetica - Gold Edition +551::Tulpa +552::The Lady +553::Overture +554::Terra Incognita ~ Chapter One: The Descendant +555::Astray +556::Forsaken Isle +557::Barter Empire +558::Pixel Heroes: Byte & Magic +559::Wickland +560::Plazma Being +561::Samudai +562::Dark Forester +563::Spirit Run - Fire vs. Ice +564::Damned Nation Reborn +565::Barbarian Brawl +566::On A Roll 3D +567::Hotline Miami 2: Wrong Number Digital Comic +568::Odysseus: Long Way Home +569::Night Shift +570::Over 9000 Zombies! +571::Oddworld: New 'n' Tasty +572::DRAGON BALL XENOVERSE +573::DYNASTY WARRIORS® 8 Empires +574::White Night +575::Tallowmere +576::Damnation City of Death +577::Mighty Dungeons +578::Marble Age +579::ARMED SEVEN +580::Shelter 2 +581::Drizzlepath +582::Automation - The Car Company Tycoon Game +583::Sid Meier's Starships +584::Spirit of War +585::Bermuda +586::Oceanhorn: Monster of Uncharted Seas +587::Woolfe - The Red Hood Diaries +588::Trapped Dead: Lockdown +589::Incognito +590::Factions: Origins of Malu +591::12 Labours of Hercules +592::Walkover +593::Exowar +594::Dungeon Highway +595::Hospital Manager +596::Red Lake +597::Spirits of Xanadu +598::Claws & Feathers +599::Grim Legends 2: Song of the Dark Swan +600::An Octave Higher +601::Pixel Puzzles 2: Anime +602::RIDE +603::Jones On Fire +604::Deadly Sin +605::Half-Life 2: Update +606::A Pixel Story +607::Attack of the Labyrinth + +608::AdVenture Capitalist +609::Bloodsports.TV +610::Hare In The Hat +611::The Defenders: The Second Wave +612::gravilon +613::Grass Simulator +614::Astronaut Simulator +615::Adventures of Bertram Fiddle: Episode 1: A Dreadly Business +616::Copa Petrobras de Marcas +617::Defend Your Life: TD +618::Dead Synchronicity: Tomorrow Comes Today +619::Hero Generations +620::Love And Order +621::The Undying Plague +622::Westerado: Double Barreled +623::Telepath Tactics +624::House of Caravan +625::Highlands +626::Airport Simulator 2015 +627::Parcel +628::Environmental Station Alpha +629::Blue Rose +630::Crest - an indirect god sim +631::Mind Snares: Alice's Journey +632::Crypt of the NecroDancer +633::Crypt of the NecroDancer Extended Soundtrack +634::Hypt +635::The Lost Battalion: All Out Warfare +636::Breakout Invaders +637::RPG Maker 2003 +638::Ys VI: The Ark of Napishtim +639::The Music Machine +640::Action Henk +641::Treeker: The Lost Glasses +642::Galactic Civilizations III +643::Trainz: A New Era +644::Luna's Wandering Stars +645::Age of Castles: Warlords +646::Dustbowl +647::NEON STRUCT +648::Spaceman Sparkles 2 +649::Porcunipine +650::Teddy Terror +651::OBEY +652::True Bliss +653::The Incredible Adventures of Van Helsing III +654::Wyrmsun +655::Teddy Floppy Ear - The Race +656::A Bastard's Tale +657::AKIBA'S TRIP: Undead & Undressed +658::Homesick +659::Sleep Attack +660::Blender Game Asset Creation +661::BLADESTORM: Nightmare +662::Alter World +663::Waste Walkers +664::The Silent Age +665::Tiamat X +666::stratO +667::MASSIVE CHALICE +668::Sirius Online +669::Soccer Rage +670::ZombieRun +671::You Must Build A Boat +672::Duck Game +673::Chicken Invaders 3 +674::Alone in the Dark: Illumination™ +675::Super Star Path +676::Koala Kids +677::Nomad +678::CDF Ghostship +679::Age of Fear: The Undead King +680::Lost Lands: Dark Overlord +681::Action Alien +682::Spy Bugs +683::Scarab Tales +684::Prismatica +685::Farm Frenzy: Hurricane Season +686::The Amber Throne +687::oO +688::Lilly and Sasha: Guardian Angels +689::FaceRig +690::Once Bitten, Twice Dead! +691::Hello Kitty and Sanrio Friends Racing +692::City of Fools +693::Trap Them +694::Girlfriend Rescue +695::Chime Sharp +696::RC Mini Racers +697::Squarelands +698::CroNix +699::Super Dungeon Run +700::Cosmic Rocket Defender +701::Lethal RPG: War +702::Aberoth +703::Super Hipster Lumberjack +704::"Glow Ball" - The billiard puzzle game +705::Dungeon League +706::Microcosmum: survival of cells +707::Project Druid - 2D Labyrinth Explorer- +708::Siege Wars +709::Hydraulic Empire +710::MANOS +711::Gunjitsu +712::Dream Chamber +713::SAGA +714::Empyrion - Galactic Survival +715::Celestian Tales: Old North +716::Royal Bounty HD +717::Wanderlust Adventures +718::Blaster Shooter GunGuy! +719::Gravity Error +720::Skyrim Script Extender (SKSE) +721::Hacknet +722::Angry Arrows +723::Silver Creek Falls: Chapter 1 +724::C-Wars +725::Three Digits +726::Curses 'N Chaos +727::Planetary Annihilation: TITANS +728::Big Thinkers Kindergarten +729::Reign of Bullets +730::The Settlers Online +731::Race Track Builder +732::Pure Hold'em +733::Afterlife Empire +734::Inevitability +735::Teeworlds +736::Planet of the Eyes +737::ANKI +738::Sound Shift +739::Kult: Heretic Kingdoms +740::Giana Sisters: Dream Runners +741::RFLEX +742::Fran Bow +743::Onikira - Demon Killer +744::The Black Watchmen +745::Dead In Bermuda +746::Playing History 2 - Slave Trade +747::Calvino Noir +748::One Piece Pirate Warriors 3 +749::Exile's End +750::Mad Max: Fury Road +751::Painters Guild +752::NOBUNAGA'S AMBITION: Sphere of Influence +753::iZBOT +754::Gridberd +755::Master Spy +756::MadOut Ice Storm +757::EasyAntiCheat eSports +758::Ravenmark: Scourge of Estellion +759::Queen's Quest: Tower of Darkness +760::Superstatic +761::Aerannis +762::Arcane Sorcery +763::The Archetype +764::Three Heroes +765::Battle of the Bulge +766::Train Simulator +767::Star Command Galaxies +768::Splendor +769::TY the Tasmanian Tiger 4 +770::Metal Reaper Online +771::CodeSpells +772::Airport Madness: Time Machine +773::Forsaken Fortress Strategy +774::Templar Battleforce +775::Doodle God +776::Lost Lands: A Hidden Object Adventure +777::Toto Temple Deluxe +778::Armikrog +779::A.I. Invasion +780::Game Corp DX +781::Super Sky Arena +782::Hidden Object Bundle 4 in 1 +783::Slipstream 5000 +784::Normality +785::Zenohell +786::Downwell +787::Mushroom 11 +788::War of Beach +789::Warhammer 40,000: Deathwatch - Enhanced Edition +790::Zombie Grinder +791::Lonath Online +792::Dungeon Manager ZV +793::Overlord: Fellowship of Evil +794::Kingdom: Classic +795::Noct +796::Armor Clash +797::Divine Slice of Life +798::Outpost 13 +799::A Wolf in Autumn +800::Divinity: Original Sin - Enhanced Edition +801::Statues +802::Infinite Space III: Sea of Stars +803::The Last Crown: Midnight Horror +804::Indie Game Battle +805::Voidspire Tactics +806::The Last NightMary - A Lenda do Cabeça de Cuia +807::Anno 2205™ +808::Space - The Return Of The Pixxelfrazzer +809::Your Quest +810::Swordbreaker The Game +811::The Incredible Adventures of Van Helsing: Final Cut +812::Krosmaster Arena +813::Garden Rescue: Christmas Edition +814::Dispatcher +815::Dota 2 Player Profiles +816::Showing Tonight: Mindhunters Incident +817::Uriel's Chasm 2: את +818::True Lover's Knot +819::Bitardia +820::Osteya +821::Gender Bender DNA Twister Extreme +822::Jurassic Island: The Dinosaur Zoo +823::One More Dungeon +824::RC Simulation 2.0 +825::Strania - The Stella Machina - +826::FIM Speedway Grand Prix 15 +827::Lowglow +828::Reveal The Deep +829::Wild Season +830::GUILTY GEAR Xrd -SIGN- +831::MechWarrior Online™ +832::OH! RPG! +833::Gabe Newell Simulator 2.0 +834::Hatoful Boyfriend: Holiday Star +835::Turnover +836::Gigachess +837::Taimumari +838::Super Slam Dunk Touchdown +839::Waves 2 +840::River City Super Sports Challenge ~All Stars Special~ +841::The Withering +842::The fall of gods +843::Swapperoo +844::Our Nation's Miner +845::What's under your blanket !? +846::Squirbs +847::Chiptune Champion +848::That Dragon, Cancer +849::Eight Mini Racers +850::LoveBeat +851::Pro Basketball Manager 2016 +852::Zombie Wars: Invasion +853::BATTLE PIXELS +854::Kivi, Toilet and Shotgun +855::Dragon's Dogma: Dark Arisen +856::Astro Lords: Oort Cloud +857::No Turning Back: The Pixel Art Action-Adventure Roguelike +858::Scrap Mechanic +859::World's Dawn +860::Knight Online +861::Incredible Dracula: Chasing Love Collector's Edition +862::Apocalypse Hotel - The Post-Apocalyptic Hotel Simulator! +863::LEGO® MARVEL's Avengers +864::Midnight +865::Time of Dragons +866::Spellweaver +867::Dead6hot +868::Pocket Rumble +869::Tales of Symphonia +870::Horror in the Asylum +871::Tap Tap Legions - Epic battles within 5 seconds! +872::Soccer Manager +873::SnakEscape +874::Doors +875::Defragmented +876::Break Chance Memento +877::Jumpix Jump +878::Super Helmets on Fire DX Ultra Edition Plus Alpha +879::My Name is Mayo +880::Marmoset Hexels 3 +881::Army of Tentacles: (Not) A Cthulhu Dating Sim +882::We Know the Devil +883::Layers of Fear +884::Street Fighter V +885::Gurgamoth +886::Find Out +887::Story Of the Survivor +888::Lamia's Game Room +889::String Theory +890::CABAL Online +891::No Pineapple Left Behind +892::Super Night Riders +893::Astro Duel +894::NeonXSZ +895::OutDrive +896::ALONE IN SPACE +897::Just Death +898::Shadwen +899::The Kindred +900::Atlantic Fleet +901::Cat on a Diet +902::Lucy -The Eternity She Wished For- +903::Balrum +904::Banzai Escape +905::Age of Gladiators +906::Trigger Runners +907::New York Taxi Simulator +908::CUPID - A free to play Visual Novel +909::Mazement +910::Wild Animal Racing +911::Tom Clancy’s The Division™ +912::Mind Zero +913::From Earth +914::Alekhine's Gun +915::Unknown Battle +916::Hidden Object 6-in-1 bundle +917::101 Ways to Die +918::Metal Assault +919::Cubicolor +920::Forgotten Myths CCG +921::Borstal +922::Vortex: The Gateway +923::Atari Vault +924::Paws: A Shelter 2 Game +925::Villagers +926::SAMOLIOTIK +927::At the Mountains of Madness +928::Super Robot Jump Jump +929::Christmas Adventure: Candy Storm +930::Super Arcade Football +931::Anna's Quest +932::NO THING +933::Jet Set Knights +934::Automata Empire +935::S2ENGINE HD +936::Warden: Melody of the Undergrowth +937::Judgment: Apocalypse Survival Simulation +938::Twilight Struggle +939::Welkin Road +940::Massive +941::METAL SLUG 2 +942::Pang Adventures +943::Imperia Online +944::Gahkthun of the Golden Lightning Steam Edition +945::Spaceport Hope +946::Muddy Heights® 2 +947::ARCADE GAME SERIES: DIG DUG +948::ARCADE GAME SERIES: Ms. PAC-MAN +949::Klabi +950::Save the Dodos +951::Drusilla Dreams +952::Colours of Magic: Aqua Teeter +953::Ghoul Kid +954::Cornerstone: The Song of Tyrim +955::Endorlight +956::The Panic Room +957::Abandoned Knight +958::Back in 1995 +959::N.E.R.O.: Nothing Ever Remains Obscure +960::Cubium Dreams +961::Mr Nibbles Forever +962::Puzzle Galaxies +963::Zombillie +964::The Pit And The Pendulum +965::Aselia the Eternal -The Spirit of Eternity Sword- +966::Fragments of Him +967::Share +968::Shadow Complex Remastered +969::Parkitect +970::Neon Drive +971::Princess Isabella: The Rise of an Heir +972::Goliath +973::The House in Fata Morgana +974::Autumn +975::SMASHING THE BATTLE +976::Evo Explores +977::SHOCK TROOPERS +978::Romopolis +979::htoL#NiQ: The Firefly Diary / htoL#NiQ-ホタルノニッキ- +980::Bitardia Cards: Memes of 2ch +981::GROOVY +982::Survive in Space +983::METAGAL +984::Soulcaster: Part I & II +985::Grandpa's Table +986::The Mahjong Huntress +987::Warriors' Wrath +988::Hyper Bounce Blast +989::KNIGHTS +990::The Way of Life Free Edition +991::The NADI Project +992::Magma Tsunami +993::Summer Sale +994::Investigator +995::Anima Gate of Memories +996::Home Behind +997::A Healer Only Lives Twice +998::Rescue Lucy +999::Impossible Quest +1000::Sudoku Quest +1001::Ghost 1.0 +1002::Death Goat +1003::GemBreak +1004::OESE +1005::CrazyCars3D +1006::Hover 2030 +1007::Vilmonic +1008::Twisted Worlds +1009::Mahjong Destiny +1010::MAZE LORD +1011::XSplit +1012::Farnham Fables +1013::PAC-MAN 256 +1014::ChuSingura46+1 S +1015::Affairs of the Court: Choice of Romance +1016::Chicken Assassin - Master of Humiliation +1017::Earth Space Colonies +1018::Vinyl +1019::Tomoyo After ~It's a Wonderful Life~ English Edition +1020::RWBY: Grimm Eclipse +1021::The Lion's Song: Episode 1 - Silence +1022::Goblins and Grottos +1023::Radical Spectrum: Volume 1 +1024::Fossil Echo +1025::Replica +1026::Tomato Jones +1027::UNDER NIGHT IN-BIRTH Exe:Late +1028::Muv-Luv +1029::Alteric +1030::RimWorld +1031::Empty Horizons +1032::Mahjong Deluxe 2: Astral Planes +1033::BrainBread 2 +1034::Red Rope: Don't Fall Behind +1035::Fabulous Food Truck +1036::DreamBreak +1037::Intruder Alert: Ixian Operations +1038::Starbound +1039::Inverted +1040::Lovely Planet Arcade +1041::Legends of the Universe - StarCore +1042::Marvel: Ultimate Alliance 2 +1043::Strange Night +1044::Ratz Instagib +1045::The Return Home +1046::Totally Unbalanced +1047::Intrude +1048::SurvHive +1049::Snow Horse +1050::Pixel Cup Soccer 17 +1051::Mibibli's Quest +1052::The Cat! Porfirio's Adventure +1053::Little King's Story +1054::Aircraft War X +1055::Conclusion +1056::BlackSmith HIT +1057::Street Legal Racing: Redline v2.3.1 +1058::Music Maker 2017 Premium Steam Edition +1059::Bear With Me +1060::Existentia +1061::Heart&Slash +1062::Blade Ballet +1063::Winter Novel +1064::FORTIFY +1065::Ray Gigant +1066::One Night Two Crazies +1067::Pixel Puzzles 2: RADical ROACH +1068::Cubway +1069::Typoman +1070::Grow Up +1071::Monsters and Monocles +1072::ACE Academy +1073::Deus Ex: Mankind Divided +1074::AdVenture Communist +1075::Automobilista +1076::SMILE GAME BUILDER +1077::Panzer Warfare +1078::STANDBY +1079::Optika +1080::Tribal Pass +1081::Fright Light +1082::SHINRAI - Broken Beyond Despair +1083::Caesar™ IV +1084::Quest for Glory 1-5 +1085::Caesar™ 3 +1086::Four Sided Fantasy +1087::Hidden Object - 12 in 1 bundle +1088::Agent Walker: Secret Journey +1089::Gochi-Show! -How To Learn Japanese Cooking Game- +1090::Football Mogul 15 +1091::Police Tactics: Imperio +1092::Halcyon 6: Starbase Commander +1093::The Tale of Doris and the Dragon - Episode 1 +1094::Flat Heroes +1095::Black Sand Drift +1096::Stronghold Legends: Steam Edition +1097::Trials of Azra +1098::Rustangelo +1099::Paladins® +1100::Woodle Tree 2: Worlds +1101::Minimized +1102::Bad ass babes +1103::Wheels of Aurelia +1104::Zenith +1105::NBA 2K17 +1106::Heart's Medicine - Time to Heal +1107::Pixel-Warfare: Pro +1108::Fractured Space +1109::Sorcery! Part 4 +1110::Dog Sled Saga +1111::Pavilion +1112::EARTHLOCK: Festival of Magic +1113::Sig.NULL +1114::Clustertruck +1115::Anykey Simulator +1116::Bloody Walls +1117::Hardware Engineering +1118::Particle Fleet: Emergence +1119::NEON Ultra +1120::Recursed +1121::MegaTagmension Blanc + Neptune VS Zombies (Neptunia) +1122::Zup! +1123::Platro +1124::Industry Manager: Future Technologies +1125::Scrap Garden - The Day Before +1126::Major\Minor - Complete Edition +1127::Hidden Dimensions 3 +1128::Ballistic Protection +1129::BitMaster +1130::Rubek +1131::Feel The Snow +1132::Stay Close +1133::High Octane Drift +1134::Heroes & Generals +1135::The Whisperer in Darkness +1136::True Fear: Forsaken Souls +1137::The Infinite Black +1138::Russian SuperHero Dead Ivan +1139::Bad Caterpillar +1140::Party Saboteurs +1141::PAYDAY 2: John Wick Weapon Pack +1142::Sid Meier’s Civilization® VI +1143::Drift GEAR Racing Free +1144::Hired Ops +1145::Sky Break +1146::Kim +1147::BossConstructor +1148::Ginger: Beyond the Crystal +1149::Halloween Forever +1150::Slayaway Camp +1151::Grab the Bottle +1152::That's Mahjong! +1153::Equin: The Lantern +1154::PHAT PHROG +1155::The Elder Scrolls V: Skyrim Special Edition +1156::NSFW ~ Not a Simulator For Working +1157::Miniature - The Story Puzzle +1158::Balloon Blowout +1159::GO AWAY, THERE'S KUMIS OVER THERE! +1160::Zombie Exodus: Safe Haven +1161::Memory's Dogma CODE:01 +1162::Vanguards +1163::Anime Studio Simulator +1164::Trimmer Tycoon +1165::Bye-Bye, Wacky Planet +1166::Soda Girls +1167::Planet Explorers +1168::Goblin and Coins +1169::World of Tanks Blitz +1170::Sethian +1171::Silence +1172::SPINGUN +1173::Chimpact 1 - Chuck's Adventure +1174::Don't open the doors! +1175::The Sandbox Evolution - Craft a 2D Pixel Universe! +1176::Creeper World 2: Anniversary Edition +1177::ICEY +1178::Zone4 +1179::Club Naughty +1180::Shuffle! +1181::Rugby Union Team Manager 2017 +1182::InfinitasDM +1183::Secret Santa +1184::Counter Agents +1185::Dungeon Souls +1186::Beastiarium +1187::Drop Alive +1188::GAROU: MARK OF THE WOLVES +1189::ZombieCarz +1190::Root Of Evil: The Tailor +1191::Dream Quest +1192::The Dreamlord +1193::BIOS +1194::Glittermitten Grove +1195::8-Bit Invaders! +1196::Blue Tear +1197::Moekuri: Adorable + Tactical SRPG +1198::Art of War: Red Tides +1199::Stern Pinball Arcade +1200::Polygon Attack +1201::Duke of Alpha Centauri +1202::Trick and Treat - Visual Novel +1203::Lily's Day Off +1204::Last Answer +1205::Power Hover +1206::Bad Dream: Coma +1207::Laraan +1208::Illyriad - Grand Strategy MMO +1209::I Am The Hero +1210::Galaxy Admirals +1211::STARDROP +1212::Commands & Colors: The Great War +1213::Imperium Galactica II +1214::Crab Dub +1215::Sticker Craft +1216::A Crashlands Story: Dev Diary +1217::SpiritSphere +1218::Tiles & Tales +1219::PERFECT ANGLE: The puzzle game based on optical illusions +1220::Felix Jumpman +1221::Guild Quest +1222::Warcube +1223::Nyheim +1224::SQUAKE +1225::Fergus The Fly +1226::A House of Many Doors +1227::MOBIUS FINAL FANTASY™ +1228::Off-Road Paradise: Trial 4x4 +1229::Rock God Tycoon +1230::BOOR +1231::Battle Islands: Commanders +1232::Fairy Fencer F Advent Dark Force | フェアリーフェンサー エフ ADVENT DARK FORCE | 妖精劍士 F ADVENT DARK FORCE +1233::Copoka +1234::Mall Empire +1235::Golf It! +1236::The Curse Of Yendor +1237::Zup! 4 +1238::Spoids +1239::Cavern Escape +1240::bob's game +1241::Night in the Woods +1242::Unexplored +1243::Anarchy Online +1244::Open Sorcery +1245::Shift Happens +1246::Northgard +1247::The Exiled +1248::Seasteader +1249::Blackwake +1250::The Inner Darkness +1251::Furious Angels +1252::For The King +1253::Turn Around +1254::VThree +1255::Ino +1256::Zoop! - Hunter's Grimm +1257::Hurricane +1258::ULTIMATE MARVEL VS. CAPCOM 3 +1259::SimAirport +1260::Star Merchant +1261::Disc Jam +1262::Lightspeed Frontier +1263::Atelier Firis: The Alchemist and the Mysterious Journey / フィリスのアトリエ ~不思議な旅の錬金術士~ +1264::LEGO® Worlds +1265::Reflex Arena +1266::Maximum Override +1267::Good Archer +1268::Blink +1269::Lifeline +1270::WARTILE +1271::Crisis in the Kremlin +1272::Toukiden 2 +1273::Splody +1274::Flagster +1275::Monster Slayers +1276::Infinite Tanks +1277::Microgons +1278::Ballistic Overkill +1279::NIGHTSTAR: Rogue Wings +1280::Free! - Iwatobi Swim Club +1281::Mighty Party +1282::State of Anarchy: Master of Mayhem +1283::Idle Evolution +1284::AFL Evolution +1285::Cannons-Defenders: Steam Edition +1286::GIBZ +1287::Kith - Tales from the Fractured Plateaus +1288::Slime-san +1289::Fausts Alptraum +1290::Happy Campers +1291::The Signal From Tölva +1292::Bayonetta +1293::Aaero +1294::A Rose in the Twilight / ロゼと黄昏の古城 +1295::Cosmic Star Heroine +1296::Skyforge +1297::The Wild Eternal +1298::Full Throttle Remastered +1299::Odyssey - The Next Generation Science Game +1300::Pixel Sand +1301::Brawlout +1302::Academagia: The Making of Mages +1303::Storm Riders +1304::Hearthlands +1305::Agatha Knife +1306::Attack Heroes +1307::TumbleSeed +1308::Dawn of Andromeda +1309::Welcome to Moreytown +1310::Fur Fun +1311::Chronicle of Innsmouth +1312::Birthdays the Beginning / バースデイズ・ザ・ビギニング +1313::Dead Cells +1314::Market Tycoon +1315::STEAM HAMMER +1316::Empathy: Path of Whispers +1317::Bounty Train +1318::Rabbit Story +1319::Arcfall +1320::Bokida - Heartfelt Reunion +1321::Mages of Mystralia +1322::Portal Knights +1323::The Infectious Madness of Doctor Dekker +1324::Skylar & Plux: Adventure On Clover Island +1325::A Hole New World +1326::The Superfluous +1327::StarCrawlers +1328::Starpoint Gemini Warlords +1329::50 years +1330::Zombidle : REMONSTERED +1331::Rising Storm 2: Vietnam +1332::Formula Fusion +1333::Shotgun Legend +1334::TEKKEN 7 +1335::Blitzkrieg 3 +1336::Monolith +1337::Bunker 58 +1338::Lines +1339::Flood of Light +1340::Rocket Wars +1341::Pro Cycling Manager 2017 +1342::Orake 2D MMORPG +1343::Zafehouse Diaries 2 +1344::Nex Machina +1345::Libra of the Vampire Princess +1346::Saga of Tanya the Evil +1347::Ticket to Earth +1348::Micro Machines World Series +1349::Zooicide +1350::Three Twenty One +1351::Monsters' Den: Godfall +1352::Still Not Dead +1353::qop +1354::Antisphere +1355::Crash Force® +1356::Block Survival: Legend of the Lost Islands +1357::Hard Reset +1358::Hand Simulator +1359::Tangledeep +1360::Just Cause™ 3: Multiplayer Mod +1361::PWND +1362::Book Of Potentia 2 +1363::Shadow Bug +1364::Fable Fortune +1365::Airmen +1366::Onirim - Solitaire Card Game +1367::Vostok Inc. +1368::Stream Avatars +1369::The Low Road +1370::SUDOKU +1371::Crossout +1372::Sky Knights +1373::Call of Duty®: Modern Warfare® Remastered +1374::SolarGun +1375::Legends of Ellaria +1376::Capitalism 2 +1377::Alchemyland +1378::Nash Racing +1379::The Legend of Heroes: Trails of Cold Steel +1380::Saurian +1381::Juanito Arcade Mayhem +1382::THE KING OF FIGHTERS: DESTINY +1383::Cash Crop +1384::Achievement Hunter: Spinner Edition +1385::Draw Puzzle +1386::MINDNIGHT +1387::The Shrouded Isle +1388::CUBOTS The Origins +1389::Cat Quest +1390::Mega Man Legacy Collection 2 / ロックマン クラシックス コレクション 2 +1391::Sine Mora EX +1392::Lost Technology +1393::Gangs of Space +1394::Looterkings +1395::Fragmented +1396::Drive Isle +1397::Lumber King +1398::Discord Bot Maker +1399::White Day: A Labyrinth Named School +1400::Yet Another Zombie Defense HD +1401::BROKE PROTOCOL: Online City RPG +1402::Island Dash +1403::Pixel Traffic: Circle Rush +1404::Epic Cards Battle 2-Dragons Rising(TCG) +1405::Greedy Guns +1406::Ways of History +1407::Doodle God Blitz +1408::Find this! +1409::Reaching for Petals +1410::Kitten Rampage +1411::SLI-FI: 2D Planet Platformer +1412::Brawl of Ages +1413::The Ultimatest Battle +1414::Trackless +1415::Hand of the Gods +1416::Epic Tavern +1417::PRO EVOLUTION SOCCER 2018 +1418::Oriental Empires +1419::Rover Builder +1420::Jettomero: Hero of the Universe +1421::ARENA an Age of Barbarians story +1422::STELLATUM +1423::World of Castles +1424::ATOMEGA +1425::The Caribbean Sail +1426::Super Fancy Pants Adventure +1427::Arrow Heads +1428::Auto Age: Standoff +1429::Heat Signature +1430::Figment +1431::DwarfCorp +1432::Road Dogs +1433::About Elise +1434::The Painscreek Killings +1435::Killer Instinct +1436::Over The Moonlight +1437::RollerCoaster Tycoon® Classic +1438::Vaporum +1439::Airport CEO +1440::Stick Fight: The Game +1441::JYDGE +1442::SORE +1443::Mushroom Wars 2 +1444::Cubic +1445::Wunderdoktor +1446::Gold Rush: The Game +1447::Yorkshire Gubbins +1448::Party Hard Tycoon +1449::Bomber Crew +1450::Tank Force +1451::Debris +1452::Battlevoid: Sector Siege +1453::Scream Collector +1454::Forever Home +1455::JumpSky +1456::Path Out +1457::FURIDASHI: Drift Cyber Sport +1458::Warspear Online +1459::Mini Guns +1460::Star Story: The Horizon Escape +1461::Team Four Star RPG +1462::A Wonder +1463::LEGO® Marvel Super Heroes 2 +1464::Deep Sky Derelicts +1465::Door Kickers: Action Squad +1466::CarX Drift Racing Online +1467::Remaya Idle +1468::The Mammoth: A Cave Painting +1469::Red Crucible®: Reloaded +1470::AirMech Wastelands +1471::Dominions 5 - Warriors of the Faith +1472::Ylands +1473::汉匈决战/Gloria Sinica: Han Xiongnu Wars +1474::SpellForce 3 +1475::Gunlock +1476::Umineko: Golden Fantasia +1477::I wanna be The Cat +1478::Gorogoa +1479::War Planet Online: Global Conquest +1480::Modern Combat Versus +1481::Golden Hornet +1482::PLAYERUNKN1WN: Friendly Fire +1483::Wooden Battles +1484::Flora +1485::Fruity Smoothie +1486::X-Morph: Defense +1487::Long Live Santa! +1488::Decent Icons +1489::Dinosaurs A Prehistoric Adventure +1490::Gauntlet of IRE +1491::Ashes Cricket +1492::Finding Paradise +1493::Farmer's Dynasty +1494::Rumu +1495::Zup! 7 +1496::OKAMI HD / 大神 絶景版 +1497::March of Empires +1498::Space Wars: Interstellar Empires +1499::Super Turbo Demon Busters! +1500::Shadowhand +1501::SUPERHOT: MIND CONTROL DELETE +1502::Getting Over It with Bennett Foddy +1503::Cookies vs. Claus +1504::Nocturnal Hunt +1505::Bare Metal +1506::Jay Fighter: Remastered +1507::Cobalt WASD +1508::La Tale - Evolved +1509::Carcassonne - Tiles & Tactics +1510::BattleRush +1511::My Free Zoo +1512::Wolfenstein II: The New Colossus +1513::Base Defense +1514::Battle Chef Brigade +1515::Yu-Gi-Oh! Duel Links +1516::東方天空璋 ~ Hidden Star in Four Seasons. +1517::Star Traders: Frontiers +1518::Tactical Monsters Rumble Arena +1519::Football Manager Touch 2018 +1520::Gladiator School +1521::Oik 3 +1522::Superflight +1523::Hand of Fate 2 +1524::True or False Universe +1525::Need For Drink +1526::One Strike +1527::I Am Overburdened +1528::Hollowed +1529::The Norwood Suite +1530::ШП +1531::Zwei: The Ilvard Insurrection +1532::Lines by Nestor Yavorskyy +1533::Codename CURE +1534::LSD +1535::Dresden Files Cooperative Card Game +1536::Coffee Run +1537::Lost Dimension +1538::Flightless +1539::Black Clover +1540::SIMULACRA +1541::AER Memories of Old +1542::ClickRaid +1543::Capsa +1544::Real Farm +1545::Molten Armor +1546::The Inner World - The Last Wind Monk +1547::Beyond the Void +1548::Warbanners +1549::Freaky Awesome +1550::Rex: Another Island +1551::WWE 2K18 +1552::Brawlhalla +1553::South Park™: The Fractured But Whole™ +1554::Mercury Fallen +1555::Robot King Part I: Rebooted and Ready +1556::Dungeons 3 +1557::Diamo XL +1558::Dragon Glory +1559::Middle-earth™: Shadow of War™ +1560::Incline +1561::Rainbow Snake +1562::Press X to Not Die +1563::Battle Chasers: Nightwar +1564::Divided We Fall +1565::Castle Clicker : Building Tycoon +1566::Throne of Lies® The Online Game of Deceit +1567::Bermuda - Lost Survival +1568::Kritika Online +1569::Total War: WARHAMMER II +1570::The Guild 3 +1571::Hob +1572::Project Nimbus +1573::Pinball FX3 +1574::Niche - a genetics survival game +1575::Holdfast: Nations At War +1576::Ancient Frontier +1577::HumanKind: The Awakening +1578::Age of Gladiators II +1579::openCanvas 7 +1580::Tricolour Lovestory +1581::Blast Out +1582::Another Lost Phone: Laura's Story +1583::Super Hydorah +1584::Simulator hipstera 2k17 +1585::Lone Warrior +1586::HIVESWAP: Act 1 +1587::Tooth and Tail +1588::FPV Drone Simulator +1589::Fjong +1590::Academia : School Simulator +1591::Insidia +1592::Stash +1593::Find You +1594::Darkestville Castle +1595::Card City Nights 2 +1596::Madu Maths +1597::Fear For Freedom +1598::On a Roll +1599::1bitHeart +1600::Far Space Halloween edition +1601::Loading +1602::Robocraft +1603::Alphabear: Hardcover Edition +1604::The Escapists 2 +1605::Achievement Hunter: Darkness +1606::Blue Horizon +1607::CastleMiner Warfare +1608::Moero Chronicle | 限界凸記 モエロクロニクル | 極限凸記 萌萌編年史 +1609::Startup Company +1610::Team Racing League +1611::Halcyon 6: Starbase Commander (LIGHTSPEED EDITION) +1612::Super POTUS Trump +1613::Achievement Hunter: Overdose +1614::Code 7 +1615::Spears 'n' Spades +1616::LawBreakers +1617::Hellblade: Senua's Sacrifice +1618::Strategy & Tactics: Dark Ages +1619::Quest Hunter +1620::The Hunting God +1621::Machine World 2 +1622::Black Squad +1623::Fighting Fantasy Legends +1624::Tricone Lab +1625::Fate/EXTELLA +1626::Iron Tides +1627::Cursed Treasure 2 +1628::Planet Ancyra Chronicles +1629::Solar Settlers +1630::Dreamfall Chapters +1631::Pastry Lovers +1632::Strike Vector EX +1633::Aporia: Beyond The Valley +1634::Kingdoms and Castles +1635::Slash It Ultimate +1636::Dead Purge: Outbreak +1637::Star Trek Timelines +1638::Wild Guns Reloaded +1639::Minecraft: Story Mode - Season Two +1640::Omegaland +1641::Unturned +1642::Visual Novel Engine +1643::√Letter - Root Letter - +1644::Bomb Defense +1645::Cricket Captain 2017 +1646::Baobabs Mausoleum Ep.1: Ovnifagos Don´t Eat Flamingos +1647::SAELIG +1648::PLANETS OF WAR +1649::Kimulator 2: The Bottle Flip Master +1650::TAP TOUCH RUN +1651::龙魂时刻 +1652::Your Smile Beyond Twilight:黄昏下的月台上 +1653::b +1654::welcome to heaven +1655::Miss Kobayashi's Dragon Maid +1656::Gabriel Dropout +1657::Kemono Friends +1658::3..2..1..Grenades! +1659::Astro Boy: Edge of Time +1660::SQUIDS FROM SPACE +1661::Art Of Gravity +1662::TinkerQuarry +1663::Formicide +1664::DiRT 4 +1665::Pixel Worlds +1666::Crystal City +1667::Strategic Command WWII: War in Europe +1668::Passpartout: The Starving Artist +1669::Conarium +1670::Battlesloths 2025: The Great Pizza Wars +1671::UltraGoodness +1672::After The End: The Harvest +1673::Might & Mayhem +1674::Lydia +1675::Tokyo 42 +1676::Company of Heroes: Eastern Front +1677::Shotgun Farmers +1678::The Land of Pain +1679::XField Paintball 3 +1680::Don't cut your hand +1681::First Strike: Final Hour +1682::Balthazar's Dream +1683::VEGAS Movie Studio 14 Steam Edition +1684::Flying Tigers: Shadows Over China +1685::Green Cat +1686::Life is Feudal: Forest Village +1687::Detective Butler: Maiden Voyage Murder +1688::MidBoss +1689::Quarantine +1690::Oafmatch +1691::You Are God +1692::ROKH +1693::Old Man's Journey +1694::Regalia: Of Men and Monarchs +1695::Andarilho +1696::Bombinator +1697::Blockle +1698::Run Away +1699::SPACEPLAN +1700::ATOMINE +1701::Last Dream: World Unknown +1702::Blossoms Bloom Brightest +1703::Cublast HD +1704::NEXT JUMP: Shmup Tactics +1705::Arcane Mapper +1706::Jidousha Shakai +1707::What Remains of Edith Finch +1708::Games of Glory +1709::Ruin of the Reckless +1710::Cuit +1711::Deformers +1712::Everything +1713::Orcs Must Die! Unchained +1714::Animal Rivals +1715::ONRAID +1716::Life Beetle +1717::Kingdom of Loot +1718::My Name is You +1719::iStorm +1720::ZRoll +1721::Tuebor: I Will Defend +1722::Bulletstorm: Full Clip Edition +1723::The Quest for Achievements +1724::Warstone TD +1725::The Franz Kafka Videogame +1726::Golf for Workgroups +1727::The Great Whale Road +1728::Berserk +1729::Mob Psycho 100 +1730::Ghost In The Shell: Stand Alone Complex +1731::One Eyed Kutkh +1732::The Eagle's Heir +1733::HOUND +1734::Fallout Shelter +1735::Fences +1736::Life Forge ORPG +1737::News Tycoon +1738::Battle Brothers +1739::Weapon Shop Fantasy +1740::Bush Hockey League +1741::Dungeon Creepster +1742::Molemen Must Die! +1743::Tower Defense - Fantasy Legends Tower Game +1744::Factory Engineer +1745::The Crow's Eye +1746::Running Sausage +1747::The Tenth Line +1748::Macbat 64 +1749::Antagonist +1750::Kona +1751::Viktor, a Steampunk Adventure +1752::NieR:Automata™ +1753::MyWorld - Action RPG Maker +1754::Cosmic Express +1755::Virtual Rides 3 - Funfair Simulator +1756::The Keep +1757::64.0 +1758::Clone Drone in the Danger Zone +1759::Introvert Quest +1760::Future Unfolding +1761::Real Heroes: Firefighter +1762::Tacopocalypse +1763::Monster Monpiece +1764::aMAZE +1765::Nephise +1766::Arma: Cold War Assault Mac/Linux +1767::Chosen 2 +1768::A Girls Fabric Face +1769::Another Adventure +1770::Blossom Tales: The Sleeping King +1771::Universe in Fire +1772::MAKE IT as an Artist +1773::Tower!3D Pro +1774::Faeria +1775::Tanki Online +1776::Turret Terminator +1777::Dad Quest +1778::Vive le Roi +1779::Shadows of Adam +1780::Magazime Editor +1781::CropDuster Supreme +1782::Herald: An Interactive Period Drama - Book I & II +1783::8-Bit Armies: Arena (Free) +1784::The Wardrobe +1785::LOGistICAL +1786::9Dragons +1787::Dropzone +1788::Command Ops 2 +1789::Oik +1790::Upside Down +1791::Dear Esther: Landmark Edition +1792::Semispheres +1793::MX Nitro +1794::8-Bit Armies: Arena +1795::Heavy Gear Assault +1796::WayOut 2: Hex +1797::Realpolitiks +1798::Cabals: Card Blitz +1799::The Wild Eight +1800::Blood Harvest +1801::OR +1802::Max's Big Bust - A Captain Nekorai Tale +1803::WWE 2K17 +1804::Induction +1805::Gunmetal Arcadia +1806::Xenon Valkyrie +1807::Numberline +1808::ANIMALITY +1809::Alwa's Awakening +1810::Midas Gold Plus +1811::BIGFOOT +1812::Itineris +1813::Reptilians Must Die! +1814::HitBox +1815::Disgaea 2 PC / 魔界戦記ディスガイア2 PC +1816::Double Dragon IV +1817::Sakura Agent +1818::Miner Ultra Adventures +1819::A Normal Lost Phone +1820::Witanlore: Dreamtime +1821::Heroes Evolved +1822::Avorion +1823::Hellenica +1824::Once Upon an All Hallow's Eve +1825::Frequent Flyer +1826::Urban Empire +1827::Mortifero Motus +1828::M.E.R.C. +1829::Monumental Failure +1830::Pinkman +1831::Atomic 79 +1832::Zup! 3 +1833::Tales of Berseria™ +1834::Don't Chat With Strangers +1835::Unalive +1836::UNO +1837::Word Killer: Zorgilonian Chronicles +1838::Let's Draw +1839::Score a goal (Physical football) +1840::Blind Love +1841::Behind the Memory +1842::Random Journey +1843::Where are my Internets? +1844::Rumble Fighter: Unleashed +1845::Volleyball Unbound - Pro Beach Volleyball +1846::Xmas Shooting - Scramble!! +1847::Castle Battles +1848::VERSUS: The Elite Trials +1849::Super Blue Boy Planet +1850::Bamboo EP +1851::Endless Fables: The Minotaur's Curse +1852::Defense Zone 3 Ultra HD +1853::The Little Acre +1854::Palinurus +1855::Disney Infinity 3.0: Gold Edition +1856::Prominence Poker +1857::LogicBots +1858::Triennale Game Collection +1859::Campfire: One of Us Is the Killer +1860::Indie Game Sim +1861::Galactic Fighter +1862::Hunger Dungeon +1863::Hade +1864::Coffee Shop Tycoon +1865::Void Pyramid +1866::Minion Masters +1867::Ahnayro: The Dream World +1868::Terminal Hacker +1869::Construct: Escape the System +1870::Charlie's Adventure +1871::Atom Fishing II +1872::Shattered Throne +1873::Quern - Undying Thoughts +1874::Mad Hunter +1875::Turret Architect +1876::Peak Angle: Drift Online +1877::Eon Altar +1878::Front Office Football Eight +1879::Star Trek: Starfleet Command Gold Edition +1880::Germ Wars +1881::Disastr_Blastr +1882::Alicemare +1883::DesertLand 2115 +1884::Glass Masquerade +1885::拯救大魔王2 Rescue the Great Demon 2 +1886::Book Series - Alice in Wonderland +1887::Kopanito All-Stars Soccer +1888::Dreamcage Escape +1889::Screeps +1890::Drunk On Nectar +1891::ENIGMA: +1892::Ittle Dew 2 +1893::CLASH +1894::Nodiatis +1895::Multimirror +1896::Spellstone +1897::Resin +1898::Badiya +1899::One Tower +1900::CRACKHEAD +1901::Kokurase - Episode 1 +1902::Fairyland: Fairy Power +1903::Motorsport Manager +1904::Notruf 112 | Emergency Call 112 +1905::VOI +1906::One Night Stand +1907::Driver Booster 4 for Steam +1908::WayOut +1909::Dead Age +1910::Steam Dev Days +1911::Call of Duty®: Infinite Warfare +1912::Melon Simulator™ +1913::Zero G Arena +1914::Pro Skater 2D +1915::Moto Racer 4 +1916::Slap The Fly +1917::CameraBag Photo +1918::Creepy Castle +1919::Sombrero: Spaghetti Western Mayhem +1920::Blight of the Immortals +1921::VERSUS SQUAD +1922::Yomawari: Night Alone / 夜廻 +1923::The Puppet Master +1924::Dessert Storm +1925::JumpBall +1926::Murder Mystery Adventure +1927::Cursed Castilla (Maldita Castilla EX) +1928::Astral Heroes +1929::Rusty Lake: Roots +1930::AdventureQuest 3D +1931::Lance A Lot®: Classic Edition +1932::Soulless: Ray Of Hope +1933::9th Dawn II +1934::Crush Crush +1935::NUKED KNIGHT +1936::Physic Monster +1937::Remaining in a dream +1938::CrossWorlds: Escape +1939::Razortron 2000 +1940::Near Midnight +1941::Eventide 2: The Sorcerers Mirror +1942::Duke Nukem 3D: 20th Anniversary World Tour +1943::WRC 6 FIA World Rally Championship +1944::Breathing Fear +1945::Mafia III +1946::Doorways: Old Prototype +1947::Aragami +1948::Unclaimed World +1949::The Space Garden +1950::The Sun Will Rise +1951::Zombo Buster Rising +1952::Helmet Heroes +1953::Rogue Operatives Hide and Seek +1954::Masquerada: Songs and Shadows +1955::Rescue Bear Operation +1956::FourChords Guitar Karaoke +1957::Slayer Shock +1958::Merger 3D +1959::Princess Maker 2 Refine +1960::God of Word +1961::Trick & Treat +1962::Make America Great Again: The Trump Presidency +1963::Stellar Tactics +1964::Dream Car Builder +1965::Talewind +1966::DROD: Gunthro and the Epic Blunder +1967::Tentacult! +1968::The Uncertain: Episode 1 - The Last Quiet Day +1969::Toadled +1970::Gun Bombers +1971::Pankapu +1972::Hospitalize +1973::Think To Die +1974::Fall of Civilization +1975::Squeezone +1976::Eclipse: New Dawn for the Galaxy +1977::Diaries of a Spaceport Janitor +1978::Make America Great Again +1979::Solitaire Royale +1980::Soccer Manager 2017 +1981::Beautiful Japanese Scenery - Animated Jigsaws +1982::Dots eXtreme +1983::Carrie's Order Up! +1984::PAC-MAN™ CHAMPIONSHIP EDITION 2 +1985::Mad Games Tycoon +1986::Monsti +1987::Otherland MMO +1988::Envy the Dead +1989::What The Box? +1990::Chess Knight 2 +1991::Zombitatos the end of the Pc master race +1992::Pixel Puzzles Ultimate +1993::Pixelscape: Oceans +1994::STEINS;GATE +1995::Star Crusade CCG +1996::Nanoborg +1997::Dungeon Rushers: Crawler RPG +1998::Revolution 60 +1999::The Tale of a Common Man +2000::Tadpole Treble +2001::Windscape +2002::Cashtronauts +2003::The Last Hope +2004::Destiny of Ancient Kingdoms™ +2005::Reset 1-1 +2006::Thorne - Son of Slaves (Ep.2) +2007::The Hive +2008::Master of Orion +2009::Virginia +2010::Dangerous Relationship +2011::Momento Temporis: Light from the Deep +2012::Picross Touch +2013::Ultimate Arena +2014::Hardware Engineers +2015::J.U.R : Japan Underground Racing +2016::Orbital X +2017::Combat Core +2018::Clean'Em Up +2019::Girl Amazon Survival +2020::No Man's Sky +2021::Siralim 2 +2022::8-Bit Hordes +2023::Genius Greedy Mouse +2024::My Butler +2025::Meridian: Squad 22 +2026::Kimulator : Fight for your destiny +2027::Through Abandoned 2. The Forest +2028::Handsome Mr. Frog +2029::Tricky Towers +2030::ABZU +2031::Rising Islands +2032::Near Death +2033::MANDAGON +2034::Hacker Evolution IMMERSION +2035::D.N.Age +2036::Blade Arcus from Shining: Battle Arena +2037::Barnyard Mahjong 3 +2038::The Amazing Shinsengumi: Heroes in Love +2039::Riptide GP: Renegade +2040::Kingdom Rush Frontiers +2041::Ghost of a Tale +2042::Quadrilateral Cowboy +2043::SolForge +2044::SUPERFIGHT +2045::Zavix Tower +2046::Polarity +2047::Emerland Solitaire: Endless Journey +2048::Mahluk:Dark demon +2049::Mainlining +2050::Domain Defense +2051::Pirates of the Polygon Sea +2052::NECROPOLIS: BRUTAL EDITION +2053::Rot Gut +2054::Killbot +2055::Bot Vice +2056::ESEA +2057::Song of the Deep +2058::Moon Colonization Project +2059::Haven Moon +2060::Jonah's Path +2061::Star Rangers™ XE +2062::Dragonpath +2063::FreeHolder +2064::Megadimension Neptunia VII +2065::Killing Time at Lightspeed: Enhanced Edition +2066::Hero Zero +2067::Rugby Challenge 3 +2068::Crush Your Enemies +2069::LUMBERMANCER +2070::Osozaki 遅咲き Late Blooming - First +2071::Potato Thriller +2072::Umbrella Corps™/Biohazard Umbrella Corps™ +2073::Asemblance +2074::Ortus Regni +2075::Evil Maze +2076::Urban Pirate +2077::Space Run Galaxy +2078::AWA +2079::Envoy 2 +2080::Awareness Rooms +2081::Transmissions: Element 120 +2082::Polandball: Can into Space! +2083::Bastard Bonds +2084::Fantasy Kingdom Simulator +2085::Legends of Callasia +2086::The Hat Man: Shadow Ward +2087::One Small Fire At A Time +2088::Vroomist +2089::Choice of Alexandria +2090::WildStar +2091::Tick Tock Bang Bang +2092::Gloria Victis +2093::Emporea: Realms of War and Magic +2094::Legacy of the Elder Star +2095::VirtualHere For Steam Link +2096::WASTED +2097::The Orb Chambers™ +2098::Sol Trader +2099::Evolution +2100::Pepe Porcupine +2101::Amulet of Dreams +2102::Dark Days +2103::Wanda - A Beautiful Apocalypse +2104::Hope Lake +2105::Ember Kaboom +2106::Age of Barbarian Extended Cut +2107::BloodGate +2108::Onechanbara Z2: Chaos +2109::Kabitis +2110::Brigador: Up-Armored Edition +2111::Grim Legends 3: The Dark City +2112::Artificial Defense +2113::Descent: Road to Legend +2114::SENRAN KAGURA SHINOVI VERSUS +2115::Beater Spirit +2116::Runeous: Part One +2117::The Concourse +2118::BlackShot: Mercenary Warfare FPS +2119::Dead Island Definitive Edition +2120::Tower!3D +2121::Overhell +2122::Zenodyne R +2123::ABC Coloring Town +2124::Neon Hardcorps +2125::Garlock Online +2126::Iron Impact +2127::Aurora Nights +2128::Seduce Me 2: The Demon War +2129::FleetCOMM +2130::Total War: WARHAMMER +2131::Shoppe Keep +2132::BATTLE PIXEL'S SURVIVAL GROUND +2133::Please Hold +2134::Melody's Escape +2135::ORCS +2136::The Dweller +2137::Linkrealms +2138::NotCoD™ +2139::Koihime Enbu +2140::The Mims Beginning +2141::Remnants of a Beautiful Day +2142::The Abbey of Crime Extensum +2143::Space Codex +2144::EPΘCH +2145::Rogue System +2146::Demetrios - The BIG Cynical Adventure +2147::RefRain - prism memories - +2148::DOOM +2149::Murasaki +2150::Trawl +2151::Who's Your Daddy +2152::She Wants Me Dead +2153::Mini Golf Mundo +2154::TASTEE: Lethal Tactics +2155::My Secret Pets! +2156::Super Blue Fighter +2157::Ryzom +2158::Theory Test UK 2016/17 - Driving Test Success +2159::Istrolid +2160::Stellaris +2161::Star Saviors +2162::Worm.is: The Game +2163::Liveza: Death of the Earth +2164::Cyber City 2157: The Visual Novel +2165::I and Me +2166::Gun Rocket +2167::Aurora Dusk: Steam Age +2168::Initia: Elemental Arena +2169::Worlds Adrift Island Creator +2170::Puzzle Box +2171::Oil Enterprise +2172::Bloons TD Battles +2173::Megamagic: Wizards of the Neon Age +2174::Don't Starve Together +2175::Rogue Stormers +2176::Endciv +2177::OPUS: The Day We Found Earth +2178::Western Press +2179::My Night Job +2180::Plastic Playground +2181::Typefighters (Steam Edition) +2182::Tales Across Time +2183::Danganronpa 2: Goodbye Despair +2184::HEX: Shards of Fate +2185::Voxel Warfare Online +2186::IS Defense +2187::The Banner Saga 2 +2188::Night Blights +2189::Goetia +2190::Pub Encounter +2191::Club Life +2192::Last Hope - Tower Defense +2193::Grand Designer +2194::DARK SOULS™ III +2195::StarsOne +2196::Tenrow +2197::The Hero Project: Redemption Season +2198::Game Tycoon 2 +2199::Virtual Rogue +2200::Tower Unite +2201::Fortify +2202::MXGP2 - The Official Motocross Videogame +2203::Mushroom Wars +2204::A Blind Legend +2205::Axes and Acres +2206::Campus Notes - forget me not. +2207::Odd||Even +2208::Little Walker +2209::Outrage +2210::Project Starship +2211::Sorcery! Part 3 +2212::Domino Sky +2213::Metaverse +2214::Until I Have You +2215::Womb Room +2216::Daughter of Shadows: An SCP Breach Event +2217::Epsilon corp. +2218::CHKN +2219::Run Rabbit Run +2220::Blue Sheep +2221::Trackday Manager +2222::Tokyo Babel +2223::Catch a Falling Star +2224::[the Sequence] +2225::Bunker Punks +2226::Epistory - Typing Chronicles +2227::Trial by Viking +2228::XenoShyft +2229::The Last Door: Season 2 - Collector's Edition +2230::R.B.I. Baseball 16 +2231::Angry Video Game Nerd II: ASSimilation +2232::MiniGolf Mania +2233::Forestry 2017 - The Simulation +2234::I Am Caligula +2235::Holodrive +2236::Slain: Back from Hell +2237::A Lenda do Herói - O Herói desta Canção +2238::Airstrike HD +2239::NOBUNAGA'S AMBITION: Sphere of Influence - Ascension / 信長の野望・創造 戦国立志伝 +2240::LostWinds +2241::Wolcen: Lords of Mayhem +2242::Disposable Heroes +2243::Heroes of The West +2244::Day of the Tentacle Remastered +2245::The Next Door +2246::Spaceman Sparkles 3 +2247::Congo +2248::Helen's Mysterious Castle +2249::War Birds: WW2 Air strike 1942 +2250::Square's Route +2251::Hyper Box +2252::Victory and Glory: Napoleon +2253::Hustle Cat +2254::World's Fastest Pizza +2255::Mars 2030 +2256::Out There Somewhere +2257::SPATIAL SOUND CARD +2258::There's Poop In My Soup +2259::Beat Da Beat +2260::The Secret Order 3: Ancient Times +2261::Moon Hunters +2262::Gremlins, Inc. +2263::Rabiez: Epidemic +2264::Mind Games +2265::Paper Train Traffic +2266::Space Pilgrim Episode IV: Sol +2267::Mystica: The Ninth Society +2268::GTGD S3 How To Make A Game +2269::LiEat +2270::Perfect Universe - Play with Gravity +2271::UnReal World +2272::Stardew Valley +2273::Trulon: The Shadow Engine +2274::STAR WARS™ Galactic Battlegrounds Saga +2275::Deponia Doomsday +2276::STAR WARS™ Rebellion +2277::Space Impossible +2278::XBlaze Code: Embryo +2279::Collider +2280::Where's My Mommy? +2281::Bus Simulator 16 +2282::Karaski: What Goes Up... +2283::Acorn Assault: Rodent Revolution +2284::Rock Paper Scissors Champion +2285::Party Jousting +2286::Master of Orion 2 +2287::Heaven's Hope - Special Edition +2288::And So It Was +2289::Gnomoria +2290::Governor of Poker 3 +2291::Steamroll +2292::Broken Dreams +2293::The Quest +2294::Magdalena +2295::ChromaGun +2296::Kindred Spirits on the Roof +2297::SHOWTIME 2073 +2298::NARUTO SHIPPUDEN: Ultimate Ninja STORM 4 +2299::Mystic Destinies: Serendipity of Aeons +2300::Wayward Terran Frontier: Zero Falls +2301::Lucent Heart +2302::XCOM® 2 +2303::Moonlight +2304::The Political Machine 2016 +2305::Curvatron +2306::Rusty Lake Hotel +2307::Sunny Hillride +2308::CALENDULA +2309::Bombshell +2310::DarkMaus +2311::Aozora Meikyuu +2312::Mystic Saga +2313::Narcissu 10th Anniversary Anthology Project +2314::Super Mustache +2315::PulseCharge +2316::AI: Rampage +2317::FullBlast +2318::Eventide: Slavic Fable +2319::Rabi-Ribi +2320::Swiftly +2321::Crashlands +2322::Lif +2323::Let's Sing 2016 +2324::Move or Die +2325::Naval Action +2326::Close Order +2327::Subterrain +2328::Pythagoria +2329::Warlords Battlecry III +2330::Between Me and The Night +2331::O3DX +2332::Rivalry +2333::Slybots: Frantic Zone +2334::Cyber Team Manager +2335::The Bug Butcher +2336::Resident Evil 0 / biohazard 0 HD REMASTER +2337::Darkest Dungeon® +2338::Protoshift +2339::Echoes of Aetheria +2340::Highrise Heroes: Word Challenge +2341::Evertown +2342::Fairy Tale Mysteries: The Puppet Thief +2343::Blood Code +2344::sZone-Online +2345::Linea, the Game +2346::A Wild Catgirl Appears! +2347::The Hurricane of the Varstray -Collateral hazard- +2348::Turok +2349::Lightbender +2350::Moonshot +2351::Puzzle Strike +2352::Dance of Death +2353::Gnomes Garden +2354::Swords and Sorcery - Underworld - Definitive Edition +2355::Monsterland +2356::Star Nomad 2 +2357::Squad +2358::Project Pulsation +2359::Metal War Online: Retribution +2360::Stories of Bethem: Full Moon +2361::PewDiePie: Legend of the Brofist +2362::LIGHTNING RETURNS™: FINAL FANTASY® XIII +2363::Vehicle Simulator +2364::Romance of the Three Kingdoms Maker / 三国志ツクール +2365::Comic Book Hero: The Greatest Cape +2366::The Mean Greens - Plastic Warfare +2367::Manyland +2368::Nuclear Throne +2369::SquareCells +2370::Our Love Will Grow +2371::Dr. Langeskov, The Tiger, and The Terribly Cursed Emerald: A Whirlwind Heist +2372::Vampire Legends: The True Story of Kisilova +2373::Militia +2374::Legacy of Dorn: Herald of Oblivion +2375::Ruzar - The Life Stone +2376::Corgi Warlock +2377::The Last Dream: Developer's Edition +2378::Hit Tank PRO +2379::Mayjasmine Episode01 - What is God? +2380::Handball 16 +2381::Yet Another World +2382::Might & Magic Heroes Online +2383::Dead Acres +2384::Mighty Switch Force! Academy +2385::Idle Civilization +2386::Zero Punctuation: Hatfall - Hatters Gonna Hat Edition +2387::Switch Galaxy Ultra +2388::Vendetta - Curse of Raven's Cry +2389::Terraformer Expedition to Mars +2390::Nusakana +2391::The Consuming Shadow +2392::Hard West +2393::Rescue Team 5 +2394::Dungeon Kingdom: Sign of the Moon +2395::Cross Set +2396::GOCCO OF WAR +2397::Back to Dinosaur Island +2398::Survivor Squad: Gauntlets +2399::Shadow Ninja: Apocalypse +2400::Knight Squad +2401::Trouble In The Manor +2402::Affected Zone Tactics +2403::World War II GI +2404::Last Heroes +2405::Steel Ocean +2406::STEEL STRIDER +2407::rFactor 2 +2408::Legend (1994) +2409::Piercing Blow +2410::Impossible Creatures Steam Edition +2411::Fallout 4 +2412::Steam Controller +2413::Defend The Highlands +2414::The Odyssey: Winds of Athena +2415::Without Within 2 +2416::Diabolical +2417::HotLead +2418::Ironclads 2: American Civil War +2419::Conflicks - Revolutionary Space Battles +2420::The Secret Order 2: Masked Intent +2421::ePic Character Generator +2422::Darksiders II Deathinitive Edition +2423::Wave of Darkness +2424::Zero Reflex : Black Eye Edition +2425::Battle Battalions +2426::Dragon Fin Soup +2427::PONCHO +2428::Mirrored - Chapter 1 +2429::Fallout: A Post Nuclear Role Playing Game +2430::Sonic Lost World +2431::Bit Shifter +2432::The Extinction +2433::The Seven Years War (1756-1763) +2434::Pray For Diamonds +2435::Devil's Bluff +2436::Morphine +2437::Deathless: The City's Thirst +2438::ALPAGES : THE FIVE BOOKS +2439::Warhammer: End Times - Vermintide +2440::RPG Maker MV +2441::200% Mixed Juice! +2442::Flight of the Paladin +2443::Heavy Fire: Shattered Spear +2444::Mu Complex +2445::Chaos Reborn +2446::System Shock: Enhanced Edition +2447::Wurm Unlimited +2448::PixelJunk™ Shooter Ultimate +2449::Eternal Step +2450::Rogue State +2451::The Jackbox Party Pack 2 +2452::Minecraft: Story Mode - A Telltale Games Series +2453::Deus Ex: Revision +2454::Bedlam +2455::Beyond Sol +2456::Soccer Manager 2016 +2457::March of Industry: Very Capitalist Factory Simulator Entertainments +2458::There Was A Caveman +2459::2064: Read Only Memories +2460::SKYHILL +2461::Korwin The Game +2462::Meridian: Age of Invention +2463::Arcana Heart 3 LOVE MAX!!!!! +2464::Stigmat +2465::Ninja Pizza Girl +2466::Lumber Island - That Special Place +2467::Puzzle Ball +2468::ARM PLANETARY PROSPECTORS Asteroid Resource Mining +2469::Black & White Bushido +2470::Hylics +2471::Ratings War +2472::Silver Creek Falls: Chapter 2 +2473::The Escapists: The Walking Dead +2474::NBA 2K16 +2475::Blowy Fish +2476::Shoppy Mart: Steam Edition +2477::Shapes of Gray +2478::Kanji Training Game +2479::Golden Rush +2480::A Kiss For The Petals - Remembering How We Met +2481::Stairs +2482::Tic-Toc-Tower +2483::Orion: A Sci-Fi Visual Novel +2484::Keen Dreams +2485::Tango Fiesta +2486::Explosionade +2487::Invasion +2488::TankZone Battle +2489::Destiny Warriors RPG +2490::The Juicer +2491::Dungeon Nightmares II : The Memory +2492::Future Farmer +2493::Fate Tectonics +2494::Alien Robot Monsters +2495::Warhammer 40,000: Regicide +2496::Shower With Your Dad Simulator 2015: Do You Still Shower With Your Dad +2497::Act of Aggression - Reboot Edition +2498::Streamline +2499::Kitchen Simulator 2015 +2500::Raiden IV: OverKill +2501::Cute Things Dying Violently +2502::Snik +2503::A Wise Use of Time +2504::Rampage Knights +2505::Zoo Empire +2506::Wars and Warriors: Joan of Arc +2507::Almightree: The Last Dreamer +2508::Rememoried +2509::Tinboy +2510::One More Line +2511::Port of Call +2512::Proto Raider +2513::Redemption: Eternal Quest +2514::Clown House (Palyaço Evi) +2515::I Shall Remain +2516::Grandia® II Anniversary Edition +2517::Flywrench +2518::Pretty Girls Mahjong Solitaire +2519::Owys +2520::Evoland 2 +2521::Party Hard +2522::Hegemony III: Clash of the Ancients +2523::Crookz - The Big Heist +2524::WARMODE +2525::Age of Survival +2526::Pump-Action Captain +2527::Curse of the Crescent Isle DX +2528::In Between +2529::Forget Me Not: My Organic Garden +2530::ORBITOR +2531::Super Mega Baseball: Extra Innings +2532::VERSUS: The Lost Ones +2533::Zanzarah: The Hidden Portal +2534::ABD: A Beautiful Day +2535::Volume +2536::RPG MO +2537::Fingered +2538::Illuminascii +2539::Nightside +2540::Fitz the Fox +2541::Spider: Rite of the Shrouded Moon +2542::Shu's Garden +2543::Shadow of Kingdoms +2544::12 Labours of Hercules III: Girl Power +2545::Putrefaction +2546::Hidden: On the trail of the Ancients +2547::Dream +2548::Job the Leprechaun +2549::Go Home - Rage incoming +2550::The Deletion +2551::Stick 'Em Up 2: Paper Adventures +2552::Legend of Kay Anniversary +2553::Hogs of War +2554::Chronicon +2555::Spooky's Jump Scare Mansion +2556::Another Star +2557::Inferno 2 +2558::The Viceroy +2559::Airport Madness 4 +2560::Borderless Gaming +2561::Way of the Samurai 4 +2562::FEIST +2563::Zenzizenzic +2564::Terra Nova: Strike Force Centauri +2565::Time Clickers +2566::RETSNOM +2567::Energy Balance +2568::Stranded In Time +2569::Niko: Through The Dream +2570::Executive Assault +2571::RPG Maker 2000 +2572::001 Game Creator +2573::Fighties +2574::Lost Lands: The Four Horsemen +2575::Steve Chong Finds Out That Suicide is a Bad Idea +2576::MechaNika +2577::SEEP Universe +2578::TeraBlaster +2579::How to Take Off Your Mask +2580::Scraps: Modular Vehicle Combat +2581::Cricket Captain 2015 +2582::Super Cyborg +2583::Clandestinity of Elsie +2584::Gary Grigsby's War in the East +2585::Cosmophony +2586::Trove +2587::The Red Solstice +2588::Weapons Genius +2589::Crash Dive +2590::Austin High +2591::Gaming In Color +2592::Corrosion: Cold Winter Waiting [Enhanced Edition] +2593::Quiplash +2594::RONIN +2595::Vector Thrust +2596::Unpossible +2597::Vapour +2598::Devilry +2599::Yargis - Space Melee +2600::Sumo Revise +2601::Kings of Kung Fu +2602::Super 3-D Noah's Ark +2603::Centauri Sector +2604::Medieval: Total War™ - Collection +2605::SHOGUN: Total War™ - Collection +2606::Interstellar Rift +2607::Devil May Cry® 4 Special Edition +2608::Masterspace +2609::Shot In The Dark +2610::Monster Jam Battlegrounds +2611::Sherlock Holmes Consulting Detective: The Case of the Mummy's Curse +2612::TransPlan +2613::Out of Reach +2614::Tap Heroes +2615::Wimp: Who Stole My Pants? +2616::12 Labours of Hercules II: The Cretan Bull +2617::XIIZEAL +2618::16bit Trader +2619::Butsbal +2620::SimpleRockets +2621::New kind of adventure +2622::Cave Coaster +2623::Organ Biker +2624::Flix The Flea +2625::Avenging Angel +2626::3D MiniGolf +2627::Horizon Shift +2628::Star Horizon +2629::Subject 13 +2630::Locoland +2631::Chip's Challenge 1 +2632::Chip's Challenge 2 +2633::Portal of Evil: Stolen Runes Collector's Edition +2634::Spaceforce Rogue Universe HD +2635::GUILTY GEAR XX ACCENT CORE PLUS R +2636::Stones of Sorrow +2637::Magnetic: Cage Closed +2638::Quadrant +2639::Zombie Zoeds +2640::Dev Guy +2641::Crossfire: Dungeons +2642::Sunset +2643::Bunker - The Underground Game +2644::GameGuru +2645::Making History: The Calm and the Storm Gold Edition +2646::S.K.I.L.L. - Special Force 2 (Shooter) +2647::D Series OFF ROAD Driving Simulation +2648::Breezeblox +2649::CrossCode +2650::Broadsword : Age of Chivalry +2651::Grey Cubes +2652::Higurashi When They Cry Hou - Ch.1 Onikakushi +2653::Batla +2654::Close Combat - Panthers in the Fog +2655::Quell Memento +2656::Invisible, Inc. +2657::LOST ORBIT +2658::Despair +2659::Airport Firefighters - The Simulation +2660::Why Am I Dead At Sea +2661::FINAL FANTASY IV: THE AFTER YEARS +2662::Toren +2663::Shrooms +2664::Selfie : Sisters of the Amniotic Lens +2665::Yomi +2666::Star Trek™ : 25th Anniversary +2667::Snakebird +2668::Controller Companion +2669::Alexia Crow and the Cave of Heroes +2670::Egg Returns Home +2671::GemCraft - Chasing Shadows +2672::Exanima +2673::The Weaponographist +2674::Lux Delux +2675::Order of Battle: World War II +2676::Solarix +2677::Abyss Raiders: Uncharted +2678::Soul Locus +2679::R.B.I. Baseball 15 +2680::Jump/Boxer +2681::Earthtongue +2682::The Little Crane That Could +2683::Kerbal Space Program +2684::Son of Nor +2685::Angry Video Game Nerd: The Movie +2686::STAR WARS™ - X-Wing Special Edition +2687::STAR WARS™ X-Wing vs TIE Fighter - Balance of Power Campaigns™ +2688::Uncanny Valley +2689::Kaiju-A-GoGo +2690::Assassin’s Creed® Chronicles: China +2691::GameLoading: Rise of the Indies +2692::MX vs. ATV Unleashed +2693::Asguaard +2694::Grand Theft Auto V +2695::Mortal Kombat X +2696::BoxesWithGuns +2697::Escape Machines +2698::The Emptiness Deluxe Edition +2699::SWR JST DX Selective Memory Erase Effect +2700::Finders +2701::I am Bread +2702::Square Heroes +2703::Primal Carnage: Extinction +2704::Solar System Conflict +2705::VoidExpanse +2706::Chronicles of Teddy +2707::Titan Souls +2708::Out There: Ω Edition +2709::Motivational Growth +2710::Pillars of Eternity +2711::Cultures - Northland +2712::Please, Don’t Touch Anything +2713::Cyberpunk 3776 +2714::It came from space, and ate our brains +2715::Othello +2716::World of Mixed Martial Arts 3 +2717::VRC PRO +2718::An Alternative Reality: The Football Manager Documentary +2719::Immune - True Survival +2720::Top Trumps Turbo +2721::Vox Populi Vox Dei 2 +2722::Tennis Elbow 2013 +2723::Chicken Invaders 5 +2724::Ghost Encounters: Deadwood - Collector's Edition +2725::Hektor +2726::Dodge +2727::Soccertron +2728::Dreaming Sarah +2729::Hotline Miami 2: Wrong Number +2730::Ori and the Blind Forest +2731::ShellShock Live +2732::Dreamscapes: Nightmare's Heir - Premium Edition +2733::After Reset RPG +2734::ASA: A Space Adventure - Remastered Edition +2735::Ubinota +2736::Pregnancy +2737::rFactor +2738::Savage Lands +2739::Synonymy +2740::Dustoff Heli Rescue +2741::Stay Alight +2742::Runestone Keeper +2743::Pneuma: Breath of Life +2744::The Dark Stone from Mebara +2745::Bard to the Future +2746::Tales of the Orient: The Rising Sun +2747::Belladonna +2748::Cubicle Quest +2749::A Druid's Duel +2750::Republique +2751::Disney•Pixar Finding Nemo +2752::Mystery of Neuschwanstein +2753::HassleHeart +2754::BlastZone 2 +2755::Camera Obscura +2756::You Are Not A Banana: Better Edition +2757::The Book of Unwritten Tales 2 +2758::Raptor: Call of The Shadows - 2015 Edition +2759::The Escapists +2760::Reload +2761::Plush +2762::Wooden Floor +2763::Total War: ATTILA +2764::Stock Car Extreme +2765::TerraTech +2766::Goats on a Bridge +2767::Terra Lander +2768::Mystery Masters: Psycho Train Deluxe Edition +2769::Just Get Through +2770::SickBrick +2771::Steam Heroes +2772::eden* +2773::Exodus Wars: Fractured Empire +2774::Deathtrap +2775::Front Office Football Seven +2776::Seven Kingdoms 2 HD +2777::Natural Soccer +2778::Infect and Destroy +2779::Supreme League of Patriots +2780::Life is Strange - Episode 1 +2781::Drive to Hell +2782::Stardust Vanguards +2783::Streets of Chaos +2784::Heroes® of Might & Magic® III - HD Edition +2785::Gravity Ghost +2786::The Uninvited: MacVenture Series +2787::The Old Tree +2788::Shadowgate: MacVenture Series +2789::868-HACK +2790::8BitMMO +2791::Pahelika: Secret Legends +2792::Phantom Breaker: Battle Grounds +2793::Dark Gates +2794::Lost in a Forest +2795::Kingdoms CCG +2796::Decisive Campaigns: The Blitzkrieg from Warsaw to Paris +2797::Mimpi +2798::Combat Monsters +2799::Citizens of Earth +2800::Disillusions Manga Horror +2801::MotorSport Revolution +2802::Double Dragon Trilogy +2803::HyperRogue +2804::Cahors Sunset +2805::Unhack +2806::BattleSpace +2807::Sky Gamblers: Storm Raiders +2808::Cubot +2809::dUpLicity ~Beyond the Lies~ +2810::Towers of Altrac - Epic Defense Battles +2811::Ninja Guy +2812::Solar War +2813::One Late Night: Deadline +2814::Dwarf Tower +2815::Nameless ~The one thing you must recall~ +2816::Xsyon - Prelude +2817::Rooster Teeth vs. Zombiens +2818::Sportsfriends +2819::Chronicles of a Dark Lord: Episode 1 Tides of Fate Complete +2820::The Repopulation +2821::Outcast 1.1 +2822::Microsoft Flight Simulator X: Steam Edition +2823::Rime Berta +2824::Marvin's Mittens +2825::THE KING OF FIGHTERS '98 ULTIMATE MATCH FINAL EDITION +2826::Sky Mercenaries +2827::Last Inua +2828::MODO indie +2829::It's A Wipe! +2830::BlazBlue: Continuum Shift Extend +2831::About Love, Hate and the other ones +2832::Words for Evil +2833::ALLTYNEX Second +2834::Cargo 3 +2835::Carmageddon TDR 2000 +2836::Club Manager 2015 +2837::Bombing Bastards +2838::fault - milestone one +2839::Magnifico +2840::1Quest +2841::Potatoman Seeks the Troof +2842::The Old City: Leviathan +2843::Rising World +2844::Tales from the Borderlands +2845::Feel-A-Maze +2846::Ilamentia +2847::Akaneiro: Demon Hunters +2848::The Jackbox Party Pack +2849::Eternal Winter +2850::Rollers of the Realm +2851::Cinemaware Anthology: 1986-1991 +2852::The Sun and Moon +2853::Bloons TD 5 +2854::Basketball Pro Management 2015 +2855::Cherry Tree High I! My! Girls! +2856::Robotex +2857::Spriter Pro +2858::Assassin's Creed® Unity +2859::World of Subways 1 – The Path +2860::Koya Rift +2861::The Detail +2862::Lords Of The Fallen™ +2863::Majestic Nights +2864::Buzz Aldrin's Space Program Manager +2865::NS2: Combat +2866::Depth +2867::Skara - The Blade Remains +2868::Hardland +2869::Squishy the Suicidal Pig +2870::Pajama Sam: Games to Play on Any Day +2871::Fatty Bear's Birthday Surprise +2872::Slave Zero +2873::Ziggurat +2874::Data Hacker: Corruption +2875::Door Kickers +2876::DarkEnd +2877::Supreme Ruler Ultimate +2878::May’s Mysteries: The Secret of Dragonville +2879::Borderlands: The Pre-Sequel +2880::Last Knight: Rogue Rider Edition +2881::Disney Epic Mickey 2: The Power of Two +2882::Disney•Pixar Cars 2: The Video Game +2883::Disney•Pixar Brave: The Video Game +2884::A Golden Wake +2885::Sid Meier's Colonization (Classic) +2886::Schein +2887::Boot Hill Heroes +2888::ShaderTool +2889::Split/Second +2890::Disney TRON: Evolution +2891::Gauntlet™ Slayer Edition +2892::Schrödinger’s Cat And The Raiders Of The Lost Quark +2893::TransOcean: The Shipping Company +2894::911: First Responders® +2895::Roadside Assistance Simulator +2896::Kraven Manor +2897::Dandelion - Wishes brought to you - +2898::Command: Modern Air / Naval Operations WOTY +2899::Outland +2900::Shadow Puppeteer +2901::The Stalin Subway +2902::openCanvas 6 +2903::Boson X +2904::Season Match +2905::Bridge Constructor Medieval +2906::Voyage: Journey to the Moon +2907::Runers +2908::RECYCLE +2909::Train Fever +2910::Anarchy Arcade +2911::Dead Rising 3 Apocalypse Edition +2912::Ford Street Racing +2913::Ford Racing 3 +2914::Ford Racing Off Road +2915::Hack 'n' Slash +2916::The Guild Gold Edition +2917::Transport Giant +2918::Toast Time +2919::FATE: The Traitor Soul +2920::The Great War 1918 +2921::Bravada +2922::Sentris +2923::Mountain +2924::Haunted +2925::ACE - Arena: Cyber Evolution +2926::Dungeons: The Eye of Draconus +2927::Risen 3 - Titan Lords +2928::Chess 2: The Sequel +2929::Depth Hunter 2: Deep Dive +2930::Cubic Castles +2931::Ultra Street Fighter® IV +2932::Heroes of a Broken Land +2933::From the Depths +2934::Rex Rocket +2935::Space Hack +2936::Back to Bed +2937::Pure Pool +2938::Blackbay Asylum +2939::Guns and Robots +2940::Industry Empire +2941::Colin McRae Rally +2942::Spud's Quest +2943::Unrest +2944::Gods Will Be Watching +2945::Frayed Knights: The Skull of S'makh-Daon +2946::Terrorhedron Tower Defense +2947::UnEpic +2948::Fall of the New Age Premium Edition +2949::Murder Miners +2950::Total Pro Golf 3 +2951::Small Town Terrors Pilgrim's Hook Collector's Edition +2952::Blood: One Unit Whole Blood +2953::Blood II: The Chosen + Expansion +2954::Quest for Infamy +2955::Stained +2956::Cyto +2957::Isomer +2958::Robot Rescue Revolution +2959::Alpha Zylon +2960::Wayward Manor +2961::Aperture Tag: The Paint Gun Testing Initiative +2962::Ground Pounders +2963::Shantae: Risky's Revenge - Director's Cut +2964::Wild Warfare +2965::Whispering Willows +2966::AutoTileGen +2967::Ship Simulator: Maritime Search and Rescue +2968::The House +2969::Railroad Pioneer +2970::Bridge Constructor Playground +2971::Soldiers: Heroes of World War II +2972::Shattered Planet +2973::School Bus Fun +2974::Aeon Command +2975::Asteria +2976::Aura Kingdom +2977::Battleplan: American Civil War +2978::Z +2979::Sniper Elite 3 +2980::Heroes Rise: The Prodigy +2981::Pulstar +2982::Crimsonland +2983::Heileen 2: The Hands Of Fate +2984::Ichi +2985::Tex Murphy: Overseer +2986::SPINTIRES™ +2987::Space Run +2988::The Incredible Adventures of Van Helsing II +2989::Dungeon of Elements +2990::Probability 0 +2991::The Entente Gold +2992::Floating Point +2993::The Lost Crown +2994::Haunt the House: Terrortown +2995::Racer 8 +2996::Putt-Putt®: Pep's Birthday Surprise +2997::Pajama Sam's Sock Works +2998::Pajama Sam's Lost & Found +2999::Ionball 2: Ionstorm +3000::Freespace 2 +3001::Crimzon Clover WORLD IGNITION +3002::Dead Bits +3003::Pandora: First Contact +3004::Manhunter +3005::Astebreed: Definitive Edition +3006::Pixel Boy and the Ever Expanding Dungeon +3007::Salammbô: Battle for Carthage +3008::Lost Marbles +3009::Battlepaths +3010::Legends of Persia +3011::1001 Spikes +3012::Defiance +3013::Dark Raid +3014::Noir Syndrome +3015::Metal Planet +3016::Splatter - Zombie Apocalypse +3017::Meltdown +3018::Pajama Sam 4: Life Is Rough When You Lose Your Stuff! +3019::Putt-Putt® Enters the Race +3020::Game Character Hub +3021::ibb & obb +3022::FINAL FANTASY III +3023::Antisquad +3024::Super Game Jam +3025::Panzer Tactics HD +3026::Ballad of Solar +3027::Monochroma +3028::G-Ball +3029::Arcadecraft +3030::Wolfenstein: The New Order +3031::Q.U.B.E: Director's Cut +3032::World of Guns: Gun Disassembly +3033::Firefighters 2014 +3034::Always Sometimes Monsters +3035::Panzer Elite Action Gold Edition +3036::Jumpdrive +3037::DYNASTY WARRIORS 8: Xtreme Legends Complete Edition / 真・三國無双7 with 猛将伝 +3038::Ascendant +3039::Empress Of The Deep +3040::Memento Mori 2 +3041::Iron Storm +3042::Empress Of The Deep 2: Song Of The Blue Whale +3043::RUNNING WITH RIFLES +3044::1849 +3045::Terminal Velocity +3046::Secret Agent +3047::Action! - Gameplay Recording and Streaming +3048::Tesla Effect: A Tex Murphy Adventure +3049::The Impossible Game +3050::Malevolence: The Sword of Ahkranox +3051::8BitBoy™ +3052::GunZ 2: The Second Duel +3053::Haegemonia: Legions of Iron +3054::Putt-Putt® and Pep's Dog on a Stick +3055::Spy Fox 2 "Some Assembly Required" +3056::Pajama Sam 2: Thunder and Lightning Aren't So Frightening +3057::Colonies Online +3058::Farming World +3059::The Dungeoning +3060::Eurofighter Typhoon +3061::Death Rally (Classic) +3062::Millennium - A New Hope +3063::Battlepillars Gold Edition +3064::Slip +3065::Escape The Museum +3066::Evopollution +3067::Always Remember Me +3068::Millie +3069::The Last Federation +3070::Thinking with Time Machine +3071::Sentinel +3072::FRACT OSC +3073::Starlight Inception™™ +3074::Life Goes On: Done to Death +3075::Wargame: Red Dragon +3076::NEStalgia +3077::Dark Lore Mysteries: The Hunt For Truth +3078::Avoid - Sensory Overload +3079::Strike Suit Zero: Director's Cut +3080::LEGO® The Hobbit™ +3081::Aggression: Europe Under Fire +3082::Haunted Past: Realm of Ghosts +3083::Mirror Mysteries 2 +3084::Warlock 2: The Exiled +3085::Princess Isabella - Return of the Curse +3086::ReignMaker +3087::White Haven Mysteries +3088::Spy Fox in "Dry Cereal" +3089::Praetorians +3090::Adventure Time: Finn and Jake's Epic Quest +3091::Collapse +3092::Castlevania: Lords of Shadow – Mirror of Fate HD +3093::Creeper World 3: Arc Eternal +3094::TUG +3095::Rogue's Tale +3096::Real Horror Stories Ultimate Edition +3097::Batman™: Arkham Origins Blackgate - Deluxe Edition +3098::Gray Matter +3099::3 Stars of Destiny +3100::Hive +3101::Strategic War in Europe +3102::YAIBA: NINJA GAIDEN Z +3103::Ubersoldier II +3104::Explodemon +3105::Call of Duty®: Ghosts +3106::Desert Gunner +3107::Desert Thunder +3108::US and THEM +3109::Revolution Ace +3110::10 Second Ninja +3111::Incoming Forces +3112::City of Steam: Arkadia +3113::Return to Mysterious Island 2 +3114::Infested Planet +3115::Corporate Lifestyle Simulator +3116::Dragons and Titans +3117::Soulbringer +3118::The Book of Legends +3119::Post Master +3120::Riptide GP2 +3121::Race To Mars +3122::Mitsurugi Kamui Hikae +3123::Procyon +3124::Where Angels Cry +3125::Iron Soul +3126::Chuck's Challenge 3D +3127::One Finger Death Punch +3128::Descent 2 +3129::Humanity Asset +3130::Holy Avatar vs. Maidens of the Dead +3131::Ninja Cats vs Samurai Dogs +3132::Rambo The Video Game: Baker Team +3133::Go! Go! Nippon! ~My First Trip to Japan~ +3134::Major Mayhem +3135::Journal +3136::WazHack +3137::Drox Operative +3138::Masters of the World - Geopolitical Simulator 3 +3139::Super Killer Hornet: Resurrection +3140::Dead Man's Draw +3141::The LEGO® Movie - Videogame +3142::Aveyond 3-1: Lord of Twilight +3143::Graviteam Tactics: Operation Star +3144:://N.P.P.D. RUSH//- The milk of Ultraviolet +3145::Let's Sing +3146::MorphVOX Pro - Voice Changer +3147::Loadout +3148::Glacier 3: The Meltdown +3149::Might & Magic X - Legacy +3150::KAMI +3151::Original War +3152::Strike Vector +3153::Broken Age +3154::KickBeat Steam Edition +3155::Hitman: Contracts +3156::Blackguards +3157::Steam Bandits: Outpost +3158::Loren The Amazon Princess +3159::METAL GEAR RISING: REVENGEANCE +3160::Realms of Arkania 1 - Blade of Destiny Classic +3161::3089 -- Futuristic Action RPG +3162::Kingdom Rush +3163::Unearthed: Trail of Ibn Battuta - Episode 1 - Gold Edition +3164::Grimm +3165::Dementium II HD +3166::The Walking Dead: Season 2 +3167::Zigfrak +3168::RPG Maker XP +3169::Stick it to The Man! +3170::Blockland +3171::Just Cause 2: Multiplayer Mod +3172::Samurai Gunn +3173::Small World 2 +3174::OMSI 2: Steam Edition +3175::MURI +3176::Nimble Quest +3177::The Novelist +3178::Speedball 2 HD +3179::FINAL FANTASY VIII +3180::Draw a Stickman: EPIC +3181::Postmortem: One Must Die (Extended Cut) +3182::Vector +3183::Half-Life: Before +3184::Tank Operations: European Campaign +3185::Gas Guzzlers Extreme +3186::Blood Knights +3187::Earth 2140 +3188::Injustice: Gods Among Us Ultimate Edition +3189::Intake +3190::Type:Rider +3191::Anomaly Warzone Earth Mobile Campaign +3192::Valdis Story: Abyssal City +3193::Magicka: Wizards of the Square Tablet +3194::Sniper Elite: Nazi Zombie Army 2 +3195::Heli Heroes +3196::Journey of a Roach +3197::The 7th Guest +3198::Stronghold HD +3199::FORCED: Slightly Better Edition +3200::Dragon's Lair 2: Time Warp +3201::Demonicon +3202::NARUTO SHIPPUDEN: Ultimate Ninja STORM 3 Full Burst HD +3203::WRC 4 FIA World Rally Championship +3204::Democracy 3 +3205::Talisman: Prologue +3206::Urban Chaos +3207::Megabyte Punch +3208::Day One : Garry's Incident +3209::Dysfunctional Systems: Learning to Manage Chaos +3210::Giana Sisters: Twisted Dreams - Rise of the Owlverlord +3211::Gorky 17 +3212::KnightShift +3213::Legends of Aethereus +3214::Daikatana +3215::Salvation Prophecy +3216::Air Conflicts: Vietnam +3217::Silent Storm Gold Edition +3218::PlayClaw 5 - Game Recording and Streaming +3219::Artemis Spaceship Bridge Simulator +3220::Memoria +3221::Brothers - A Tale of Two Sons +3222::Hate Plus +3223::Tom Clancy’s Splinter Cell Blacklist +3224::Skullgirls +3225::Spelunky +3226::Guncraft +3227::Leisure Suit Larry in the Land of the Lounge Lizards: Reloaded +3228::Storm +3229::The Apogee Throwback Pack +3230::Interstellar Marines +3231::Risk +3232::The Night of the Rabbit +3233::Cubetractor +3234::The Swapper +3235::The Incredible Adventures of Van Helsing +3236::Dust: An Elysian Tail +3237::Super Puzzle Platformer Deluxe +3238::Gunpoint +3239::Super Sanctum TD +3240::Anomaly 2 +3241::Jack Lumber +3242::Far Cry 3 - Blood Dragon +3243::Dyad +3244::Darkfall Unholy Wars +3245::ORION: Prelude +3246::Sacred Citadel +3247::Age of Empires II HD +3248::Dungeon Hearts +3249::DisplayFusion +3250::Cities in Motion 2 +3251::DLC Quest +3252::Shattered Haven +3253::Angry Birds Space +3254::Go Home Dinosaurs! +3255::The Showdown Effect +3256::Arma II: DayZ Mod +3257::The Banner Saga: Factions +3258::Brutal Legend +3259::Impire +3260::Construct 2 +3261::Proteus +3262::Sonic & All-Stars Racing Transformed +3263::Omerta - City of Gangsters +3264::10,000,000 +3265::BIT.TRIP VOID +3266::Ace of Spades: Battle Builder +3267::GTR 2 FIA GT Racing Game +3268::Party of Sin +3269::Far Cry 3 +3270::LEGO The Lord of the Rings +3271::Tomb Raider V: Chronicles +3272::Little Inferno +3273::Sonic Adventure 2 +3274::Scribblenauts Unlimited +3275::Cherry Tree High Comedy Club +3276::Natural Selection 2 +3277::Pid +3278::iBomber Attack +3279::Conquest of Elysium 3 +3280::Deadlight +3281::Viking: Battle for Asgard +3282::Zombie Driver HD +3283::Aerofly FS 1 Flight Simulator +3284::Mark of the Ninja +3285::Of Orcs And Men +3286::R.A.W. Realms of Ancient War +3287::Blood Bowl: Chaos Edition +3288::McPixel +3289::Planets Under Attack +3290::Call of Duty: Black Ops - Mac Edition +3291::Torchlight II +3292::Air Conflicts: Pacific Carriers +3293::Continent of the Ninth Seal +3294::Tryst +3295::The Basement Collection +3296::Spirits +3297::I Am Alive +3298::DARK SOULS™: Prepare To Die™ Edition +3299::Great Big War Game +3300::Super Crate Box +3301::Galactic Civilizations® I: Ultimate Edition +3302::Cladun X2 / クラシックダンジョンX2 +3303::Check vs Mate +3304::Thirty Flights of Loving +3305::Symphony +3306::Deponia +3307::Unmechanical +3308::eXceed - Gun Bullet Children +3309::Inversion™ +3310::Wanderlust: Rebirth +3311::Orcs Must Die! 2 +3312::Prototype 2 +3313::Dungeonbowl - Knockout Edition +3314::Endless Space® - Collection +3315::Adventures of Shuggy +3316::Fray: Reloaded Edition +3317::Game of Thrones +3318::Iron Front: Digital War Edition +3319::Conflict Desert Storm™ +3320::Magical Diary: Horse Hall +3321::Thief™ Gold +3322::Botanicula +3323::Avernum 6 +3324::Avernum 4 +3325::Blades of Time +3326::Sherlock Holmes and The Hound of The Baskervilles +3327::Lone Survivor: The Director's Cut +3328::The Walking Dead +3329::A Valley Without Wind +3330::Warlock - Master of the Arcane +3331::Avernum: Escape From the Pit +3332::Superbrothers: Sword & Sworcery EP +3333::The Witcher 2: Assassins of Kings Enhanced Edition +3334::Deep Black: Reloaded +3335::Super MNC +3336::All Zombies Must Die!: Scorepocalypse +3337::Stronghold Kingdoms +3338::Blackwell Deception +3339::Blackwell Convergence +3340::Kingdoms of Amalur: Reckoning™ +3341::Sonic CD +3342::Unstoppable Gorg +3343::Crusader Kings Complete +3344::Insane 2 +3345::SOL: Exodus +3346::Age of Empires® III: Complete Collection +3347::LEGO Harry Potter: Years 5-7 +3348::Choplifter HD +3349::Sideway™ New York +3350::Renegade Ops +3351::Worms Pinball +3352::Worms Blast +3353::Steel Storm: Burning Retribution +3354::Might & Magic: Clash of Heroes +3355::Dungeons - The Dark Lord +3356::Hitogata Happa +3357::The Clockwork Man: The Hidden World +3358::A Game of Thrones - Genesis +3359::F1 2011 +3360::Bastion +3361::From Dust +3362::Avadon: The Black Fortress +3363::Legend of Fae +3364::8-Bit Commando +3365::Chantelise - A Tale of Two Sisters +3366::E.Y.E: Divine Cybermancy +3367::Kohan: Ahriman's Gift +3368::Cossacks: European Wars +3369::American Conquest: Fight Back +3370::American Conquest +3371::Cossacks II: Napoleonic Wars +3372::Cossacks II: Battle for Europe +3373::Achron +3374::Gatling Gears +3375::Demolition Company Gold Edition +3376::Trauma +3377::ARMA: Gold Edition +3378::Trapped Dead +3379::Operation Flashpoint: Red River +3380::Vertex Dispenser +3381::Elizabeth Find M.D. - Diagnosis Mystery - Season 2 +3382::Zombie Pirates +3383::The Next BIG Thing +3384::Cargo! The Quest for Gravity +3385::Hydrophobia: Prophecy +3386::Portal 2 - The Final Hours +3387::Syberia +3388::NightSky +3389::SEGA Bass Fishing +3390::Atom Zombie Smasher +3391::Post Apocalyptic Mayhem +3392::Revenge of the Titans +3393::LEGO® Star Wars™ III - The Clone Wars™ +3394::Shift 2 Unleashed +3395::Dungeon Siege +3396::Agricultural Simulator 2011: Extended Edition +3397::Men of War: Assault Squad +3398::Painkiller Redemption +3399::Magicka +3400::Blue Toad Murder Files™: The Mysteries of Little Riddle +3401::EVE Online +3402::Dive to the Titanic +3403::The UnderGarden +3404::Alien Breed 3: Descent +3405::MX vs. ATV Reflex +3406::Blood Bowl® Legendary Edition +3407::Winter Voices +3408::NyxQuest: Kindred Spirits +3409::Lost Horizon +3410::Aura: Fate of the Ages +3411::Lugaru HD +3412::Diamond Dan +3413::Power of Defense +3414::The Guild II +3415::Theatre of War +3416::Theatre of War 2: Kursk 1943 +3417::Day of Defeat: Source +3418::Blacklight: Tango Down +3419::Future Wars +3420::Chaser +3421::Singularity™ +3422::F.E.A.R. +3423::Gridrunner Revolution +3424::Dawn of Discovery™: Venice +3425::Arsenal of Democracy: A Hearts of Iron Game +3426::Silent Hunter 5®: Battle of the Atlantic +3427::Shatter +3428::Dragon Age™: Origins Awakening +3429::Command & Conquer 4: Tiberian Twilight +3430::Dark Fall: Lost Souls +3431::Hazen: The Dark Whispers +3432::Ironclads: American Civil War +3433::Booster Trooper +3434::Nancy Drew®: Warnings at Waverly Academy +3435::Aliens versus Predator Classic 2000 +3436::Aliens vs. Predator™ +3437::Gyromancer +3438::Rogue Warrior +3439::King's Bounty: Armored Princess +3440::Broken Sword 3 - the Sleeping Dragon +3441::Broken Sword 2 - the Smoking Mirror: Remastered +3442::Altitude +3443::9th Company: Roots Of Terror +3444::Samorost 2 +3445::Nancy Drew®: The Haunted Carousel +3446::Sacraboar +3447::Nancy Drew®: Danger on Deception Island +3448::Borderlands +3449::Big Brain Wolf +3450::Lucidity™ +3451::Red Faction Guerrilla Steam Edition +3452::Zuma's Revenge! +3453::STAR WARS™ - Dark Forces +3454::STAR WARS™ Jedi Knight - Mysteries of the Sith™ +3455::Twin Sector +3456::MDK +3457::AaAaAA!!! - A Reckless Disregard for Gravity +3458::MDK 2 +3459::Nation Red +3460::Red Faction +3461::Red Faction II +3462::Batman: Arkham Asylum Game of the Year Edition +3463::Cooking Dash® +3464::Chocolatier®: Decadence by Design™ +3465::East India Company +3466::Sniper Elite +3467::Bad Rats: the Rats' Revenge +3468::The Dig® +3469::Supreme Ruler 2020 Gold +3470::Delta Force: Task Force Dagger +3471::Tachyon: The Fringe +3472::Delta Force +3473::Delta Force — Black Hawk Down: Team Sabre +3474::Arma 2 +3475::Trine Enchanted Edition +3476::Overlord II +3477::Lunnye Devitsy +3478::F-16 Multirole Fighter +3479::Crayon Physics Deluxe +3480::Alien Shooter: Revisited +3481::Zombie Shooter +3482::Restaurant Empire II +3483::Mightier +3484::Dark Sector +3485::The Path +3486::COIL +3487::Caster +3488::Eternal Silence +3489::Eschalon: Book I +3490::Spectromancer +3491::Hospital Tycoon +3492::Tom Clancy's Splinter Cell Double Agent® +3493::Driver® Parallel Lines +3494::Warhammer 40,000: Dawn of War II +3495::Puzzle Quest: Galactrix +3496::SlamIt Pinball Big Score +3497::Tom Clancy's EndWar™ +3498::Grand Ages: Rome +3499::Monster Trucks Nitro +3500::Europa Universalis III Complete +3501::Exodus from the Earth +3502::Starscape +3503::Precipice of Darkness, Episode Two +3504::7 Wonders: Treasures of Seven +3505::Left 4 Dead +3506::Prince of Persia: Warrior Within™ +3507::Prince of Persia®: The Sands of Time +3508::Prince of Persia® +3509::Need for Speed Undercover +3510::Mass Effect +3511::SPORE™ +3512::Imperium Romanum Gold Edition +3513::INSURGENCY: Modern Infantry Combat +3514::Age of Chivalry +3515::D.I.P.R.I.P. Warm Up +3516::Zombie Panic! Source +3517::Insecticide Part 1 +3518::Sacred Gold +3519::Tom Clancy's Ghost Recon® Desert Siege™ +3520::Tom Clancy's Ghost Recon® +3521::Silverfall: Earth Awakening +3522::Assassin's Creed™: Director's Cut Edition +3523::Trackmania United Forever Star Edition +3524::Virtual Villagers: A New Home +3525::Cold Fear™ +3526::Tom Clancy's Rainbow Six Lockdown™ +3527::Precipice of Darkness, Episode One +3528::Warhammer® 40,000: Dawn of War® - Soulstorm +3529::Safecracker: The Ultimate Puzzle Adventure +3530::Full Spectrum Warrior: Ten Hammers +3531::ThreadSpace: Hyperbol +3532::Full Spectrum Warrior +3533::DOOM 3 +3534::Quake III Arena +3535::QUAKE II Mission Pack: Ground Zero +3536::HeXen: Deathkings of the Dark Citadel +3537::QUAKE III: Team Arena +3538::Painkiller Overdose +3539::Call of Juarez™ +3540::Call of Duty® 4: Modern Warfare® +3541::Amazing Adventures The Lost Tomb™ +3542::Heretic: Shadow of the Serpent Riders +3543::Sam & Max 105: Reality 2.0 +3544::Geometry Wars: Retro Evolved +3545::Just Cause +3546::Hitman: Codename 47 +3547::Commandos 2: Men of Courage +3548::Thief: Deadly Shadows +3549::Deus Ex: Game of the Year Edition +3550::Jade Empire™: Special Edition +3551::Peggle Deluxe +3552::Silverfall +3553::Runaway, The Dream of The Turtle +3554::GUN™ +3555::Call of Duty: United Offensive +3556::Sid Meier's Civilization® III Complete +3557::Shattered Union +3558::Medieval II: Total War™ +3559::Heroes of Annihilated Empires +3560::Global Adventures +3561::Six Days of Snow +3562::Bombernauts +3563::Bloodworks +3564::Sid Meier's Pirates! +3565::Half-Life 2: Lost Coast +3566::Red Orchestra: Ostfront 41-45 +3567::Space Empires IV Deluxe +3568::Earth 2160 +3569::Half-Life Deathmatch: Source +3570::SiN Episodes: Emergence +3571::Typer Shark! Deluxe +3572::Bejeweled Deluxe +3573::Dynomite Deluxe +3574::AstroPop Deluxe +3575::Zuma Deluxe +3576::Insaniquarium Deluxe +3577::PLAYERUNKN4WN: Zombie +3578::Gothic 1 +3579::Geneforge 1 +3580::Counter-Strike: Condition Zero diff --git a/data/ref/steam/test.ipynb b/data/ref/steam/test.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..705a4b61643224d85f85c471011d4fdb54745cc9 --- /dev/null +++ b/data/ref/steam/test.ipynb @@ -0,0 +1,190 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " seq next len_seq \\\n", + "0 [3442, 3448, 3451, 97, 180, 78, 3300, 152, 340... 3462 10 \n", + "1 [3448, 3451, 97, 180, 78, 3300, 152, 3401, 185... 3354 10 \n", + "2 [3451, 97, 180, 78, 3300, 152, 3401, 185, 3462... 274 10 \n", + "3 [97, 180, 78, 3300, 152, 3401, 185, 3462, 3354... 3276 10 \n", + "4 [180, 78, 3300, 152, 3401, 185, 3462, 3354, 27... 3225 10 \n", + "... ... ... ... \n", + "151051 [129, 2411, 1033, 204, 498, 3242, 3505, 3224, ... 1734 10 \n", + "151052 [2411, 1033, 204, 498, 3242, 3505, 3224, 2524,... 1945 10 \n", + "151053 [1033, 204, 498, 3242, 3505, 3224, 2524, 1099,... 1134 10 \n", + "151054 [3431, 2808, 3214, 3284, 3001, 800, 2636, 3581... 2636 7 \n", + "151055 [14, 58, 3510, 15, 68, 86, 3238, 2411, 1134, 2... 1073 10 \n", + "\n", + " review \\\n", + "0 [Maybe a niche thing, but it has solid gamepla... \n", + "1 [Borderlands at its core is spectacular: the g... \n", + "2 [You get to be the hero of the people WHILE bl... \n", + "3 [The game is far from perfect, I could point o... \n", + "4 [Very instructive', \"There's a ton of stuff wr... \n", + "... ... \n", + "151051 [This game is the best when I was bored playin... \n", + "151052 [I don't even know where to begin on how good ... \n", + "151053 [BrainBread 2 has really fun single player bec... \n", + "151054 [Starting the game, you will go into an area w... \n", + "151055 [Think the original Doom but with more awesome... \n", + "\n", + " next_review \n", + "0 I played to the end, I feel obligated to recom... \n", + "1 I was pretty shocked by how much I liked this ... \n", + "2 words cant explain how good this game is GET I... \n", + "3 best game i ever bought a rts with actual play... \n", + "4 Extremely punishing game, but every death is p... \n", + "... ... \n", + "151051 I had this game since it first came out \n", + "151052 give me a reason to actually hate white people. \n", + "151053 Heroes and Generals is a really fun game but r... \n", + "151054 The game is fun it's a cool concept, and I lik... \n", + "151055 It's Wasted Potential but still a pretty good ... \n", + "\n", + "[151056 rows x 5 columns]\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# 读取pickle文件\n", + "df = pd.read_pickle(\"./train_data.df\")\n", + "\n", + "# 打印数据框\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " seq next len_seq \\\n", + "0 [1221, 899, 490, 1985, 255, 3058, 3119, 2930, ... 1417 10 \n", + "1 [3448, 855, 2710, 6, 2694, 3581, 3581, 3581, 3... 2694 5 \n", + "2 [3255, 3399, 3330, 3500, 2729, 1335, 68, 1866,... 642 10 \n", + "3 [273, 3462, 2656, 2033, 3333, 3284, 2110, 470,... 470 8 \n", + "4 [3284, 1134, 2992, 727, 3442, 831, 6, 76, 2899... 2899 9 \n", + "... ... ... ... \n", + "1189 [6, 2986, 2683, 495, 3580, 3171, 234, 164, 2, ... 2853 10 \n", + "1190 [2262, 2694, 1358, 883, 2174, 6, 2683, 1604, 4... 1478 10 \n", + "1191 [150, 1099, 3488, 3580, 2725, 3171, 535, 1622,... 206 10 \n", + "1192 [206, 6, 52, 3272, 204, 926, 498, 2712, 2496, ... 3202 10 \n", + "1193 [3251, 3300, 1822, 150, 2160, 2046, 6, 1038, 2... 1602 10 \n", + "\n", + " review \\\n", + "0 [Really nice game, Would recommend!, meh, This... \n", + "1 [finished it, its good but after i finished it... \n", + "2 [Paradox Interactive\\tdouble the price for alm... \n", + "3 [Nice, Combat system can be better, All the fu... \n", + "4 [9/10, 10/10, 9/10, 10/10, -99999/10, 9/10, id... \n", + "... ... \n", + "1189 [RDM simulator, 192 cubic tonnes of mud simula... \n", + "1190 [do I have a brain?, 18+, relationship of Park... \n", + "1191 [For DC, Любителям Аниме., 123, Ну такое., Hor... \n", + "1192 [Peed all over my dog then I started the game.... \n", + "1193 [Great for a few hours until you beat it., Fun... \n", + "\n", + " next_review \n", + "0 HUGE improvements on graphics and gameplay and... \n", + "1 ok. \n", + "2 Unstable \n", + "3 You've probably already heard that this game i... \n", + "4 10/10 \n", + "... ... \n", + "1189 best game ever made simulator \n", + "1190 new vision, new way \n", + "1191 Кратко: мужик живёт с мамой в маленьком фургоне \n", + "1192 Story mode kinda sucks but the rest of the gam... \n", + "1193 While being free-to-play, Robocraft seems very... \n", + "\n", + "[1194 rows x 5 columns]\n" + ] + } + ], + "source": [ + "# 读取pickle文件\n", + "df = pd.read_pickle(\"./Test_data.df\")\n", + "\n", + "# 打印数据框\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "interaction_pairs = []\n", + "\n", + "for idx, row in df.iterrows():\n", + " user_id = idx # 如果你有显式的用户ID,这里应该使用那个用户ID\n", + " items = row['seq'] + [row['next']]\n", + " for item in items:\n", + " interaction_pairs.append((user_id, item))\n", + "\n", + "# 转换成DataFrame\n", + "interaction_df = pd.DataFrame(interaction_pairs, columns=['user_id', 'item_id'])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interaction Density: 0.0031\n" + ] + } + ], + "source": [ + "# 创建用户-项矩阵\n", + "user_item_matrix = pd.crosstab(interaction_df['user_id'], interaction_df['item_id'])\n", + "\n", + "# 计算非零元素的比例来确定稠密度\n", + "non_zero_count = user_item_matrix.astype(bool).sum().sum() # 计算非零元素的总数\n", + "total_elements = user_item_matrix.size # 矩阵中元素的总数\n", + "\n", + "interaction_density = non_zero_count / total_elements\n", + "print(f\"Interaction Density: {interaction_density:.4f}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "MOE4REC", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/data/ref/steam/train_data.df b/data/ref/steam/train_data.df new file mode 100644 index 0000000000000000000000000000000000000000..ca8aa4186e94c75d581381edf10f88970831aa54 --- /dev/null +++ b/data/ref/steam/train_data.df @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90f8e2ec827427d271cf0b03db45ed5ac3231840fbd022ac57cfae6061ed5b63 +size 7322362 diff --git a/data/steam_data.py b/data/steam_data.py new file mode 100644 index 0000000000000000000000000000000000000000..055292ce608d50e5a096c92401dffa1a20d368b1 --- /dev/null +++ b/data/steam_data.py @@ -0,0 +1,103 @@ +import torch +import os.path as op +import numpy as np +import pickle as pkl +import torch.utils.data as data + +import pandas as pd +import random + +class SteamData(data.Dataset): + def __init__(self, data_dir=r'data/ref/steam', + stage=None, + cans_num=10, + sep=", ", + no_augment=True): + self.__dict__.update(locals()) + self.aug = (stage=='train') and not no_augment + self.padding_item_id=3581 + self.check_files() + + # 返回session_data['seq']长度 + def __len__(self): + return len(self.session_data['seq']) + + # 获取索引i的样本(批次i) + def __getitem__(self, i): + temp = self.session_data.iloc[i] + candidates = self.negative_sampling(temp['seq_unpad'],temp['next']) + cans_name=[self.item_id2name[can] for can in candidates] + sample = { + 'seq': temp['seq'], + 'seq_name': temp['seq_title'], + 'len_seq': temp['len_seq'], + 'seq_str': self.sep.join(temp['seq_title']), + 'cans': candidates, + 'cans_name': cans_name, + 'cans_str': self.sep.join(cans_name), + 'len_cans': self.cans_num, + 'item_id': temp['next'], + 'item_name': temp['next_item_name'], + 'correct_answer': temp['next_item_name'] + } + return sample + + # 进行负采样, 返回序列ID列表 + def negative_sampling(self,seq_unpad,next_item): + # canset: 所有游戏id中不在seq_unpad中的游戏id + canset=[i for i in list(self.item_id2name.keys()) if i not in seq_unpad and i!=next_item] + # 随机选择cans_num-1个游戏id, 加上next_item + candidates=random.sample(canset, self.cans_num-1)+[next_item] + random.shuffle(candidates) + return candidates + + # 检查并加载数据文件 + def check_files(self): + self.item_id2name=self.get_game_id2name() + if self.stage=='train': + filename="train_data.df" + elif self.stage=='val': + filename="Val_data.df" + elif self.stage=='test': + filename="Test_data.df" + data_path=op.join(self.data_dir, filename) + # 根据data_path和id2name字典加载数据 + self.session_data = self.session_data4frame(data_path, self.item_id2name) + + # 获取游戏id到游戏名的映射, 返回字典 + def get_game_id2name(self): + game_id2name = dict() + item_path=op.join(self.data_dir, 'id2name.txt') + with open(item_path, 'r') as f: + for l in f.readlines(): + ll = l.strip('\n').split('::') + game_id2name[int(ll[0])] = ll[1].strip() + return game_id2name + + # 对数据进行预处理 + def session_data4frame(self, datapath, game_id2name): + # 根据datapath读取pd数据 + train_data = pd.read_pickle(datapath) + train_data = train_data[train_data['len_seq'] >= 3] + # 从序列中移除填充项 + def remove_padding(xx): + x = xx[:] + for i in range(10): + try: + x.remove(self.padding_item_id) + except: + break + return x + # 去除pad的train_data序列 -> train_data['seq_unpad'] + train_data['seq_unpad'] = train_data['seq'].apply(remove_padding) + # 序列号 -> 游戏名 + def seq_to_title(x): + return [game_id2name[x_i] for x_i in x] + # 转换train_data ID序列为游戏名序列 -> train_data['seq_title'] + train_data['seq_title'] = train_data['seq_unpad'].apply(seq_to_title) + # 单个序列 -> 游戏名 + def next_item_title(x): + return game_id2name[x] + # 转换train_data['next'] ID序列为游戏名序列 -> train_data['next_item_name'] + train_data['next_item_name'] = train_data['next'].apply(next_item_title) + return train_data \ No newline at end of file diff --git a/debug/modeling_llama.py b/debug/modeling_llama.py new file mode 100644 index 0000000000000000000000000000000000000000..62ac21c2de9068f9e4d2ce0d7059fea690d0db21 --- /dev/null +++ b/debug/modeling_llama.py @@ -0,0 +1,886 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch LLaMA model.""" +import math +from typing import List, Optional, Tuple, Union + +import torch +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from ...activations import ACT2FN +from ...modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from ...modeling_utils import PreTrainedModel +from ...utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings +from .configuration_llama import LlamaConfig + + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "LlamaConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.tensor(torch.finfo(dtype).min, device=device), device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class LlamaRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + LlamaRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + + # convert into half-precision if necessary + if self.weight.dtype in [torch.float16, torch.bfloat16]: + hidden_states = hidden_states.to(self.weight.dtype) + + return self.weight * hidden_states + + +class LlamaRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float().to(device) / dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self.max_seq_len_cached = max_position_embeddings + t = torch.arange(self.max_seq_len_cached, device=self.inv_freq.device, dtype=self.inv_freq.dtype) + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + # This `if` block is unlikely to be run after we build sin/cos in `__init__`. Keep the logic here just in case. + if seq_len > self.max_seq_len_cached: + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=x.device, dtype=self.inv_freq.dtype) + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1).to(x.device) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False) + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + gather_indices = position_ids[:, None, :, None] # [bs, 1, seq_len, 1] + gather_indices = gather_indices.repeat(1, cos.shape[1], 1, cos.shape[3]) + cos = torch.gather(cos.repeat(gather_indices.shape[0], 1, 1, 1), 2, gather_indices) + sin = torch.gather(sin.repeat(gather_indices.shape[0], 1, 1, 1), 2, gather_indices) + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class LlamaMLP(nn.Module): + def __init__( + self, + hidden_size: int, + intermediate_size: int, + hidden_act: str, + ): + super().__init__() + self.gate_proj = nn.Linear(hidden_size, intermediate_size, bias=False) + self.down_proj = nn.Linear(intermediate_size, hidden_size, bias=False) + self.up_proj = nn.Linear(hidden_size, intermediate_size, bias=False) + self.act_fn = ACT2FN[hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +class LlamaAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: LlamaConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.k_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.v_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self.rotary_emb = LlamaRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = self.k_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + value_states = self.v_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + # [bsz, nh, t, hd] + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz * self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + attn_weights = torch.max(attn_weights, torch.tensor(torch.finfo(attn_weights.dtype).min)) + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2) + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class LlamaDecoderLayer(nn.Module): + def __init__(self, config: LlamaConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = LlamaAttention(config=config) + self.mlp = LlamaMLP( + hidden_size=self.hidden_size, + intermediate_size=config.intermediate_size, + hidden_act=config.hidden_act, + ) + self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +LLAMA_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`LlamaConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaPreTrainedModel(PreTrainedModel): + config_class = LlamaConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["LlamaDecoderLayer"] + _keys_to_ignore_on_load_unexpected = [r"decoder\.version"] + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, LlamaModel): + module.gradient_checkpointing = value + + +LLAMA_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaModel(LlamaPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`] + + Args: + config: LlamaConfig + """ + + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class LlamaForCausalLM(LlamaPreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.model = LlamaModel(config) + + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + # !!! + **kwargs + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, LlamaForCausalLM + + >>> model = LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you consciours? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you consciours? Can you talk to me?\nI'm not consciours, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += (tuple(past_state.index_select(0, beam_idx) for past_state in layer_past),) + return reordered_past + + +@add_start_docstrings( + """ + The LLaMa Model transformer with a sequence classification head on top (linear layer). + + [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + LLAMA_START_DOCSTRING, +) +class LlamaForSequenceClassification(LlamaPreTrainedModel): + _keys_to_ignore_on_load_missing = [r"lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = LlamaModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/debug/utils.py b/debug/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..b54a59cf1ea72ff5d6713d50ee8bcf4c25436455 --- /dev/null +++ b/debug/utils.py @@ -0,0 +1,4032 @@ +# coding=utf-8 +# Copyright 2020 The Google AI Language Team Authors, Facebook AI Research authors and The HuggingFace Inc. team. +# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import inspect +import warnings +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union + +import torch +import torch.distributed as dist +from torch import nn + +from ..deepspeed import is_deepspeed_zero3_enabled +from ..modeling_outputs import CausalLMOutputWithPast, Seq2SeqLMOutput +from ..models.auto import ( + MODEL_FOR_CAUSAL_IMAGE_MODELING_MAPPING, + MODEL_FOR_CAUSAL_LM_MAPPING, + MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING, + MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING, + MODEL_FOR_VISION_2_SEQ_MAPPING, +) +from ..utils import ModelOutput, logging +from .beam_constraints import DisjunctiveConstraint, PhrasalConstraint +from .beam_search import BeamScorer, BeamSearchScorer, ConstrainedBeamSearchScorer +from .configuration_utils import GenerationConfig +from .logits_process import ( + EncoderNoRepeatNGramLogitsProcessor, + EncoderRepetitionPenaltyLogitsProcessor, + EpsilonLogitsWarper, + EtaLogitsWarper, + ExponentialDecayLengthPenalty, + ForcedBOSTokenLogitsProcessor, + ForcedEOSTokenLogitsProcessor, + ForceTokensLogitsProcessor, + HammingDiversityLogitsProcessor, + InfNanRemoveLogitsProcessor, + LogitNormalization, + LogitsProcessorList, + MinLengthLogitsProcessor, + MinNewTokensLengthLogitsProcessor, + NoBadWordsLogitsProcessor, + NoRepeatNGramLogitsProcessor, + PrefixConstrainedLogitsProcessor, + RepetitionPenaltyLogitsProcessor, + SuppressTokensAtBeginLogitsProcessor, + SuppressTokensLogitsProcessor, + TemperatureLogitsWarper, + TopKLogitsWarper, + TopPLogitsWarper, + TypicalLogitsWarper, +) +from .stopping_criteria import ( + MaxLengthCriteria, + MaxTimeCriteria, + StoppingCriteria, + StoppingCriteriaList, + validate_stopping_criteria, +) + + +if TYPE_CHECKING: + from .streamers import BaseStreamer + + +logger = logging.get_logger(__name__) + + +@dataclass +class GreedySearchDecoderOnlyOutput(ModelOutput): + """ + Base class for outputs of decoder-only generation models using greedy search. + + + Args: + sequences (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Processed prediction scores of the language modeling head (scores for each vocabulary token before SoftMax) + at each generation step. Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for + each generated token), with each tensor of shape `(batch_size, config.vocab_size)`. + attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + scores: Optional[Tuple[torch.FloatTensor]] = None + attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class ContrastiveSearchEncoderDecoderOutput(ModelOutput): + """ + Base class for outputs of decoder-only generation models using contrastive search. + + Args: + sequences (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Processed prediction scores of the language modeling head (scores for each vocabulary token before SoftMax) + at each generation step. Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for + each generated token), with each tensor of shape `(batch_size, config.vocab_size)`. + encoder_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple of `torch.FloatTensor` (one for each layer of the decoder) of shape `(batch_size, num_heads, + sequence_length, sequence_length)`. + encoder_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of + shape `(batch_size, sequence_length, hidden_size)`. + decoder_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + cross_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + decoder_hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + scores: Optional[Tuple[torch.FloatTensor]] = None + encoder_attentions: Optional[Tuple[torch.FloatTensor]] = None + encoder_hidden_states: Optional[Tuple[torch.FloatTensor]] = None + decoder_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + cross_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + decoder_hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class ContrastiveSearchDecoderOnlyOutput(ModelOutput): + """ + Base class for outputs of decoder-only generation models using contrastive search. + + Args: + sequences (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when + `config.output_scores=True`): + Processed prediction scores of the language modeling head (scores for each vocabulary token before SoftMax) + at each generation step. Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for + each generated token), with each tensor of shape `(batch_size, config.vocab_size)`. + attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is + passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + scores: Optional[Tuple[torch.FloatTensor]] = None + attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class GreedySearchEncoderDecoderOutput(ModelOutput): + """ + Base class for outputs of encoder-decoder generation models using greedy search. Hidden states and attention + weights of the decoder (respectively the encoder) can be accessed via the encoder_attentions and the + encoder_hidden_states attributes (respectively the decoder_attentions and the decoder_hidden_states attributes) + + + Args: + sequences (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Processed prediction scores of the language modeling head (scores for each vocabulary token before SoftMax) + at each generation step. Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for + each generated token), with each tensor of shape `(batch_size, config.vocab_size)`. + encoder_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple of `torch.FloatTensor` (one for each layer of the decoder) of shape `(batch_size, num_heads, + sequence_length, sequence_length)`. + encoder_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of + shape `(batch_size, sequence_length, hidden_size)`. + decoder_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + cross_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + decoder_hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + scores: Optional[Tuple[torch.FloatTensor]] = None + encoder_attentions: Optional[Tuple[torch.FloatTensor]] = None + encoder_hidden_states: Optional[Tuple[torch.FloatTensor]] = None + decoder_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + cross_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + decoder_hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class SampleDecoderOnlyOutput(ModelOutput): + """ + Base class for outputs of decoder-only generation models using sampling. + + + Args: + sequences (`torch.LongTensor` of shape `(batch_size*num_return_sequences, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Processed prediction scores of the language modeling head (scores for each vocabulary token before SoftMax) + at each generation step. Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for + each generated token), with each tensor of shape `(batch_size*num_return_sequences, config.vocab_size)`. + attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(num_return_sequences*batch_size, num_heads, generated_length, + sequence_length)`. + hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(num_return_sequences*batch_size, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + scores: Optional[Tuple[torch.FloatTensor]] = None + attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class SampleEncoderDecoderOutput(ModelOutput): + """ + Base class for outputs of encoder-decoder generation models using sampling. Hidden states and attention weights of + the decoder (respectively the encoder) can be accessed via the encoder_attentions and the encoder_hidden_states + attributes (respectively the decoder_attentions and the decoder_hidden_states attributes) + + + Args: + sequences (`torch.LongTensor` of shape `(batch_size*num_return_sequences, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Processed prediction scores of the language modeling head (scores for each vocabulary token before SoftMax) + at each generation step. Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for + each generated token), with each tensor of shape `(batch_size*num_return_sequences, config.vocab_size)`. + encoder_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple of `torch.FloatTensor` (one for each layer of the decoder) of shape + `(batch_size*num_return_sequences, num_heads, sequence_length, sequence_length)`. + encoder_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of + shape `(batch_size*num_return_sequences, sequence_length, hidden_size)`. + decoder_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_return_sequences, num_heads, generated_length, + sequence_length)`. + cross_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + decoder_hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_return_sequences, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + scores: Optional[Tuple[torch.FloatTensor]] = None + encoder_attentions: Optional[Tuple[torch.FloatTensor]] = None + encoder_hidden_states: Optional[Tuple[torch.FloatTensor]] = None + decoder_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + cross_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + decoder_hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class BeamSearchDecoderOnlyOutput(ModelOutput): + """ + Base class for outputs of decoder-only generation models using beam search. + + Args: + sequences (`torch.LongTensor` of shape `(batch_size*num_return_sequences, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + sequences_scores (`torch.FloatTensor` of shape `(batch_size*num_return_sequences)`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Final beam scores of the generated `sequences`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam transition scores for each vocabulary token at each generation step. Beam transition scores consisting + of log probabilities of tokens conditioned on log softmax of previously generated tokens in this beam. + Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for each generated token), + with each tensor of shape `(batch_size*num_beams*num_return_sequences, config.vocab_size)`. + beam_indices (`torch.LongTensor`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam indices of generated token id at each generation step. `torch.LongTensor` of shape + `(batch_size*num_return_sequences, sequence_length)`. + attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams, num_heads, generated_length, sequence_length)`. + hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams*num_return_sequences, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + sequences_scores: Optional[torch.FloatTensor] = None + scores: Optional[Tuple[torch.FloatTensor]] = None + beam_indices: Optional[torch.LongTensor] = None + attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class BeamSearchEncoderDecoderOutput(ModelOutput): + """ + Base class for outputs of encoder-decoder generation models using beam search. Hidden states and attention weights + of the decoder (respectively the encoder) can be accessed via the encoder_attentions and the encoder_hidden_states + attributes (respectively the decoder_attentions and the decoder_hidden_states attributes) + + Args: + sequences (`torch.LongTensor` of shape `(batch_size*num_return_sequences, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + sequences_scores (`torch.FloatTensor` of shape `(batch_size*num_return_sequences)`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Final beam scores of the generated `sequences`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam transition scores for each vocabulary token at each generation step. Beam transition scores consisting + of log probabilities of tokens conditioned on log softmax of previously generated tokens in this beam. + Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for each generated token), + with each tensor of shape `(batch_size*num_beams, config.vocab_size)`. + beam_indices (`torch.LongTensor`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam indices of generated token id at each generation step. `torch.LongTensor` of shape + `(batch_size*num_return_sequences, sequence_length)`. + encoder_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple of `torch.FloatTensor` (one for each layer of the decoder) of shape `(batch_size, num_heads, + sequence_length, sequence_length)`. + encoder_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of + shape `(batch_size*num_beams*num_return_sequences, sequence_length, hidden_size)`. + decoder_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams*num_return_sequences, num_heads, generated_length, + sequence_length)`. + cross_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + decoder_hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams*num_return_sequences, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + sequences_scores: Optional[torch.FloatTensor] = None + scores: Optional[Tuple[torch.FloatTensor]] = None + beam_indices: Optional[torch.LongTensor] = None + encoder_attentions: Optional[Tuple[torch.FloatTensor]] = None + encoder_hidden_states: Optional[Tuple[torch.FloatTensor]] = None + decoder_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + cross_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + decoder_hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class BeamSampleDecoderOnlyOutput(ModelOutput): + """ + Base class for outputs of decoder-only generation models using beam sample. + + Args: + sequences (`torch.LongTensor` of shape `(batch_size*num_return_sequences, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + sequences_scores (`torch.FloatTensor` of shape `(batch_size * num_return_sequence)`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Final beam scores of the generated `sequences`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam transition scores for each vocabulary token at each generation step. Beam transition scores consisting + of log probabilities of tokens conditioned on log softmax of previously generated tokens in this beam. + Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for each generated token), + with each tensor of shape `(batch_size*num_beams*num_return_sequences, config.vocab_size)`. + beam_indices (`torch.LongTensor`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam indices of generated token id at each generation step. `torch.LongTensor` of shape + `(batch_size*num_return_sequences, sequence_length)`. + attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams, num_heads, generated_length, sequence_length)`. + hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + sequences_scores: Optional[torch.FloatTensor] = None + scores: Optional[Tuple[torch.FloatTensor]] = None + beam_indices: Optional[torch.LongTensor] = None + attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +@dataclass +class BeamSampleEncoderDecoderOutput(ModelOutput): + """ + Base class for outputs of encoder-decoder generation models using beam sampling. Hidden states and attention + weights of the decoder (respectively the encoder) can be accessed via the encoder_attentions and the + encoder_hidden_states attributes (respectively the decoder_attentions and the decoder_hidden_states attributes) + + Args: + sequences (`torch.LongTensor` of shape `(batch_size*num_beams, sequence_length)`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or shorter + if all batches finished early due to the `eos_token_id`. + sequences_scores (`torch.FloatTensor` of shape `(batch_size * num_return_sequence)`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Final beam scores of the generated `sequences`. + scores (`tuple(torch.FloatTensor)` *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam transition scores for each vocabulary token at each generation step. Beam transition scores consisting + of log probabilities of tokens conditioned on log softmax of previously generated tokens in this beam. + Tuple of `torch.FloatTensor` with up to `max_new_tokens` elements (one element for each generated token), + with each tensor of shape `(batch_size*num_beams, config.vocab_size)`). + beam_indices (`torch.LongTensor`, *optional*, returned when `output_scores=True` is passed or when `config.output_scores=True`): + Beam indices of generated token id at each generation step. `torch.LongTensor` of shape + `(batch_size*num_return_sequences, sequence_length)`. + encoder_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple of `torch.FloatTensor` (one for each layer of the decoder) of shape `(batch_size, num_heads, + sequence_length, sequence_length)`. + encoder_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of + shape `(batch_size*num_beams, sequence_length, hidden_size)`. + decoder_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams, num_heads, generated_length, sequence_length)`. + cross_attentions (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_attentions=True` is passed or `config.output_attentions=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size, num_heads, generated_length, sequence_length)`. + decoder_hidden_states (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): + Tuple (one element for each generated token) of tuples (one element for each layer of the decoder) of + `torch.FloatTensor` of shape `(batch_size*num_beams, generated_length, hidden_size)`. + """ + + sequences: torch.LongTensor = None + sequences_scores: Optional[torch.FloatTensor] = None + scores: Optional[Tuple[torch.FloatTensor]] = None + beam_indices: Optional[torch.LongTensor] = None + encoder_attentions: Optional[Tuple[torch.FloatTensor]] = None + encoder_hidden_states: Optional[Tuple[torch.FloatTensor]] = None + decoder_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + cross_attentions: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + decoder_hidden_states: Optional[Tuple[Tuple[torch.FloatTensor]]] = None + + +GreedySearchOutput = Union[GreedySearchEncoderDecoderOutput, GreedySearchDecoderOnlyOutput] +SampleOutput = Union[SampleEncoderDecoderOutput, SampleDecoderOnlyOutput] +BeamSearchOutput = Union[BeamSearchEncoderDecoderOutput, BeamSearchDecoderOnlyOutput] +BeamSampleOutput = Union[BeamSampleEncoderDecoderOutput, BeamSampleDecoderOnlyOutput] +ContrastiveSearchOutput = Union[ContrastiveSearchEncoderDecoderOutput, ContrastiveSearchDecoderOnlyOutput] +GenerateOutput = Union[GreedySearchOutput, SampleOutput, BeamSearchOutput, BeamSampleOutput, ContrastiveSearchOutput] + + +class GenerationMixin: + """ + A class containing all functions for auto-regressive text generation, to be used as a mixin in [`PreTrainedModel`]. + + The class exposes [`~generation.GenerationMixin.generate`], which can be used for: + - *greedy decoding* by calling [`~generation.GenerationMixin.greedy_search`] if `num_beams=1` and + `do_sample=False` + - *contrastive search* by calling [`~generation.GenerationMixin.contrastive_search`] if `penalty_alpha>0` and + `top_k>1` + - *multinomial sampling* by calling [`~generation.GenerationMixin.sample`] if `num_beams=1` and + `do_sample=True` + - *beam-search decoding* by calling [`~generation.GenerationMixin.beam_search`] if `num_beams>1` and + `do_sample=False` + - *beam-search multinomial sampling* by calling [`~generation.GenerationMixin.beam_sample`] if `num_beams>1` + and `do_sample=True` + - *diverse beam-search decoding* by calling [`~generation.GenerationMixin.group_beam_search`], if `num_beams>1` + and `num_beam_groups>1` + - *constrained beam-search decoding* by calling [`~generation.GenerationMixin.constrained_beam_search`], if + `constraints!=None` or `force_words_ids!=None` + + You do not need to call any of the above methods directly. Pass custom parameter values to 'generate' instead. To + learn more about decoding strategies refer to the [text generation strategies guide](../generation_strategies). + """ + + def prepare_inputs_for_generation(self, *args, **kwargs): + raise NotImplementedError( + "A model class needs to define a `prepare_inputs_for_generation` method in order to use `generate`." + ) + + def _prepare_model_inputs( + self, + inputs: Optional[torch.Tensor] = None, + bos_token_id: Optional[int] = None, + model_kwargs: Optional[Dict[str, torch.Tensor]] = None, + ) -> Tuple[torch.Tensor, Optional[str], Dict[str, torch.Tensor]]: + """ + This function extracts the model-specific `inputs` for generation. + """ + # 1. retrieve all kwargs that are non-None or non-model input related. + # some encoder-decoder models have different names for model and encoder + if ( + self.config.is_encoder_decoder + and hasattr(self, "encoder") + and self.encoder.main_input_name != self.main_input_name + ): + input_name = self.encoder.main_input_name + else: + input_name = self.main_input_name + + model_kwargs = {k: v for k, v in model_kwargs.items() if v is not None or k != input_name} + + # 2. check whether model_input_name is passed as kwarg + # if yes and `inputs` is None use kwarg inputs + inputs_kwarg = model_kwargs.pop(input_name, None) + if inputs_kwarg is not None and inputs is not None: + raise ValueError( + f"`inputs`: {inputs}` were passed alongside {input_name} which is not allowed." + f"Make sure to either pass {inputs} or {input_name}=..." + ) + elif inputs_kwarg is not None: + inputs = inputs_kwarg + + # 3. In the presence of `inputs_embeds` for text models: + # - decoder-only models should complain if the user attempts to pass `inputs_embeds`, but the model + # doesn't have its forwarding implemented. `inputs_embeds` is kept in `model_kwargs` and can coexist with + # input_ids (`inputs_embeds` will be used in the 1st generation step, as opposed to `input_ids`) + # - encoder-decoder models should complain if the user attempts to pass `inputs_embeds` and `input_ids`, and + # pull the former to inputs. It will be used in place of `input_ids` to get the encoder hidden states. + if input_name == "input_ids" and "inputs_embeds" in model_kwargs: + if not self.config.is_encoder_decoder: + has_inputs_embeds_forwarding = "inputs_embeds" in set( + inspect.signature(self.prepare_inputs_for_generation).parameters.keys() + ) + if not has_inputs_embeds_forwarding: + raise ValueError( + f"You passed `inputs_embeds` to `.generate()`, but the model class {self.__class__.__name__} " + "doesn't have its forwarding implemented. See the GPT2 implementation for an example " + "(https://github.com/huggingface/transformers/pull/21405), and feel free to open a PR with it!" + ) + # In this case, `input_ids` is moved to the `model_kwargs`, so a few automations (like the creation of + # the attention mask) can rely on the actual model input. + model_kwargs["input_ids"] = self._maybe_initialize_input_ids_for_generation( + inputs, bos_token_id, model_kwargs=model_kwargs + ) + else: + if inputs is not None: + raise ValueError("You passed `inputs_embeds` and `input_ids` to `.generate()`. Please pick one.") + inputs, input_name = model_kwargs["inputs_embeds"], "inputs_embeds" + + # 4. if `inputs` is still None, try to create `input_ids` from BOS token + inputs = self._maybe_initialize_input_ids_for_generation(inputs, bos_token_id, model_kwargs) + return inputs, input_name, model_kwargs + + def adjust_logits_during_generation(self, logits: torch.FloatTensor, **kwargs) -> torch.FloatTensor: + """ + Implement in subclasses of [`PreTrainedModel`] for custom behavior to adjust the logits in the generate method. + """ + return logits + + def _maybe_initialize_input_ids_for_generation( + self, + inputs: Optional[torch.Tensor] = None, + bos_token_id: Optional[int] = None, + model_kwargs: Optional[Dict[str, torch.Tensor]] = None, + ) -> torch.LongTensor: + """Initializes input ids for generation, if necessary.""" + if inputs is not None: + return inputs + + encoder_outputs = model_kwargs.get("encoder_outputs") + if self.config.is_encoder_decoder and encoder_outputs is not None: + # make dummy input_ids with value -100, as a sanity check ensuring that they won't be used for encoding + shape = encoder_outputs.last_hidden_state.size()[:-1] + return torch.ones(shape, dtype=torch.long, device=self.device) * -100 + + if bos_token_id is None: + raise ValueError("`bos_token_id` has to be defined when no `input_ids` are provided.") + + # If there is some tensor in `model_kwargs`, we can infer the batch size from it. This is helpful with + # soft-prompting or in multimodal implementations built on top of decoder-only language models. + batch_size = 1 + for value in model_kwargs.values(): + if isinstance(value, torch.Tensor): + batch_size = value.shape[0] + break + return torch.ones((batch_size, 1), dtype=torch.long, device=self.device) * bos_token_id + + def _prepare_attention_mask_for_generation( + self, + inputs: torch.Tensor, + pad_token_id: Optional[int], + eos_token_id: Optional[Union[int, List[int]]], + ) -> torch.LongTensor: + is_input_ids = len(inputs.shape) == 2 and inputs.dtype in [torch.int, torch.long] + is_pad_token_in_inputs = (pad_token_id is not None) and (pad_token_id in inputs) + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + is_pad_token_not_equal_to_eos_token_id = (eos_token_id is None) or (pad_token_id not in eos_token_id) + + # Check if input is input_ids and padded -> only then is attention_mask defined + if is_input_ids and is_pad_token_in_inputs and is_pad_token_not_equal_to_eos_token_id: + return inputs.ne(pad_token_id).long() + else: + return torch.ones(inputs.shape[:2], dtype=torch.long, device=inputs.device) + + def _prepare_encoder_decoder_kwargs_for_generation( + self, inputs_tensor: torch.Tensor, model_kwargs, model_input_name: Optional[str] = None + ) -> Dict[str, Any]: + # 1. get encoder + encoder = self.get_encoder() + + # 2. Prepare encoder args and encoder kwargs from model kwargs. + irrelevant_prefix = ["decoder_", "cross_attn", "use_cache"] + encoder_kwargs = { + argument: value + for argument, value in model_kwargs.items() + if not any(argument.startswith(p) for p in irrelevant_prefix) + } + encoder_signature = set(inspect.signature(encoder.forward).parameters) + encoder_accepts_wildcard = "kwargs" in encoder_signature or "model_kwargs" in encoder_signature + if not encoder_accepts_wildcard: + encoder_kwargs = { + argument: value for argument, value in encoder_kwargs.items() if argument in encoder_signature + } + + # 3. make sure that encoder returns `ModelOutput` + model_input_name = model_input_name if model_input_name is not None else self.main_input_name + encoder_kwargs["return_dict"] = True + encoder_kwargs[model_input_name] = inputs_tensor + model_kwargs["encoder_outputs"]: ModelOutput = encoder(**encoder_kwargs) + + return model_kwargs + + def _prepare_decoder_input_ids_for_generation( + self, + batch_size: int, + decoder_start_token_id: int = None, + bos_token_id: int = None, + model_kwargs: Optional[Dict[str, torch.Tensor]] = None, + device: torch.device = None, + ) -> torch.LongTensor: + if model_kwargs is not None and "decoder_input_ids" in model_kwargs: + return model_kwargs.pop("decoder_input_ids") + else: + decoder_start_token_id = self._get_decoder_start_token_id(decoder_start_token_id, bos_token_id) + if device is None: + device = self.device + return torch.ones((batch_size, 1), dtype=torch.long, device=device) * decoder_start_token_id + + def _get_decoder_start_token_id(self, decoder_start_token_id: int = None, bos_token_id: int = None) -> int: + decoder_start_token_id = ( + decoder_start_token_id + if decoder_start_token_id is not None + else self.generation_config.decoder_start_token_id + ) + bos_token_id = bos_token_id if bos_token_id is not None else self.generation_config.bos_token_id + + if decoder_start_token_id is not None: + return decoder_start_token_id + elif bos_token_id is not None: + return bos_token_id + raise ValueError( + "`decoder_start_token_id` or `bos_token_id` has to be defined for encoder-decoder generation." + ) + + @staticmethod + def _expand_inputs_for_generation( + expand_size: int = 1, + is_encoder_decoder: bool = False, + input_ids: Optional[torch.LongTensor] = None, + **model_kwargs, + ) -> Tuple[torch.LongTensor, Dict[str, Any]]: + """Expands tensors from [batch_size, ...] to [batch_size * expand_size, ...]""" + + def _expand_dict_for_generation(dict_to_expand): + for key in dict_to_expand: + if dict_to_expand[key] is not None and isinstance(dict_to_expand[key], torch.Tensor): + dict_to_expand[key] = dict_to_expand[key].repeat_interleave(expand_size, dim=0) + return dict_to_expand + + if input_ids is not None: + input_ids = input_ids.repeat_interleave(expand_size, dim=0) + + model_kwargs = _expand_dict_for_generation(model_kwargs) + + if is_encoder_decoder: + if model_kwargs.get("encoder_outputs") is None: + raise ValueError("If `is_encoder_decoder` is True, make sure that `encoder_outputs` is defined.") + model_kwargs["encoder_outputs"] = _expand_dict_for_generation(model_kwargs["encoder_outputs"]) + + return input_ids, model_kwargs + + def _extract_past_from_model_output(self, outputs: ModelOutput, standardize_cache_format: bool = False): + past_key_values = None + if "past_key_values" in outputs: + past_key_values = outputs.past_key_values + elif "mems" in outputs: + past_key_values = outputs.mems + elif "past_buckets_states" in outputs: + past_key_values = outputs.past_buckets_states + + # Bloom fix: standardizes the cache format when requested + if standardize_cache_format and hasattr(self, "_convert_to_standard_cache"): + batch_size = outputs.logits.shape[0] + past_key_values = self._convert_to_standard_cache(past_key_values, batch_size=batch_size) + return past_key_values + + def _update_model_kwargs_for_generation( + self, + outputs: ModelOutput, + model_kwargs: Dict[str, Any], + is_encoder_decoder: bool = False, + standardize_cache_format: bool = False, + ) -> Dict[str, Any]: + # update past_key_values + model_kwargs["past_key_values"] = self._extract_past_from_model_output( + outputs, standardize_cache_format=standardize_cache_format + ) + + # update token_type_ids with last value + if "token_type_ids" in model_kwargs: + token_type_ids = model_kwargs["token_type_ids"] + model_kwargs["token_type_ids"] = torch.cat([token_type_ids, token_type_ids[:, -1].unsqueeze(-1)], dim=-1) + + if not is_encoder_decoder: + # update attention mask + if "attention_mask" in model_kwargs: + attention_mask = model_kwargs["attention_mask"] + model_kwargs["attention_mask"] = torch.cat( + [attention_mask, attention_mask.new_ones((attention_mask.shape[0], 1))], dim=-1 + ) + else: + # update decoder attention mask + if "decoder_attention_mask" in model_kwargs: + decoder_attention_mask = model_kwargs["decoder_attention_mask"] + model_kwargs["decoder_attention_mask"] = torch.cat( + [decoder_attention_mask, decoder_attention_mask.new_ones((decoder_attention_mask.shape[0], 1))], + dim=-1, + ) + + return model_kwargs + + def _reorder_cache(self, past_key_values, beam_idx): + raise NotImplementedError( + f"Make sure that a `_reorder_cache` function is correctly implemented in {self.__class__.__module__} to" + f" enable beam search for {self.__class__}" + ) + + def _get_logits_warper( + self, + generation_config: GenerationConfig, + ) -> LogitsProcessorList: + """ + This class returns a [`LogitsProcessorList`] list object that contains all relevant [`LogitsWarper`] instances + used for multinomial sampling. + """ + + # instantiate warpers list + warpers = LogitsProcessorList() + + # the following idea is largely copied from this PR: https://github.com/huggingface/transformers/pull/5420/files + # all samplers can be found in `generation_utils_samplers.py` + if generation_config.temperature is not None and generation_config.temperature != 1.0: + warpers.append(TemperatureLogitsWarper(generation_config.temperature)) + min_tokens_to_keep = 2 if generation_config.num_beams > 1 else 1 + if generation_config.top_k is not None and generation_config.top_k != 0: + warpers.append(TopKLogitsWarper(top_k=generation_config.top_k, min_tokens_to_keep=min_tokens_to_keep)) + if generation_config.top_p is not None and generation_config.top_p < 1.0: + warpers.append(TopPLogitsWarper(top_p=generation_config.top_p, min_tokens_to_keep=min_tokens_to_keep)) + if generation_config.typical_p is not None and generation_config.typical_p < 1.0: + warpers.append( + TypicalLogitsWarper(mass=generation_config.typical_p, min_tokens_to_keep=min_tokens_to_keep) + ) + if generation_config.epsilon_cutoff is not None and 0.0 < generation_config.epsilon_cutoff < 1.0: + warpers.append( + EpsilonLogitsWarper(epsilon=generation_config.epsilon_cutoff, min_tokens_to_keep=min_tokens_to_keep) + ) + if generation_config.eta_cutoff is not None and 0.0 < generation_config.eta_cutoff < 1.0: + warpers.append( + EtaLogitsWarper(epsilon=generation_config.eta_cutoff, min_tokens_to_keep=min_tokens_to_keep) + ) + # `LogitNormalization` should always be the last logit processor, when present + if generation_config.renormalize_logits is True: + warpers.append(LogitNormalization()) + return warpers + + def _get_logits_processor( + self, + generation_config: GenerationConfig, + input_ids_seq_length: int, + encoder_input_ids: torch.LongTensor, + prefix_allowed_tokens_fn: Callable[[int, torch.Tensor], List[int]], + logits_processor: Optional[LogitsProcessorList], + ) -> LogitsProcessorList: + """ + This class returns a [`LogitsProcessorList`] list object that contains all relevant [`LogitsProcessor`] + instances used to modify the scores of the language model head. + """ + # instantiate processors list + processors = LogitsProcessorList() + + # the following idea is largely copied from this PR: https://github.com/huggingface/transformers/pull/5420/files + # all samplers can be found in `generation_utils_samplers.py` + if generation_config.diversity_penalty is not None and generation_config.diversity_penalty > 0.0: + processors.append( + HammingDiversityLogitsProcessor( + diversity_penalty=generation_config.diversity_penalty, + num_beams=generation_config.num_beams, + num_beam_groups=generation_config.num_beam_groups, + ) + ) + if ( + generation_config.encoder_repetition_penalty is not None + and generation_config.encoder_repetition_penalty != 1.0 + ): + processors.append( + EncoderRepetitionPenaltyLogitsProcessor( + penalty=generation_config.encoder_repetition_penalty, encoder_input_ids=encoder_input_ids + ) + ) + if generation_config.repetition_penalty is not None and generation_config.repetition_penalty != 1.0: + processors.append(RepetitionPenaltyLogitsProcessor(penalty=generation_config.repetition_penalty)) + if generation_config.no_repeat_ngram_size is not None and generation_config.no_repeat_ngram_size > 0: + processors.append(NoRepeatNGramLogitsProcessor(generation_config.no_repeat_ngram_size)) + if ( + generation_config.encoder_no_repeat_ngram_size is not None + and generation_config.encoder_no_repeat_ngram_size > 0 + ): + if self.config.is_encoder_decoder: + processors.append( + EncoderNoRepeatNGramLogitsProcessor( + generation_config.encoder_no_repeat_ngram_size, encoder_input_ids + ) + ) + else: + raise ValueError( + "It's impossible to use `encoder_no_repeat_ngram_size` with decoder-only architecture" + ) + if generation_config.bad_words_ids is not None: + processors.append( + NoBadWordsLogitsProcessor(generation_config.bad_words_ids, generation_config.eos_token_id) + ) + if ( + generation_config.min_length is not None + and generation_config.eos_token_id is not None + and generation_config.min_length > 0 + ): + processors.append(MinLengthLogitsProcessor(generation_config.min_length, generation_config.eos_token_id)) + if ( + generation_config.min_new_tokens is not None + and generation_config.eos_token_id is not None + and generation_config.min_new_tokens > 0 + ): + processors.append( + MinNewTokensLengthLogitsProcessor( + input_ids_seq_length, generation_config.min_new_tokens, generation_config.eos_token_id + ) + ) + if prefix_allowed_tokens_fn is not None: + processors.append( + PrefixConstrainedLogitsProcessor( + prefix_allowed_tokens_fn, generation_config.num_beams // generation_config.num_beam_groups + ) + ) + if generation_config.forced_bos_token_id is not None: + processors.append(ForcedBOSTokenLogitsProcessor(generation_config.forced_bos_token_id)) + if generation_config.forced_eos_token_id is not None: + processors.append( + ForcedEOSTokenLogitsProcessor(generation_config.max_length, generation_config.forced_eos_token_id) + ) + if generation_config.remove_invalid_values is True: + processors.append(InfNanRemoveLogitsProcessor()) + if generation_config.exponential_decay_length_penalty is not None: + processors.append( + ExponentialDecayLengthPenalty( + generation_config.exponential_decay_length_penalty, + generation_config.eos_token_id, + input_ids_seq_length, + ) + ) + if generation_config.suppress_tokens is not None: + processors.append(SuppressTokensLogitsProcessor(generation_config.suppress_tokens)) + if generation_config.begin_suppress_tokens is not None: + begin_index = input_ids_seq_length + begin_index = ( + begin_index + if (input_ids_seq_length > 1 or generation_config.forced_bos_token_id is None) + else begin_index + 1 + ) + if generation_config.forced_decoder_ids is not None: + # generation starts after the last token that is forced + begin_index += generation_config.forced_decoder_ids[-1][0] + processors.append( + SuppressTokensAtBeginLogitsProcessor(generation_config.begin_suppress_tokens, begin_index) + ) + if generation_config.forced_decoder_ids is not None: + processors.append(ForceTokensLogitsProcessor(generation_config.forced_decoder_ids)) + processors = self._merge_criteria_processor_list(processors, logits_processor) + # `LogitNormalization` should always be the last logit processor, when present + if generation_config.renormalize_logits is True: + processors.append(LogitNormalization()) + return processors + + def _get_stopping_criteria( + self, generation_config: GenerationConfig, stopping_criteria: Optional[StoppingCriteriaList] + ) -> StoppingCriteriaList: + criteria = StoppingCriteriaList() + if generation_config.max_length is not None: + criteria.append(MaxLengthCriteria(max_length=generation_config.max_length)) + if generation_config.max_time is not None: + criteria.append(MaxTimeCriteria(max_time=generation_config.max_time)) + criteria = self._merge_criteria_processor_list(criteria, stopping_criteria) + return criteria + + def _merge_criteria_processor_list( + self, + default_list: Union[LogitsProcessorList, StoppingCriteriaList], + custom_list: Union[LogitsProcessorList, StoppingCriteriaList], + ) -> Union[LogitsProcessorList, StoppingCriteriaList]: + if len(custom_list) == 0: + return default_list + for default in default_list: + for custom in custom_list: + if type(custom) is type(default): + object_type = "stopping criteria" if isinstance(custom, StoppingCriteria) else "logits processor" + raise ValueError( + f"A custom {object_type} of type {type(custom)} with values {custom} has been passed to" + f" `generate`, but it has already been created with the values {default}. {default} has been" + " created by passing the corresponding arguments to generate or by the model's config default" + f" values. If you just want to change the default values of {object_type} consider passing" + f" them as arguments to `generate` instead of using a custom {object_type}." + ) + default_list.extend(custom_list) + return default_list + + def compute_transition_scores( + self, + sequences: torch.Tensor, + scores: Tuple[torch.Tensor], + beam_indices: Optional[torch.Tensor] = None, + normalize_logits: bool = False, + ) -> torch.Tensor: + """ + Computes the transition scores of sequences given the generation scores (and beam indices, if beam search was + used). This is a convenient method to quicky obtain the scores of the selected tokens at generation time. + + Parameters: + sequences (`torch.LongTensor`): + The generated sequences. The second dimension (sequence_length) is either equal to `max_length` or + shorter if all batches finished early due to the `eos_token_id`. + scores (`tuple(torch.FloatTensor)`): + Transition scores for each vocabulary token at each generation step. Beam transition scores consisting + of log probabilities of tokens conditioned on log softmax of previously generated tokens Tuple of + `torch.FloatTensor` with up to `max_new_tokens` elements (one element for each generated token), with + each tensor of shape `(batch_size*num_beams, config.vocab_size)`. + beam_indices (`torch.LongTensor`, *optional*): + Beam indices of generated token id at each generation step. `torch.LongTensor` of shape + `(batch_size*num_return_sequences, sequence_length)`. Only required if a `num_beams>1` at + generate-time. + normalize_logits (`bool`, *optional*, defaults to `False`): + Whether to normalize the logits (which, for legacy reasons, may be unnormalized). + + Return: + `torch.Tensor`: A `torch.Tensor` of shape `(batch_size*num_return_sequences, sequence_length)` containing + the transition scores (logits) + + Examples: + + ```python + >>> from transformers import GPT2Tokenizer, AutoModelForCausalLM + >>> import numpy as np + + >>> tokenizer = GPT2Tokenizer.from_pretrained("gpt2") + >>> model = AutoModelForCausalLM.from_pretrained("gpt2") + >>> tokenizer.pad_token_id = tokenizer.eos_token_id + >>> inputs = tokenizer(["Today is"], return_tensors="pt") + + >>> # Example 1: Print the scores for each token generated with Greedy Search + >>> outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True) + >>> transition_scores = model.compute_transition_scores( + ... outputs.sequences, outputs.scores, normalize_logits=True + ... ) + >>> # input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for + >>> # encoder-decoder models, like BART or T5. + >>> input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1] + >>> generated_tokens = outputs.sequences[:, input_length:] + >>> for tok, score in zip(generated_tokens[0], transition_scores[0]): + ... # | token | token string | logits | probability + ... print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}") + | 262 | the | -1.414 | 24.33% + | 1110 | day | -2.609 | 7.36% + | 618 | when | -2.010 | 13.40% + | 356 | we | -1.859 | 15.58% + | 460 | can | -2.508 | 8.14% + + >>> # Example 2: Reconstruct the sequence scores from Beam Search + >>> outputs = model.generate( + ... **inputs, + ... max_new_tokens=5, + ... num_beams=4, + ... num_return_sequences=4, + ... return_dict_in_generate=True, + ... output_scores=True, + ... ) + >>> transition_scores = model.compute_transition_scores( + ... outputs.sequences, outputs.scores, outputs.beam_indices, normalize_logits=False + ... ) + >>> # If you sum the generated tokens' scores and apply the length penalty, you'll get the sequence scores. + >>> # Tip: recomputing the scores is only guaranteed to match with `normalize_logits=False`. Depending on the + >>> # use case, you might want to recompute it with `normalize_logits=True`. + >>> output_length = input_length + np.sum(transition_scores.numpy() < 0, axis=1) + >>> length_penalty = model.generation_config.length_penalty + >>> reconstructed_scores = transition_scores.sum(axis=1) / (output_length**length_penalty) + >>> print(np.allclose(outputs.sequences_scores, reconstructed_scores)) + True + ```""" + # 1. In absence of `beam_indices`, we can assume that we come from e.g. greedy search, which is equivalent + # to a beam search approach were the first (and only) beam is always selected + if beam_indices is None: + beam_indices = torch.arange(scores[0].shape[0]).view(-1, 1).to(sequences.device) + beam_indices = beam_indices.expand(-1, len(scores)) + + # 2. reshape scores as [batch_size*vocab_size, # generation steps] with # generation steps being + # seq_len - input_length + scores = torch.stack(scores).reshape(len(scores), -1).transpose(0, 1) + + # 3. Optionally normalize the logits (across the vocab dimension) + if normalize_logits: + scores = scores.reshape(-1, self.config.vocab_size, scores.shape[-1]) + scores = torch.nn.functional.log_softmax(scores, dim=1) + scores = scores.reshape(-1, scores.shape[-1]) + + # 4. cut beam_indices to longest beam length + beam_indices_mask = beam_indices < 0 + max_beam_length = (1 - beam_indices_mask.long()).sum(-1).max() + beam_indices = beam_indices.clone()[:, :max_beam_length] + beam_indices_mask = beam_indices_mask[:, :max_beam_length] + + # 5. Set indices of beams that finished early to 0; such indices will be masked correctly afterwards + beam_indices[beam_indices_mask] = 0 + + # 6. multiply beam_indices with vocab size to gather correctly from scores + beam_sequence_indices = beam_indices * self.config.vocab_size + + # 7. Define which indices contributed to scores + cut_idx = sequences.shape[-1] - max_beam_length + indices = sequences[:, cut_idx:] + beam_sequence_indices + + # 8. Compute scores + transition_scores = scores.gather(0, indices) + + # 9. Mask out transition_scores of beams that stopped early + transition_scores[beam_indices_mask] = 0 + + return transition_scores + + def _validate_model_class(self): + """ + Confirms that the model class is compatible with generation. If not, raises an exception that points to the + right class to use. + """ + if not self.can_generate(): + generate_compatible_mappings = [ + MODEL_FOR_CAUSAL_LM_MAPPING, + MODEL_FOR_CAUSAL_IMAGE_MODELING_MAPPING, + MODEL_FOR_VISION_2_SEQ_MAPPING, + MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING, + MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING, + ] + generate_compatible_classes = set() + for model_mapping in generate_compatible_mappings: + supported_models = model_mapping.get(type(self.config), default=None) + if supported_models is not None: + generate_compatible_classes.add(supported_models.__name__) + exception_message = ( + f"The current model class ({self.__class__.__name__}) is not compatible with `.generate()`, as " + "it doesn't have a language model head." + ) + if generate_compatible_classes: + exception_message += f" Please use one of the following classes instead: {generate_compatible_classes}" + raise TypeError(exception_message) + + def _validate_model_kwargs(self, model_kwargs: Dict[str, Any]): + """Validates model kwargs for generation. Generate argument typos will also be caught here.""" + # Excludes arguments that are handled before calling any model function + if self.config.is_encoder_decoder: + for key in ["decoder_input_ids"]: + model_kwargs.pop(key, None) + + unused_model_args = [] + model_args = set(inspect.signature(self.prepare_inputs_for_generation).parameters) + # `kwargs`/`model_kwargs` is often used to handle optional forward pass inputs like `attention_mask`. If + # `prepare_inputs_for_generation` doesn't accept them, then a stricter check can be made ;) + if "kwargs" in model_args or "model_kwargs" in model_args: + model_args |= set(inspect.signature(self.forward).parameters) + for key, value in model_kwargs.items(): + # !!! + if value is not None and key not in model_args and key not in ['user_embeds', 'gate_weights', 'domain_id']: + unused_model_args.append(key) + + if unused_model_args: + raise ValueError( + f"The following `model_kwargs` are not used by the model: {unused_model_args} (note: typos in the" + " generate arguments will also show up in this list)" + ) + + @torch.no_grad() + def generate( + self, + inputs: Optional[torch.Tensor] = None, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[Callable[[int, torch.Tensor], List[int]]] = None, + synced_gpus: Optional[bool] = None, + streamer: Optional["BaseStreamer"] = None, + **kwargs, + ) -> Union[GenerateOutput, torch.LongTensor]: + r""" + + Generates sequences of token ids for models with a language modeling head. + + + + Most generation-controlling parameters are set in `generation_config` which, if not passed, will be set to the + model's default generation configuration. You can override any `generation_config` by passing the corresponding + parameters to generate(), e.g. `.generate(inputs, num_beams=4, do_sample=True)`. + + For an overview of generation strategies and code examples, check out the [following + guide](../generation_strategies). + + + + Parameters: + inputs (`torch.Tensor` of varying shape depending on the modality, *optional*): + The sequence used as a prompt for the generation or as model inputs to the encoder. If `None` the + method initializes it with `bos_token_id` and a batch size of 1. For decoder-only models `inputs` + should of in the format of `input_ids`. For encoder-decoder models *inputs* can represent any of + `input_ids`, `input_values`, `input_features`, or `pixel_values`. + generation_config (`~generation.GenerationConfig`, *optional*): + The generation configuration to be used as base parametrization for the generation call. `**kwargs` + passed to generate matching the attributes of `generation_config` will override them. If + `generation_config` is not provided, the default will be used, which had the following loading + priority: 1) from the `generation_config.json` model file, if it exists; 2) from the model + configuration. Please note that unspecified parameters will inherit [`~generation.GenerationConfig`]'s + default values, whose documentation should be checked to parameterize generation. + logits_processor (`LogitsProcessorList`, *optional*): + Custom logits processors that complement the default logits processors built from arguments and + generation config. If a logit processor is passed that is already created with the arguments or a + generation config an error is thrown. This feature is intended for advanced users. + stopping_criteria (`StoppingCriteriaList`, *optional*): + Custom stopping criteria that complement the default stopping criteria built from arguments and a + generation config. If a stopping criteria is passed that is already created with the arguments or a + generation config an error is thrown. This feature is intended for advanced users. + prefix_allowed_tokens_fn (`Callable[[int, torch.Tensor], List[int]]`, *optional*): + If provided, this function constraints the beam search to allowed tokens only at each step. If not + provided no constraint is applied. This function takes 2 arguments: the batch ID `batch_id` and + `input_ids`. It has to return a list with the allowed tokens for the next generation step conditioned + on the batch ID `batch_id` and the previously generated tokens `inputs_ids`. This argument is useful + for constrained generation conditioned on the prefix, as described in [Autoregressive Entity + Retrieval](https://arxiv.org/abs/2010.00904). + synced_gpus (`bool`, *optional*): + Whether to continue running the while loop until max_length. Unless overridden this flag will be set to + `True` under DeepSpeed ZeRO Stage 3 multiple GPUs environment to avoid hanging if one GPU finished + generating before other GPUs. Otherwise it'll be set to `False`. + streamer (`BaseStreamer`, *optional*): + Streamer object that will be used to stream the generated sequences. Generated tokens are passed + through `streamer.put(token_ids)` and the streamer is responsible for any further processing. + + kwargs: + Ad hoc parametrization of `generate_config` and/or additional model-specific kwargs that will be + forwarded to the `forward` function of the model. If the model is an encoder-decoder model, encoder + specific kwargs should not be prefixed and decoder specific kwargs should be prefixed with *decoder_*. + + Return: + [`~utils.ModelOutput`] or `torch.LongTensor`: A [`~utils.ModelOutput`] (if `return_dict_in_generate=True` + or when `config.return_dict_in_generate=True`) or a `torch.FloatTensor`. + + If the model is *not* an encoder-decoder model (`model.config.is_encoder_decoder=False`), the possible + [`~utils.ModelOutput`] types are: + + - [`~generation.GreedySearchDecoderOnlyOutput`], + - [`~generation.SampleDecoderOnlyOutput`], + - [`~generation.BeamSearchDecoderOnlyOutput`], + - [`~generation.BeamSampleDecoderOnlyOutput`] + + If the model is an encoder-decoder model (`model.config.is_encoder_decoder=True`), the possible + [`~utils.ModelOutput`] types are: + + - [`~generation.GreedySearchEncoderDecoderOutput`], + - [`~generation.SampleEncoderDecoderOutput`], + - [`~generation.BeamSearchEncoderDecoderOutput`], + - [`~generation.BeamSampleEncoderDecoderOutput`] + """ + + if synced_gpus is None: + if is_deepspeed_zero3_enabled() and dist.get_world_size() > 1: + synced_gpus = True + else: + synced_gpus = False + + # 1. Handle `generation_config` and kwargs that might update it, and validate the `.generate()` call + self._validate_model_class() + + # priority: `generation_config` argument > `model.generation_config` (the default generation config) + if generation_config is None: + # legacy: users may modify the model configuration to control generation -- update the generation config + # model attribute accordingly, if it was created from the model config + if self.generation_config._from_model_config: + new_generation_config = GenerationConfig.from_model_config(self.config) + if new_generation_config != self.generation_config: + warnings.warn( + "You have modified the pretrained model configuration to control generation. This is a" + " deprecated strategy to control generation and will be removed soon, in a future version." + " Please use a generation configuration file (see" + " https://huggingface.co/docs/transformers/main_classes/text_generation)" + ) + self.generation_config = new_generation_config + generation_config = self.generation_config + + generation_config = copy.deepcopy(generation_config) + model_kwargs = generation_config.update(**kwargs) # All unused kwargs must be model kwargs + generation_config.validate() + # !!! + self._validate_model_kwargs(model_kwargs.copy()) + + # 2. Set generation parameters if not already defined + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + + if generation_config.pad_token_id is None and generation_config.eos_token_id is not None: + if model_kwargs.get("attention_mask", None) is None: + logger.warning( + "The attention mask and the pad token id were not set. As a consequence, you may observe " + "unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results." + ) + eos_token_id = generation_config.eos_token_id + if isinstance(eos_token_id, list): + eos_token_id = eos_token_id[0] + logger.warning(f"Setting `pad_token_id` to `eos_token_id`:{eos_token_id} for open-end generation.") + generation_config.pad_token_id = eos_token_id + + # 3. Define model inputs + # inputs_tensor has to be defined + # model_input_name is defined if model-specific keyword input is passed + # otherwise model_input_name is None + # all model-specific keyword inputs are removed from `model_kwargs` + inputs_tensor, model_input_name, model_kwargs = self._prepare_model_inputs( + inputs, generation_config.bos_token_id, model_kwargs + ) + batch_size = inputs_tensor.shape[0] + + # 4. Define other model kwargs + model_kwargs["output_attentions"] = generation_config.output_attentions + model_kwargs["output_hidden_states"] = generation_config.output_hidden_states + model_kwargs["use_cache"] = generation_config.use_cache + + accepts_attention_mask = "attention_mask" in set(inspect.signature(self.forward).parameters.keys()) + requires_attention_mask = "encoder_outputs" not in model_kwargs + + if model_kwargs.get("attention_mask", None) is None and requires_attention_mask and accepts_attention_mask: + model_kwargs["attention_mask"] = self._prepare_attention_mask_for_generation( + inputs_tensor, generation_config.pad_token_id, generation_config.eos_token_id + ) + + # decoder-only models should use left-padding for generation + if not self.config.is_encoder_decoder: + if ( + generation_config.pad_token_id is not None + and torch.sum(inputs_tensor[:, -1] == generation_config.pad_token_id) > 0 + ): + logger.warning( + "A decoder-only architecture is being used, but right-padding was detected! For correct " + "generation results, please set `padding_side='left'` when initializing the tokenizer." + ) + + if self.config.is_encoder_decoder and "encoder_outputs" not in model_kwargs: + # if model is encoder decoder encoder_outputs are created + # and added to `model_kwargs` + model_kwargs = self._prepare_encoder_decoder_kwargs_for_generation( + inputs_tensor, model_kwargs, model_input_name + ) + + # 5. Prepare `input_ids` which will be used for auto-regressive generation + if self.config.is_encoder_decoder: + input_ids = self._prepare_decoder_input_ids_for_generation( + batch_size, + decoder_start_token_id=generation_config.decoder_start_token_id, + bos_token_id=generation_config.bos_token_id, + model_kwargs=model_kwargs, + device=inputs_tensor.device, + ) + + # conditional generation for multi-modal models. + if "input_ids" in model_kwargs and model_input_name == "pixel_values": + input_ids = torch.cat([input_ids, model_kwargs.pop("input_ids")], dim=-1) + else: + input_ids = inputs_tensor if model_input_name == "input_ids" else model_kwargs.pop("input_ids") + + if streamer is not None: + streamer.put(input_ids.cpu()) + + # 6. Prepare `max_length` depending on other stopping criteria. + input_ids_seq_length = input_ids.shape[-1] + has_default_max_length = kwargs.get("max_length") is None and generation_config.max_length is not None + if has_default_max_length and generation_config.max_new_tokens is None: + warnings.warn( + f"Using `max_length`'s default ({generation_config.max_length}) to control the generation length. " + "This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we" + " recommend using `max_new_tokens` to control the maximum length of the generation.", + UserWarning, + ) + elif generation_config.max_new_tokens is not None: + generation_config.max_length = generation_config.max_new_tokens + input_ids_seq_length + if not has_default_max_length: + logger.warn( + f"Both `max_new_tokens` (={generation_config.max_new_tokens}) and `max_length`(=" + f"{generation_config.max_length}) seem to have been set. `max_new_tokens` will take precedence. " + "Please refer to the documentation for more information. " + "(https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)", + UserWarning, + ) + + if generation_config.min_length is not None and generation_config.min_length > generation_config.max_length: + raise ValueError( + f"Unfeasible length constraints: the minimum length ({generation_config.min_length}) is larger than" + f" the maximum length ({generation_config.max_length})" + ) + if input_ids_seq_length >= generation_config.max_length: + input_ids_string = "decoder_input_ids" if self.config.is_encoder_decoder else "input_ids" + logger.warning( + f"Input length of {input_ids_string} is {input_ids_seq_length}, but `max_length` is set to" + f" {generation_config.max_length}. This can lead to unexpected behavior. You should consider" + " increasing `max_new_tokens`." + ) + + # 7. determine generation mode + is_constraint_gen_mode = ( + generation_config.constraints is not None or generation_config.force_words_ids is not None + ) + + is_contrastive_search_gen_mode = ( + (generation_config.num_beams == 1) + and generation_config.top_k is not None + and generation_config.top_k > 1 + and generation_config.do_sample is False + and generation_config.penalty_alpha is not None + and generation_config.penalty_alpha > 0 + ) + + is_greedy_gen_mode = ( + (generation_config.num_beams == 1) + and (generation_config.num_beam_groups == 1) + and generation_config.do_sample is False + and not is_constraint_gen_mode + and not is_contrastive_search_gen_mode + ) + is_sample_gen_mode = ( + (generation_config.num_beams == 1) + and (generation_config.num_beam_groups == 1) + and generation_config.do_sample is True + and not is_constraint_gen_mode + and not is_contrastive_search_gen_mode + ) + is_beam_gen_mode = ( + (generation_config.num_beams > 1) + and (generation_config.num_beam_groups == 1) + and generation_config.do_sample is False + and not is_constraint_gen_mode + and not is_contrastive_search_gen_mode + ) + is_beam_sample_gen_mode = ( + (generation_config.num_beams > 1) + and (generation_config.num_beam_groups == 1) + and generation_config.do_sample is True + and not is_constraint_gen_mode + and not is_contrastive_search_gen_mode + ) + is_group_beam_gen_mode = ( + (generation_config.num_beams > 1) + and (generation_config.num_beam_groups > 1) + and not is_constraint_gen_mode + and not is_contrastive_search_gen_mode + ) + + if generation_config.num_beam_groups > generation_config.num_beams: + raise ValueError("`num_beam_groups` has to be smaller or equal to `num_beams`") + if is_group_beam_gen_mode and generation_config.do_sample is True: + raise ValueError( + "Diverse beam search cannot be used in sampling mode. Make sure that `do_sample` is set to `False`." + ) + + if streamer is not None and (generation_config.num_beams > 1): + raise ValueError( + "`streamer` cannot be used with beam search (yet!). Make sure that `num_beams` is set to 1." + ) + + if self.device.type != input_ids.device.type: + warnings.warn( + "You are calling .generate() with the `input_ids` being on a device type different" + f" than your model's device. `input_ids` is on {input_ids.device.type}, whereas the model" + f" is on {self.device.type}. You may experience unexpected behaviors or slower generation." + " Please make sure that you have put `input_ids` to the" + f" correct device by calling for example input_ids = input_ids.to('{self.device.type}') before" + " running `.generate()`.", + UserWarning, + ) + + # 8. prepare distribution pre_processing samplers + logits_processor = self._get_logits_processor( + generation_config=generation_config, + input_ids_seq_length=input_ids_seq_length, + encoder_input_ids=inputs_tensor, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + logits_processor=logits_processor, + ) + + # 9. prepare stopping criteria + stopping_criteria = self._get_stopping_criteria( + generation_config=generation_config, stopping_criteria=stopping_criteria + ) + # 10. go into different generation modes + if is_greedy_gen_mode: + if generation_config.num_return_sequences > 1: + raise ValueError( + f"num_return_sequences has to be 1, but is {generation_config.num_return_sequences} when doing" + " greedy search." + ) + + # 11. run greedy search + return self.greedy_search( + input_ids, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + streamer=streamer, + **model_kwargs, + ) + + elif is_contrastive_search_gen_mode: + if generation_config.num_return_sequences > 1: + raise ValueError( + f"num_return_sequences has to be 1, but is {generation_config.num_return_sequences} when doing" + " contrastive search." + ) + + return self.contrastive_search( + input_ids, + top_k=generation_config.top_k, + penalty_alpha=generation_config.penalty_alpha, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + streamer=streamer, + **model_kwargs, + ) + + elif is_sample_gen_mode: + # 11. prepare logits warper + logits_warper = self._get_logits_warper(generation_config) + + # 12. expand input_ids with `num_return_sequences` additional sequences per batch + input_ids, model_kwargs = self._expand_inputs_for_generation( + input_ids=input_ids, + expand_size=generation_config.num_return_sequences, + is_encoder_decoder=self.config.is_encoder_decoder, + **model_kwargs, + ) + + # 13. run sample + return self.sample( + input_ids, + logits_processor=logits_processor, + logits_warper=logits_warper, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + streamer=streamer, + **model_kwargs, + ) + + elif is_beam_gen_mode: + if generation_config.num_return_sequences > generation_config.num_beams: + raise ValueError("`num_return_sequences` has to be smaller or equal to `num_beams`.") + + if stopping_criteria.max_length is None: + raise ValueError("`max_length` needs to be a stopping_criteria for now.") + + # 11. prepare beam search scorer + beam_scorer = BeamSearchScorer( + batch_size=batch_size, + num_beams=generation_config.num_beams, + device=inputs_tensor.device, + length_penalty=generation_config.length_penalty, + do_early_stopping=generation_config.early_stopping, + num_beam_hyps_to_keep=generation_config.num_return_sequences, + max_length=generation_config.max_length, + ) + # 12. interleave input_ids with `num_beams` additional sequences per batch + input_ids, model_kwargs = self._expand_inputs_for_generation( + input_ids=input_ids, + expand_size=generation_config.num_beams, + is_encoder_decoder=self.config.is_encoder_decoder, + **model_kwargs, + ) + # 13. run beam search + return self.beam_search( + input_ids, + beam_scorer, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + **model_kwargs, + ) + + elif is_beam_sample_gen_mode: + # 11. prepare logits warper + logits_warper = self._get_logits_warper(generation_config) + + if stopping_criteria.max_length is None: + raise ValueError("`max_length` needs to be a stopping_criteria for now.") + # 12. prepare beam search scorer + beam_scorer = BeamSearchScorer( + batch_size=batch_size * generation_config.num_return_sequences, + num_beams=generation_config.num_beams, + device=inputs_tensor.device, + length_penalty=generation_config.length_penalty, + do_early_stopping=generation_config.early_stopping, + max_length=generation_config.max_length, + ) + + # 13. interleave input_ids with `num_beams` additional sequences per batch + input_ids, model_kwargs = self._expand_inputs_for_generation( + input_ids=input_ids, + expand_size=generation_config.num_beams * generation_config.num_return_sequences, + is_encoder_decoder=self.config.is_encoder_decoder, + **model_kwargs, + ) + + # 14. run beam sample + return self.beam_sample( + input_ids, + beam_scorer, + logits_processor=logits_processor, + logits_warper=logits_warper, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + **model_kwargs, + ) + + elif is_group_beam_gen_mode: + if generation_config.num_return_sequences > generation_config.num_beams: + raise ValueError("`num_return_sequences` has to be smaller or equal to `num_beams`.") + + if generation_config.num_beams % generation_config.num_beam_groups != 0: + raise ValueError("`num_beams` should be divisible by `num_beam_groups` for group beam search.") + + if stopping_criteria.max_length is None: + raise ValueError("`max_length` needs to be a stopping_criteria for now.") + + has_default_typical_p = kwargs.get("typical_p") is None and generation_config.typical_p == 1.0 + if not has_default_typical_p: + raise ValueError("Decoder argument `typical_p` is not supported with beam groups.") + + # 11. prepare beam search scorer + beam_scorer = BeamSearchScorer( + batch_size=batch_size, + num_beams=generation_config.num_beams, + device=inputs_tensor.device, + length_penalty=generation_config.length_penalty, + do_early_stopping=generation_config.early_stopping, + num_beam_hyps_to_keep=generation_config.num_return_sequences, + num_beam_groups=generation_config.num_beam_groups, + max_length=generation_config.max_length, + ) + # 12. interleave input_ids with `num_beams` additional sequences per batch + input_ids, model_kwargs = self._expand_inputs_for_generation( + input_ids=input_ids, + expand_size=generation_config.num_beams, + is_encoder_decoder=self.config.is_encoder_decoder, + **model_kwargs, + ) + # 13. run beam search + return self.group_beam_search( + input_ids, + beam_scorer, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + **model_kwargs, + ) + + elif is_constraint_gen_mode: + if generation_config.num_return_sequences > generation_config.num_beams: + raise ValueError("`num_return_sequences` has to be smaller or equal to `num_beams`.") + + if stopping_criteria.max_length is None: + raise ValueError("`max_length` needs to be a stopping_criteria for now.") + + if generation_config.num_beams <= 1: + raise ValueError("`num_beams` needs to be greater than 1 for constrained generation.") + + if generation_config.do_sample: + raise ValueError("`do_sample` needs to be false for constrained generation.") + + if generation_config.num_beam_groups is not None and generation_config.num_beam_groups > 1: + raise ValueError("`num_beam_groups` not supported yet for constrained generation.") + + final_constraints = [] + if generation_config.constraints is not None: + final_constraints = generation_config.constraints + + if generation_config.force_words_ids is not None: + + def typeerror(): + raise ValueError( + "`force_words_ids` has to either be a `List[List[List[int]]]` or `List[List[int]]`" + f"of positive integers, but is {generation_config.force_words_ids}." + ) + + if ( + not isinstance(generation_config.force_words_ids, list) + or len(generation_config.force_words_ids) == 0 + ): + typeerror() + + for word_ids in generation_config.force_words_ids: + if isinstance(word_ids[0], list): + if not isinstance(word_ids, list) or len(word_ids) == 0: + typeerror() + if any(not isinstance(token_ids, list) for token_ids in word_ids): + typeerror() + if any( + any((not isinstance(token_id, int) or token_id < 0) for token_id in token_ids) + for token_ids in word_ids + ): + typeerror() + + constraint = DisjunctiveConstraint(word_ids) + else: + if not isinstance(word_ids, list) or len(word_ids) == 0: + typeerror() + if any((not isinstance(token_id, int) or token_id < 0) for token_id in word_ids): + typeerror() + + constraint = PhrasalConstraint(word_ids) + final_constraints.append(constraint) + + # 11. prepare beam search scorer + constrained_beam_scorer = ConstrainedBeamSearchScorer( + constraints=final_constraints, + batch_size=batch_size, + num_beams=generation_config.num_beams, + device=inputs_tensor.device, + length_penalty=generation_config.length_penalty, + do_early_stopping=generation_config.early_stopping, + num_beam_hyps_to_keep=generation_config.num_return_sequences, + max_length=generation_config.max_length, + ) + # 12. interleave input_ids with `num_beams` additional sequences per batch + input_ids, model_kwargs = self._expand_inputs_for_generation( + input_ids=input_ids, + expand_size=generation_config.num_beams, + is_encoder_decoder=self.config.is_encoder_decoder, + **model_kwargs, + ) + # 13. run beam search + return self.constrained_beam_search( + input_ids, + constrained_beam_scorer=constrained_beam_scorer, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + pad_token_id=generation_config.pad_token_id, + eos_token_id=generation_config.eos_token_id, + output_scores=generation_config.output_scores, + return_dict_in_generate=generation_config.return_dict_in_generate, + synced_gpus=synced_gpus, + **model_kwargs, + ) + + @torch.no_grad() + def contrastive_search( + self, + input_ids: torch.LongTensor, + top_k: Optional[int] = 1, + penalty_alpha: Optional[float] = 0, + logits_processor: Optional[LogitsProcessorList] = None, + logits_warper: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = False, + streamer: Optional["BaseStreamer"] = None, + **model_kwargs, + ) -> Union[ContrastiveSearchOutput, torch.LongTensor]: + r""" + Generates sequences of token ids for models with a language modeling head using **contrastive search** and can + be used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.contrastive_search`] directly. Use + generate() instead. For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + top_k (`int`, *optional*, defaults to 1): + The size of the candidate set that is used to re-rank for contrastive search + penalty_alpha (`float`, *optional*, defaults to 0): + The degeneration penalty for contrastive search; activate when it is larger than 0 + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + logits_warper (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsWarper`] used + to warp the prediction score distribution of the language modeling head applied before multinomial + sampling at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + streamer (`BaseStreamer`, *optional*): + Streamer object that will be used to stream the generated sequences. Generated tokens are passed + through `streamer.put(token_ids)` and the streamer is responsible for any further processing. + model_kwargs: + Additional model specific keyword arguments will be forwarded to the `forward` function of the model. + If model is an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`~generation.ContrastiveSearchDecoderOnlyOutput`], [`~generation.ContrastiveSearchEncoderDecoderOutput`] + or `torch.LongTensor`: A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.ContrastiveSearchDecoderOnlyOutput`] if `model.config.is_encoder_decoder=False` and + `return_dict_in_generate=True` or a [`~generation.ContrastiveSearchEncoderDecoderOutput`] if + `model.config.is_encoder_decoder=True`. + + Examples: + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForCausalLM, + ... StoppingCriteriaList, + ... MaxLengthCriteria, + ... ) + + >>> tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m") + >>> model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m") + >>> # set pad_token_id to eos_token_id because OPT does not have a PAD token + >>> model.config.pad_token_id = model.config.eos_token_id + >>> input_prompt = "DeepMind Company is" + >>> input_ids = tokenizer(input_prompt, return_tensors="pt") + >>> stopping_criteria = StoppingCriteriaList([MaxLengthCriteria(max_length=64)]) + >>> outputs = model.contrastive_search( + ... **input_ids, penalty_alpha=0.6, top_k=4, stopping_criteria=stopping_criteria + ... ) + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ['DeepMind Company is a company that focuses on the development and commercialization of artificial intelligence (AI). DeepMind’s mission is to help people understand and solve problems that are difficult to solve in the world today.\n\nIn this post, we talk about the benefits of deep learning in business and how it'] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + logits_warper = logits_warper if logits_warper is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + eos_token_id_tensor = torch.tensor(eos_token_id).to(input_ids.device) if eos_token_id is not None else None + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + # keep track of which sequences are already finished + unfinished_sequences = torch.ones(input_ids.shape[0], dtype=torch.long, device=input_ids.device) + + this_peer_finished = False # used by synced_gpus only + batch_size = input_ids.shape[0] + + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + # if the first step in the loop, encode all the prefix and obtain: (1) past_key_values; + # (2) last_hidden_states; (3) logit_for_next_step; (4) update model kwargs for the next step + if model_kwargs.get("past_key_values") is None: + # prepare inputs + model_kwargs["use_cache"] = True + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + + # encode the given prefix and prepare model inputs; encoder-decoder model process the prefix and save + # the `encoder_outputs` + outputs = self( + **model_inputs, return_dict=True, output_hidden_states=True, output_attentions=output_attentions + ) + + # last decoder hidden states will be used to compute the degeneration penalty (cosine similarity with + # previous tokens) + if self.config.is_encoder_decoder: + last_hidden_states = outputs.decoder_hidden_states[-1] + else: + last_hidden_states = outputs.hidden_states[-1] + # next logit for contrastive search to select top-k candidate tokens + logit_for_next_step = outputs.logits[:, -1, :] + + model_kwargs = self._update_model_kwargs_for_generation( + outputs, + model_kwargs, + is_encoder_decoder=self.config.is_encoder_decoder, + standardize_cache_format=True, + ) + + # Expands model inputs top_k times, for batched forward passes (akin to beam search). + _, model_kwargs = self._expand_inputs_for_generation( + expand_size=top_k, is_encoder_decoder=self.config.is_encoder_decoder, **model_kwargs + ) + + past_key_values = model_kwargs.get("past_key_values") + if past_key_values is None: + raise ValueError( + f"{self.__class__.__name__} does not support caching and therefore **can't** be used " + "for contrastive search." + ) + elif ( + not isinstance(past_key_values[0], (tuple, torch.Tensor)) + or past_key_values[0][0].shape[0] != batch_size + ): + raise ValueError( + f"{self.__class__.__name__} does not have a standard cache format and therefore **can't** be " + "used for contrastive search without further modifications." + ) + + # contrastive_search main logic start: + # contrastive search decoding consists of two steps: (1) candidate tokens recall; (2) candidate re-rank by + # degeneration penalty + + logit_for_next_step = logits_processor(input_ids, logit_for_next_step) + logit_for_next_step = logits_warper(input_ids, logit_for_next_step) + next_probs = nn.functional.softmax(logit_for_next_step, dim=-1) + top_k_probs, top_k_ids = torch.topk(next_probs, dim=-1, k=top_k) + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (logit_for_next_step,) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + # Replicates the new past_key_values to match the `top_k` candidates + new_key_values = [] + for layer in model_kwargs["past_key_values"]: + items = [] + # item is either the key or the value matrix + for item in layer: + items.append(item.repeat_interleave(top_k, dim=0)) + new_key_values.append(items) + model_kwargs["past_key_values"] = new_key_values + + # compute the candidate tokens by the language model and collects their hidden_states + next_model_inputs = self.prepare_inputs_for_generation(top_k_ids.view(-1, 1), **model_kwargs) + outputs = self( + **next_model_inputs, return_dict=True, output_hidden_states=True, output_attentions=output_attentions + ) + next_past_key_values = self._extract_past_from_model_output(outputs, standardize_cache_format=True) + + logits = outputs.logits[:, -1, :] + # name is different for encoder-decoder and decoder-only models + if self.config.is_encoder_decoder: + next_hidden = outputs.decoder_hidden_states[-1] + full_hidden_states = outputs.decoder_hidden_states + else: + next_hidden = outputs.hidden_states[-1] + full_hidden_states = outputs.hidden_states + context_hidden = last_hidden_states.repeat_interleave(top_k, dim=0) + + # compute the degeneration penalty and re-rank the candidates based on the degeneration penalty and the + # model confidence + selected_idx = _ranking_fast(context_hidden, next_hidden, top_k_probs, penalty_alpha, top_k) + + # prepare for the next step: (1) next token_id; (2) past_key_values; (3) last_hidden_states for computing + # the degeneration penalty; (4) logits for selecting next top-k candidates; (5) selected tokens scores + # (model confidence minus degeneration penalty); (6) decoder hidden_states + next_tokens = top_k_ids[range(len(top_k_ids)), selected_idx] + next_hidden = torch.stack(torch.split(next_hidden.squeeze(dim=1), top_k)) + next_hidden = next_hidden[range(batch_size), selected_idx, :] + last_hidden_states = torch.cat([last_hidden_states, next_hidden.unsqueeze(1)], dim=1) + + next_decoder_hidden_states = () + for layer in full_hidden_states: + layer = torch.stack(torch.split(layer, top_k))[range(batch_size), selected_idx, :] + next_decoder_hidden_states += (layer,) + + # select the past_key_value + new_key_values = () + for layer in next_past_key_values: + items = () + # item is either the key or the value matrix + for item in layer: + item = torch.stack(torch.split(item, top_k, dim=0)) # [B, K, num_head, seq_len, esz] + item = item[range(batch_size), selected_idx, ...] # [B, num_head, seq_len, esz] + items += (item,) + new_key_values += (items,) + next_past_key_values = new_key_values + + logit_for_next_step = torch.stack(torch.split(logits, top_k))[range(batch_size), selected_idx, :] + + # Rebuilds the relevant parts of the model output for the selected token, for use in the next iteration + if self.config.is_encoder_decoder: + next_step_cross_attentions = () + next_step_decoder_attentions = () + if output_attentions: + for layer in outputs.cross_attentions: + layer = torch.stack(torch.split(layer, top_k, dim=0))[range(batch_size), selected_idx, ...] + next_step_cross_attentions += (layer,) + for layer in outputs.decoder_attentions: + layer = torch.stack(torch.split(layer, top_k, dim=0))[range(batch_size), selected_idx, ...] + next_step_decoder_attentions += (layer,) + outputs = Seq2SeqLMOutput( + past_key_values=next_past_key_values, + decoder_hidden_states=next_decoder_hidden_states, + decoder_attentions=next_step_decoder_attentions or None, + cross_attentions=next_step_cross_attentions or None, + ) + else: + next_step_attentions = () + if output_attentions: + for layer in outputs.attentions: + layer = torch.stack(torch.split(layer, top_k, dim=0))[range(batch_size), selected_idx, ...] + next_step_attentions += (layer,) + outputs = CausalLMOutputWithPast( + past_key_values=next_past_key_values, + hidden_states=next_decoder_hidden_states, + attentions=next_step_attentions or None, + ) + # contrastive_search main logic end + + if synced_gpus and this_peer_finished: + continue # don't waste resources running the code we don't need + + # finished sentences should have their next token be a padding token + if eos_token_id is not None: + if pad_token_id is None: + raise ValueError("If `eos_token_id` is defined, make sure that `pad_token_id` is defined.") + next_tokens = next_tokens * unfinished_sequences + pad_token_id * (1 - unfinished_sequences) + + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + if streamer is not None: + streamer.put(next_tokens.cpu()) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + + # if eos_token was found in one sentence, set sentence to finished + if eos_token_id_tensor is not None: + unfinished_sequences = unfinished_sequences.mul( + next_tokens.tile(eos_token_id_tensor.shape[0], 1).ne(eos_token_id_tensor.unsqueeze(1)).prod(dim=0) + ) + + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + if streamer is not None: + streamer.end() + + if return_dict_in_generate: + if self.config.is_encoder_decoder: + return ContrastiveSearchEncoderDecoderOutput( + sequences=input_ids, + scores=scores, + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return ContrastiveSearchDecoderOnlyOutput( + sequences=input_ids, + scores=scores, + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return input_ids + + def greedy_search( + self, + input_ids: torch.LongTensor, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + max_length: Optional[int] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = False, + streamer: Optional["BaseStreamer"] = None, + **model_kwargs, + ) -> Union[GreedySearchOutput, torch.LongTensor]: + r""" + Generates sequences of token ids for models with a language modeling head using **greedy decoding** and can be + used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.greedy_search`] directly. Use generate() + instead. For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + + max_length (`int`, *optional*, defaults to 20): + **DEPRECATED**. Use `logits_processor` or `stopping_criteria` directly to cap the number of generated + tokens. The maximum length of the sequence to be generated. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + streamer (`BaseStreamer`, *optional*): + Streamer object that will be used to stream the generated sequences. Generated tokens are passed + through `streamer.put(token_ids)` and the streamer is responsible for any further processing. + model_kwargs: + Additional model specific keyword arguments will be forwarded to the `forward` function of the model. + If model is an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`~generation.GreedySearchDecoderOnlyOutput`], [`~generation.GreedySearchEncoderDecoderOutput`] or + `torch.LongTensor`: A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.GreedySearchDecoderOnlyOutput`] if `model.config.is_encoder_decoder=False` and + `return_dict_in_generate=True` or a [`~generation.GreedySearchEncoderDecoderOutput`] if + `model.config.is_encoder_decoder=True`. + + Examples: + + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForCausalLM, + ... LogitsProcessorList, + ... MinLengthLogitsProcessor, + ... StoppingCriteriaList, + ... MaxLengthCriteria, + ... ) + + >>> tokenizer = AutoTokenizer.from_pretrained("gpt2") + >>> model = AutoModelForCausalLM.from_pretrained("gpt2") + + >>> # set pad_token_id to eos_token_id because GPT2 does not have a PAD token + >>> model.generation_config.pad_token_id = model.generation_config.eos_token_id + + >>> input_prompt = "It might be possible to" + >>> input_ids = tokenizer(input_prompt, return_tensors="pt").input_ids + + >>> # instantiate logits processors + >>> logits_processor = LogitsProcessorList( + ... [ + ... MinLengthLogitsProcessor(10, eos_token_id=model.generation_config.eos_token_id), + ... ] + ... ) + >>> stopping_criteria = StoppingCriteriaList([MaxLengthCriteria(max_length=20)]) + + >>> outputs = model.greedy_search( + ... input_ids, logits_processor=logits_processor, stopping_criteria=stopping_criteria + ... ) + + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ["It might be possible to get a better understanding of the nature of the problem, but it's not"] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + if max_length is not None: + warnings.warn( + "`max_length` is deprecated in this function, use" + " `stopping_criteria=StoppingCriteriaList([MaxLengthCriteria(max_length=max_length)])` instead.", + UserWarning, + ) + stopping_criteria = validate_stopping_criteria(stopping_criteria, max_length) + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + eos_token_id_tensor = torch.tensor(eos_token_id).to(input_ids.device) if eos_token_id is not None else None + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + # keep track of which sequences are already finished + unfinished_sequences = torch.ones(input_ids.shape[0], dtype=torch.long, device=input_ids.device) + + this_peer_finished = False # used by synced_gpus only + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + # prepare model inputs + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + + # forward pass to get next token + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + if synced_gpus and this_peer_finished: + continue # don't waste resources running the code we don't need + + next_token_logits = outputs.logits[:, -1, :] + + # pre-process distribution + next_tokens_scores = logits_processor(input_ids, next_token_logits) + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (next_tokens_scores,) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + # argmax + next_tokens = torch.argmax(next_tokens_scores, dim=-1) + + # finished sentences should have their next token be a padding token + if eos_token_id is not None: + if pad_token_id is None: + raise ValueError("If `eos_token_id` is defined, make sure that `pad_token_id` is defined.") + next_tokens = next_tokens * unfinished_sequences + pad_token_id * (1 - unfinished_sequences) + + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + if streamer is not None: + streamer.put(next_tokens.cpu()) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + + # if eos_token was found in one sentence, set sentence to finished + if eos_token_id_tensor is not None: + unfinished_sequences = unfinished_sequences.mul( + next_tokens.tile(eos_token_id_tensor.shape[0], 1).ne(eos_token_id_tensor.unsqueeze(1)).prod(dim=0) + ) + + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + if streamer is not None: + streamer.end() + + if return_dict_in_generate: + if self.config.is_encoder_decoder: + return GreedySearchEncoderDecoderOutput( + sequences=input_ids, + scores=scores, + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return GreedySearchDecoderOnlyOutput( + sequences=input_ids, + scores=scores, + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return input_ids + + def sample( + self, + input_ids: torch.LongTensor, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + logits_warper: Optional[LogitsProcessorList] = None, + max_length: Optional[int] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = False, + streamer: Optional["BaseStreamer"] = None, + **model_kwargs, + ) -> Union[SampleOutput, torch.LongTensor]: + r""" + Generates sequences of token ids for models with a language modeling head using **multinomial sampling** and + can be used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.sample`] directly. Use generate() instead. + For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + logits_warper (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsWarper`] used + to warp the prediction score distribution of the language modeling head applied before multinomial + sampling at each generation step. + max_length (`int`, *optional*, defaults to 20): + **DEPRECATED**. Use `logits_processor` or `stopping_criteria` directly to cap the number of generated + tokens. The maximum length of the sequence to be generated. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + streamer (`BaseStreamer`, *optional*): + Streamer object that will be used to stream the generated sequences. Generated tokens are passed + through `streamer.put(token_ids)` and the streamer is responsible for any further processing. + model_kwargs: + Additional model specific kwargs will be forwarded to the `forward` function of the model. If model is + an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`~generation.SampleDecoderOnlyOutput`], [`~generation.SampleEncoderDecoderOutput`] or `torch.LongTensor`: + A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.SampleDecoderOnlyOutput`] if `model.config.is_encoder_decoder=False` and + `return_dict_in_generate=True` or a [`~generation.SampleEncoderDecoderOutput`] if + `model.config.is_encoder_decoder=True`. + + Examples: + + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForCausalLM, + ... LogitsProcessorList, + ... MinLengthLogitsProcessor, + ... TopKLogitsWarper, + ... TemperatureLogitsWarper, + ... StoppingCriteriaList, + ... MaxLengthCriteria, + ... ) + >>> import torch + + >>> tokenizer = AutoTokenizer.from_pretrained("gpt2") + >>> model = AutoModelForCausalLM.from_pretrained("gpt2") + + >>> # set pad_token_id to eos_token_id because GPT2 does not have a EOS token + >>> model.config.pad_token_id = model.config.eos_token_id + >>> model.generation_config.pad_token_id = model.config.eos_token_id + + >>> input_prompt = "Today is a beautiful day, and" + >>> input_ids = tokenizer(input_prompt, return_tensors="pt").input_ids + + >>> # instantiate logits processors + >>> logits_processor = LogitsProcessorList( + ... [ + ... MinLengthLogitsProcessor(15, eos_token_id=model.generation_config.eos_token_id), + ... ] + ... ) + >>> # instantiate logits processors + >>> logits_warper = LogitsProcessorList( + ... [ + ... TopKLogitsWarper(50), + ... TemperatureLogitsWarper(0.7), + ... ] + ... ) + + >>> stopping_criteria = StoppingCriteriaList([MaxLengthCriteria(max_length=20)]) + + >>> torch.manual_seed(0) # doctest: +IGNORE_RESULT + >>> outputs = model.sample( + ... input_ids, + ... logits_processor=logits_processor, + ... logits_warper=logits_warper, + ... stopping_criteria=stopping_criteria, + ... ) + + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ['Today is a beautiful day, and we must do everything possible to make it a day of celebration.'] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + if max_length is not None: + warnings.warn( + "`max_length` is deprecated in this function, use" + " `stopping_criteria=StoppingCriteriaList(MaxLengthCriteria(max_length=max_length))` instead.", + UserWarning, + ) + stopping_criteria = validate_stopping_criteria(stopping_criteria, max_length) + logits_warper = logits_warper if logits_warper is not None else LogitsProcessorList() + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + eos_token_id_tensor = torch.tensor(eos_token_id).to(input_ids.device) if eos_token_id is not None else None + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + # keep track of which sequences are already finished + unfinished_sequences = torch.ones(input_ids.shape[0], dtype=torch.long, device=input_ids.device) + + this_peer_finished = False # used by synced_gpus only + # auto-regressive generation + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + # prepare model inputs + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + + # forward pass to get next token + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + if synced_gpus and this_peer_finished: + continue # don't waste resources running the code we don't need + + next_token_logits = outputs.logits[:, -1, :] + + # pre-process distribution + next_token_scores = logits_processor(input_ids, next_token_logits) + next_token_scores = logits_warper(input_ids, next_token_scores) + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (next_token_scores,) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + # sample + probs = nn.functional.softmax(next_token_scores, dim=-1) + next_tokens = torch.multinomial(probs, num_samples=1).squeeze(1) + + # finished sentences should have their next token be a padding token + if eos_token_id is not None: + if pad_token_id is None: + raise ValueError("If `eos_token_id` is defined, make sure that `pad_token_id` is defined.") + next_tokens = next_tokens * unfinished_sequences + pad_token_id * (1 - unfinished_sequences) + + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + if streamer is not None: + streamer.put(next_tokens.cpu()) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + + # if eos_token was found in one sentence, set sentence to finished + if eos_token_id_tensor is not None: + unfinished_sequences = unfinished_sequences.mul( + next_tokens.tile(eos_token_id_tensor.shape[0], 1).ne(eos_token_id_tensor.unsqueeze(1)).prod(dim=0) + ) + + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + if streamer is not None: + streamer.end() + + if return_dict_in_generate: + if self.config.is_encoder_decoder: + return SampleEncoderDecoderOutput( + sequences=input_ids, + scores=scores, + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return SampleDecoderOnlyOutput( + sequences=input_ids, + scores=scores, + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return input_ids + + def beam_search( + self, + input_ids: torch.LongTensor, + beam_scorer: BeamScorer, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + max_length: Optional[int] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = False, + **model_kwargs, + ) -> Union[BeamSearchOutput, torch.LongTensor]: + r""" + Generates sequences of token ids for models with a language modeling head using **beam search decoding** and + can be used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.beam_search`] directly. Use generate() + instead. For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + beam_scorer (`BeamScorer`): + An derived instance of [`BeamScorer`] that defines how beam hypotheses are constructed, stored and + sorted during generation. For more information, the documentation of [`BeamScorer`] should be read. + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + max_length (`int`, *optional*, defaults to 20): + **DEPRECATED**. Use `logits_processor` or `stopping_criteria` directly to cap the number of generated + tokens. The maximum length of the sequence to be generated. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + model_kwargs: + Additional model specific kwargs will be forwarded to the `forward` function of the model. If model is + an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`generation.BeamSearchDecoderOnlyOutput`], [`~generation.BeamSearchEncoderDecoderOutput`] or + `torch.LongTensor`: A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.BeamSearchDecoderOnlyOutput`] if `model.config.is_encoder_decoder=False` and + `return_dict_in_generate=True` or a [`~generation.BeamSearchEncoderDecoderOutput`] if + `model.config.is_encoder_decoder=True`. + + + Examples: + + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForSeq2SeqLM, + ... LogitsProcessorList, + ... MinLengthLogitsProcessor, + ... BeamSearchScorer, + ... ) + >>> import torch + + >>> tokenizer = AutoTokenizer.from_pretrained("t5-base") + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + + >>> encoder_input_str = "translate English to German: How old are you?" + >>> encoder_input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids + + + >>> # lets run beam search using 3 beams + >>> num_beams = 3 + >>> # define decoder start token ids + >>> input_ids = torch.ones((num_beams, 1), device=model.device, dtype=torch.long) + >>> input_ids = input_ids * model.config.decoder_start_token_id + + >>> # add encoder_outputs to model keyword arguments + >>> model_kwargs = { + ... "encoder_outputs": model.get_encoder()( + ... encoder_input_ids.repeat_interleave(num_beams, dim=0), return_dict=True + ... ) + ... } + + >>> # instantiate beam scorer + >>> beam_scorer = BeamSearchScorer( + ... batch_size=1, + ... num_beams=num_beams, + ... device=model.device, + ... ) + + >>> # instantiate logits processors + >>> logits_processor = LogitsProcessorList( + ... [ + ... MinLengthLogitsProcessor(5, eos_token_id=model.config.eos_token_id), + ... ] + ... ) + + >>> outputs = model.beam_search(input_ids, beam_scorer, logits_processor=logits_processor, **model_kwargs) + + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ['Wie alt bist du?'] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + if max_length is not None: + warnings.warn( + "`max_length` is deprecated in this function, use" + " `stopping_criteria=StoppingCriteriaList(MaxLengthCriteria(max_length=max_length))` instead.", + UserWarning, + ) + stopping_criteria = validate_stopping_criteria(stopping_criteria, max_length) + if len(stopping_criteria) == 0: + warnings.warn("You don't have defined any stopping_criteria, this will likely loop forever", UserWarning) + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + batch_size = len(beam_scorer._beam_hyps) + num_beams = beam_scorer.num_beams + + batch_beam_size, cur_len = input_ids.shape + + if num_beams * batch_size != batch_beam_size: + raise ValueError( + f"Batch dimension of `input_ids` should be {num_beams * batch_size}, but is {batch_beam_size}." + ) + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + beam_indices = ( + tuple(() for _ in range(batch_beam_size)) if (return_dict_in_generate and output_scores) else None + ) + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + # initialise score of first beam with 0 and the rest with -1e9. This makes sure that only tokens + # of the first beam are considered to avoid sampling the exact same tokens across all beams. + beam_scores = torch.zeros((batch_size, num_beams), dtype=torch.float, device=input_ids.device) + beam_scores[:, 1:] = -1e9 + beam_scores = beam_scores.view((batch_size * num_beams,)) + + this_peer_finished = False # used by synced_gpus only + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + if synced_gpus and this_peer_finished: + cur_len = cur_len + 1 + continue # don't waste resources running the code we don't need + + next_token_logits = outputs.logits[:, -1, :] + # hack: adjust tokens for Marian. For Marian we have to make sure that the `pad_token_id` + # cannot be generated both before and after the `nn.functional.log_softmax` operation. + next_token_logits = self.adjust_logits_during_generation(next_token_logits, cur_len=cur_len) + next_token_scores = nn.functional.log_softmax( + next_token_logits, dim=-1 + ) # (batch_size * num_beams, vocab_size) + + next_token_scores_processed = logits_processor(input_ids, next_token_scores) + next_token_scores = next_token_scores_processed + beam_scores[:, None].expand_as(next_token_scores) + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (next_token_scores_processed,) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + # reshape for beam search + vocab_size = next_token_scores.shape[-1] + next_token_scores = next_token_scores.view(batch_size, num_beams * vocab_size) + + # Sample 2 next tokens for each beam (so we have some spare tokens and match output of beam search) + next_token_scores, next_tokens = torch.topk( + next_token_scores, 2 * num_beams, dim=1, largest=True, sorted=True + ) + + next_indices = torch.div(next_tokens, vocab_size, rounding_mode="floor") + next_tokens = next_tokens % vocab_size + + # stateless + beam_outputs = beam_scorer.process( + input_ids, + next_token_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + beam_indices=beam_indices, + ) + + beam_scores = beam_outputs["next_beam_scores"] + beam_next_tokens = beam_outputs["next_beam_tokens"] + beam_idx = beam_outputs["next_beam_indices"] + + input_ids = torch.cat([input_ids[beam_idx, :], beam_next_tokens.unsqueeze(-1)], dim=-1) + + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + if model_kwargs["past_key_values"] is not None: + model_kwargs["past_key_values"] = self._reorder_cache(model_kwargs["past_key_values"], beam_idx) + + if return_dict_in_generate and output_scores: + beam_indices = tuple((beam_indices[beam_idx[i]] + (beam_idx[i],) for i in range(len(beam_indices)))) + + # increase cur_len + cur_len = cur_len + 1 + + if beam_scorer.is_done or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + sequence_outputs = beam_scorer.finalize( + input_ids, + beam_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + max_length=stopping_criteria.max_length, + beam_indices=beam_indices, + ) + + if return_dict_in_generate: + if not output_scores: + sequence_outputs["sequence_scores"] = None + + if self.config.is_encoder_decoder: + return BeamSearchEncoderDecoderOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + beam_indices=sequence_outputs["beam_indices"], + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return BeamSearchDecoderOnlyOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + beam_indices=sequence_outputs["beam_indices"], + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return sequence_outputs["sequences"] + + def beam_sample( + self, + input_ids: torch.LongTensor, + beam_scorer: BeamScorer, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + logits_warper: Optional[LogitsProcessorList] = None, + max_length: Optional[int] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = False, + **model_kwargs, + ) -> Union[BeamSampleOutput, torch.LongTensor]: + r""" + Generates sequences of token ids for models with a language modeling head using **beam search multinomial + sampling** and can be used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.beam_sample`] directly. Use generate() + instead. For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + beam_scorer (`BeamScorer`): + A derived instance of [`BeamScorer`] that defines how beam hypotheses are constructed, stored and + sorted during generation. For more information, the documentation of [`BeamScorer`] should be read. + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + logits_warper (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsWarper`] used + to warp the prediction score distribution of the language modeling head applied before multinomial + sampling at each generation step. + max_length (`int`, *optional*, defaults to 20): + **DEPRECATED**. Use `logits_processor` or `stopping_criteria` directly to cap the number of generated + tokens. The maximum length of the sequence to be generated. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + model_kwargs: + Additional model specific kwargs will be forwarded to the `forward` function of the model. If model is + an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`~generation.BeamSampleDecoderOnlyOutput`], [`~generation.BeamSampleEncoderDecoderOutput`] or + `torch.LongTensor`: A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.BeamSampleDecoderOnlyOutput`] if `model.config.is_encoder_decoder=False` and + `return_dict_in_generate=True` or a [`~generation.BeamSampleEncoderDecoderOutput`] if + `model.config.is_encoder_decoder=True`. + + Examples: + + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForSeq2SeqLM, + ... LogitsProcessorList, + ... MinLengthLogitsProcessor, + ... TopKLogitsWarper, + ... TemperatureLogitsWarper, + ... BeamSearchScorer, + ... ) + >>> import torch + + >>> tokenizer = AutoTokenizer.from_pretrained("t5-base") + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + + >>> encoder_input_str = "translate English to German: How old are you?" + >>> encoder_input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids + + >>> # lets run beam search using 3 beams + >>> num_beams = 3 + >>> # define decoder start token ids + >>> input_ids = torch.ones((num_beams, 1), device=model.device, dtype=torch.long) + >>> input_ids = input_ids * model.config.decoder_start_token_id + + >>> # add encoder_outputs to model keyword arguments + >>> model_kwargs = { + ... "encoder_outputs": model.get_encoder()( + ... encoder_input_ids.repeat_interleave(num_beams, dim=0), return_dict=True + ... ) + ... } + + >>> # instantiate beam scorer + >>> beam_scorer = BeamSearchScorer( + ... batch_size=1, + ... max_length=model.config.max_length, + ... num_beams=num_beams, + ... device=model.device, + ... ) + + >>> # instantiate logits processors + >>> logits_processor = LogitsProcessorList( + ... [MinLengthLogitsProcessor(5, eos_token_id=model.config.eos_token_id)] + ... ) + >>> # instantiate logits processors + >>> logits_warper = LogitsProcessorList( + ... [ + ... TopKLogitsWarper(50), + ... TemperatureLogitsWarper(0.7), + ... ] + ... ) + + >>> outputs = model.beam_sample( + ... input_ids, beam_scorer, logits_processor=logits_processor, logits_warper=logits_warper, **model_kwargs + ... ) + + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ['Wie alt bist du?'] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + if max_length is not None: + warnings.warn( + "`max_length` is deprecated in this function, use" + " `stopping_criteria=StoppingCriteriaList(MaxLengthCriteria(max_length=max_length))` instead.", + UserWarning, + ) + stopping_criteria = validate_stopping_criteria(stopping_criteria, max_length) + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + batch_size = len(beam_scorer._beam_hyps) + num_beams = beam_scorer.num_beams + + batch_beam_size, cur_len = input_ids.shape + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + beam_indices = ( + tuple(() for _ in range(batch_beam_size)) if (return_dict_in_generate and output_scores) else None + ) + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + beam_scores = torch.zeros((batch_size, num_beams), dtype=torch.float, device=input_ids.device) + beam_scores = beam_scores.view((batch_size * num_beams,)) + + this_peer_finished = False # used by synced_gpus only + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + if synced_gpus and this_peer_finished: + cur_len = cur_len + 1 + continue # don't waste resources running the code we don't need + + next_token_logits = outputs.logits[:, -1, :] + + # hack: adjust tokens for Marian. For Marian we have to make sure that the `pad_token_id` + # cannot be generated both before and after the `nn.functional.log_softmax` operation. + next_token_logits = self.adjust_logits_during_generation(next_token_logits, cur_len=cur_len) + next_token_scores = nn.functional.log_softmax( + next_token_logits, dim=-1 + ) # (batch_size * num_beams, vocab_size) + + next_token_scores_processed = logits_processor(input_ids, next_token_scores) + next_token_scores = next_token_scores_processed + beam_scores[:, None].expand_as(next_token_scores) + # Note: logits warpers are intentionally applied after adding running beam scores. On some logits warpers + # (like top_p) this is indiferent, but on others (like temperature) it is not. For reference, see + # https://github.com/huggingface/transformers/pull/5420#discussion_r449779867 + next_token_scores = logits_warper(input_ids, next_token_scores) + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (logits_warper(input_ids, next_token_scores_processed),) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + # reshape for beam search + vocab_size = next_token_scores.shape[-1] + next_token_scores = next_token_scores.view(batch_size, num_beams * vocab_size) + + probs = nn.functional.softmax(next_token_scores, dim=-1) + + next_tokens = torch.multinomial(probs, num_samples=2 * num_beams) + next_token_scores = torch.gather(next_token_scores, -1, next_tokens) + + next_token_scores, _indices = torch.sort(next_token_scores, descending=True, dim=1) + next_tokens = torch.gather(next_tokens, -1, _indices) + + next_indices = torch.div(next_tokens, vocab_size, rounding_mode="floor") + next_tokens = next_tokens % vocab_size + + # stateless + beam_outputs = beam_scorer.process( + input_ids, + next_token_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + beam_indices=beam_indices, + ) + beam_scores = beam_outputs["next_beam_scores"] + beam_next_tokens = beam_outputs["next_beam_tokens"] + beam_idx = beam_outputs["next_beam_indices"] + + input_ids = torch.cat([input_ids[beam_idx, :], beam_next_tokens.unsqueeze(-1)], dim=-1) + + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + if model_kwargs["past_key_values"] is not None: + model_kwargs["past_key_values"] = self._reorder_cache(model_kwargs["past_key_values"], beam_idx) + + if return_dict_in_generate and output_scores: + beam_indices = tuple((beam_indices[beam_idx[i]] + (beam_idx[i],) for i in range(len(beam_indices)))) + + # increase cur_len + cur_len = cur_len + 1 + + if beam_scorer.is_done or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + sequence_outputs = beam_scorer.finalize( + input_ids, + beam_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + max_length=stopping_criteria.max_length, + beam_indices=beam_indices, + ) + + if return_dict_in_generate: + if not output_scores: + sequence_outputs["sequence_scores"] = None + + if self.config.is_encoder_decoder: + return BeamSampleEncoderDecoderOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + beam_indices=sequence_outputs["beam_indices"], + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return BeamSampleDecoderOnlyOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + beam_indices=sequence_outputs["beam_indices"], + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return sequence_outputs["sequences"] + + def group_beam_search( + self, + input_ids: torch.LongTensor, + beam_scorer: BeamScorer, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + max_length: Optional[int] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = False, + **model_kwargs, + ): + r""" + Generates sequences of token ids for models with a language modeling head using **diverse beam search + decoding** and can be used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.group_beam_search`] directly. Use + generate() instead. For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + beam_scorer (`BeamScorer`): + An derived instance of [`BeamScorer`] that defines how beam hypotheses are constructed, stored and + sorted during generation. For more information, the documentation of [`BeamScorer`] should be read. + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + max_length (`int`, *optional*, defaults to 20): + **DEPRECATED**. Use `logits_processor` or `stopping_criteria` directly to cap the number of generated + tokens. The maximum length of the sequence to be generated. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + + model_kwargs: + Additional model specific kwargs that will be forwarded to the `forward` function of the model. If + model is an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`~generation.BeamSearchDecoderOnlyOutput`], [`~generation.BeamSearchEncoderDecoderOutput`] or + `torch.LongTensor`: A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.BeamSearchDecoderOnlyOutput`] if [`~generation.BeamSearchDecoderOnlyOutput`] if + `model.config.is_encoder_decoder=False` and `return_dict_in_generate=True` or a + [`~generation.BeamSearchEncoderDecoderOutput`] if `model.config.is_encoder_decoder=True`. + + Examples: + + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForSeq2SeqLM, + ... LogitsProcessorList, + ... MinLengthLogitsProcessor, + ... HammingDiversityLogitsProcessor, + ... BeamSearchScorer, + ... ) + >>> import torch + + >>> tokenizer = AutoTokenizer.from_pretrained("t5-base") + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + + >>> encoder_input_str = "translate English to German: How old are you?" + >>> encoder_input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids + + + >>> # lets run diverse beam search using 6 beams + >>> num_beams = 6 + >>> # define decoder start token ids + >>> input_ids = torch.ones((num_beams, 1), device=model.device, dtype=torch.long) + >>> input_ids = input_ids * model.config.decoder_start_token_id + + >>> # add encoder_outputs to model keyword arguments + >>> model_kwargs = { + ... "encoder_outputs": model.get_encoder()( + ... encoder_input_ids.repeat_interleave(num_beams, dim=0), return_dict=True + ... ) + ... } + + >>> # instantiate beam scorer + >>> beam_scorer = BeamSearchScorer( + ... batch_size=1, + ... max_length=model.config.max_length, + ... num_beams=num_beams, + ... device=model.device, + ... num_beam_groups=3, + ... ) + + >>> # instantiate logits processors + >>> logits_processor = LogitsProcessorList( + ... [ + ... HammingDiversityLogitsProcessor(5.5, num_beams=6, num_beam_groups=3), + ... MinLengthLogitsProcessor(5, eos_token_id=model.config.eos_token_id), + ... ] + ... ) + + >>> outputs = model.group_beam_search( + ... input_ids, beam_scorer, logits_processor=logits_processor, **model_kwargs + ... ) + + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ['Wie alt bist du?'] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + if max_length is not None: + warnings.warn( + "`max_length` is deprecated in this function, use" + " `stopping_criteria=StoppingCriteriaList(MaxLengthCriteria(max_length=max_length))` instead.", + UserWarning, + ) + stopping_criteria = validate_stopping_criteria(stopping_criteria, max_length) + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + batch_size = len(beam_scorer._beam_hyps) + num_beams = beam_scorer.num_beams + num_beam_groups = beam_scorer.num_beam_groups + num_sub_beams = num_beams // num_beam_groups + device = input_ids.device + + batch_beam_size, cur_len = input_ids.shape + + if return_dict_in_generate and output_scores: + beam_indices = [tuple(() for _ in range(num_sub_beams * batch_size)) for _ in range(num_beam_groups)] + else: + beam_indices = None + + if num_beams * batch_size != batch_beam_size: + raise ValueError( + f"Batch dimension of `input_ids` should be {num_beams * batch_size}, but is {batch_beam_size}." + ) + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + # initialise score of first beam of each group with 0 and the rest with -1e9. This ensures that the beams in + # the same group don't produce same tokens everytime. + beam_scores = torch.full((batch_size, num_beams), -1e9, dtype=torch.float, device=device) + beam_scores[:, ::num_sub_beams] = 0 + beam_scores = beam_scores.view((batch_size * num_beams,)) + + this_peer_finished = False # used by synced_gpus only + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + # predicted tokens in cur_len step + current_tokens = torch.zeros(batch_size * num_beams, dtype=input_ids.dtype, device=device) + + # indices which will form the beams in the next time step + reordering_indices = torch.zeros(batch_size * num_beams, dtype=torch.long, device=device) + + # do one decoder step on all beams of all sentences in batch + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + if synced_gpus and this_peer_finished: + cur_len = cur_len + 1 + continue # don't waste resources running the code we don't need + + if output_scores: + processed_score = torch.zeros_like(outputs.logits[:, -1, :]) + + for beam_group_idx in range(num_beam_groups): + group_start_idx = beam_group_idx * num_sub_beams + group_end_idx = min(group_start_idx + num_sub_beams, num_beams) + group_size = group_end_idx - group_start_idx + + # indices of beams of current group among all sentences in batch + batch_group_indices = [] + + for batch_idx in range(batch_size): + batch_group_indices.extend( + [batch_idx * num_beams + idx for idx in range(group_start_idx, group_end_idx)] + ) + group_input_ids = input_ids[batch_group_indices] + + # select outputs of beams of current group only + next_token_logits = outputs.logits[batch_group_indices, -1, :] + + # hack: adjust tokens for Marian. For Marian we have to make sure that the `pad_token_id` + # cannot be generated both before and after the `nn.functional.log_softmax` operation. + next_token_logits = self.adjust_logits_during_generation(next_token_logits, cur_len=cur_len) + next_token_scores = nn.functional.log_softmax( + next_token_logits, dim=-1 + ) # (batch_size * group_size, vocab_size) + vocab_size = next_token_scores.shape[-1] + + next_token_scores_processed = logits_processor( + group_input_ids, next_token_scores, current_tokens=current_tokens, beam_group_idx=beam_group_idx + ) + next_token_scores = next_token_scores_processed + beam_scores[batch_group_indices].unsqueeze(-1) + next_token_scores = next_token_scores.expand_as(next_token_scores_processed) + + if output_scores: + processed_score[batch_group_indices] = next_token_scores_processed + + # reshape for beam search + next_token_scores = next_token_scores.view(batch_size, group_size * vocab_size) + + # Sample 2 next tokens for each beam (so we have some spare tokens and match output of beam search) + next_token_scores, next_tokens = torch.topk( + next_token_scores, 2 * group_size, dim=1, largest=True, sorted=True + ) + + next_indices = torch.div(next_tokens, vocab_size, rounding_mode="floor") + next_tokens = next_tokens % vocab_size + + # stateless + process_beam_indices = sum(beam_indices, ()) if beam_indices is not None else None + beam_outputs = beam_scorer.process( + group_input_ids, + next_token_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + beam_indices=process_beam_indices, + ) + beam_scores[batch_group_indices] = beam_outputs["next_beam_scores"] + beam_next_tokens = beam_outputs["next_beam_tokens"] + beam_idx = beam_outputs["next_beam_indices"] + + if return_dict_in_generate and output_scores: + beam_indices[beam_group_idx] = tuple( + beam_indices[beam_group_idx][beam_idx[i]] + (beam_idx[i],) for i in range(len(beam_indices[0])) + ) + + input_ids[batch_group_indices] = group_input_ids[beam_idx] + group_input_ids = torch.cat([group_input_ids[beam_idx, :], beam_next_tokens.unsqueeze(-1)], dim=-1) + current_tokens[batch_group_indices] = group_input_ids[:, -1] + + # (beam_idx // group_size) -> batch_idx + # (beam_idx % group_size) -> offset of idx inside the group + reordering_indices[batch_group_indices] = ( + num_beams * torch.div(beam_idx, group_size, rounding_mode="floor") + + group_start_idx + + (beam_idx % group_size) + ) + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (processed_score,) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + input_ids = torch.cat([input_ids, current_tokens.unsqueeze(-1)], dim=-1) + + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + if model_kwargs["past_key_values"] is not None: + model_kwargs["past_key_values"] = self._reorder_cache( + model_kwargs["past_key_values"], reordering_indices + ) + + # increase cur_len + cur_len = cur_len + 1 + + if beam_scorer.is_done or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + final_beam_indices = sum(beam_indices, ()) if beam_indices is not None else None + sequence_outputs = beam_scorer.finalize( + input_ids, + beam_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + max_length=stopping_criteria.max_length, + beam_indices=final_beam_indices, + ) + + if return_dict_in_generate: + if not output_scores: + sequence_outputs["sequence_scores"] = None + + if self.config.is_encoder_decoder: + return BeamSearchEncoderDecoderOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + beam_indices=sequence_outputs["beam_indices"], + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return BeamSearchDecoderOnlyOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + beam_indices=sequence_outputs["beam_indices"], + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return sequence_outputs["sequences"] + + def constrained_beam_search( + self, + input_ids: torch.LongTensor, + constrained_beam_scorer: ConstrainedBeamSearchScorer, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + max_length: Optional[int] = None, + pad_token_id: Optional[int] = None, + eos_token_id: Optional[Union[int, List[int]]] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + output_scores: Optional[bool] = None, + return_dict_in_generate: Optional[bool] = None, + synced_gpus: Optional[bool] = None, + **model_kwargs, + ) -> Union[BeamSearchOutput, torch.LongTensor]: + r""" + Generates sequences of token ids for models with a language modeling head using **constrained beam search + decoding** and can be used for text-decoder, text-to-text, speech-to-text, and vision-to-text models. + + + + In most cases, you do not need to call [`~generation.GenerationMixin.constrained_beam_search`] directly. Use + generate() instead. For an overview of generation strategies and code examples, check the [following + guide](../generation_strategies). + + + + Parameters: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + constrained_beam_scorer (`ConstrainedBeamSearchScorer`): + A derived instance of [`BeamScorer`] that defines how beam hypotheses are constructed, stored and + sorted during generation, while satisfying a list of positive constraints. For more information, the + documentation of [`ConstrainedBeamSearchScorer`] should be read. + logits_processor (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsProcessor`] + used to modify the prediction scores of the language modeling head applied at each generation step. + stopping_criteria (`StoppingCriteriaList`, *optional*): + An instance of [`StoppingCriteriaList`]. List of instances of class derived from [`StoppingCriteria`] + used to tell if the generation loop should stop. + logits_warper (`LogitsProcessorList`, *optional*): + An instance of [`LogitsProcessorList`]. List of instances of class derived from [`LogitsWarper`] used + to warp the prediction score distribution of the language modeling head applied before multinomial + sampling at each generation step. + max_length (`int`, *optional*, defaults to 20): + **DEPRECATED**. Use `logits_processor` or `stopping_criteria` directly to cap the number of generated + tokens. The maximum length of the sequence to be generated. + pad_token_id (`int`, *optional*): + The id of the *padding* token. + eos_token_id (`Union[int, List[int]]`, *optional*): + The id of the *end-of-sequence* token. Optionally, use a list to set multiple *end-of-sequence* tokens. + output_attentions (`bool`, *optional*, defaults to `False`): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more details. + output_hidden_states (`bool`, *optional*, defaults to `False`): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors + for more details. + output_scores (`bool`, *optional*, defaults to `False`): + Whether or not to return the prediction scores. See `scores` under returned tensors for more details. + return_dict_in_generate (`bool`, *optional*, defaults to `False`): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. + synced_gpus (`bool`, *optional*, defaults to `False`): + Whether to continue running the while loop until max_length (needed for ZeRO stage 3) + model_kwargs: + Additional model specific kwargs will be forwarded to the `forward` function of the model. If model is + an encoder-decoder model the kwargs should include `encoder_outputs`. + + Return: + [`generation.BeamSearchDecoderOnlyOutput`], [`~generation.BeamSearchEncoderDecoderOutput`] or + `torch.LongTensor`: A `torch.LongTensor` containing the generated tokens (default behaviour) or a + [`~generation.BeamSearchDecoderOnlyOutput`] if `model.config.is_encoder_decoder=False` and + `return_dict_in_generate=True` or a [`~generation.BeamSearchEncoderDecoderOutput`] if + `model.config.is_encoder_decoder=True`. + + + Examples: + + ```python + >>> from transformers import ( + ... AutoTokenizer, + ... AutoModelForSeq2SeqLM, + ... LogitsProcessorList, + ... MinLengthLogitsProcessor, + ... ConstrainedBeamSearchScorer, + ... PhrasalConstraint, + ... ) + >>> import torch + + >>> tokenizer = AutoTokenizer.from_pretrained("t5-base") + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + + >>> encoder_input_str = "translate English to German: How old are you?" + >>> encoder_input_ids = tokenizer(encoder_input_str, return_tensors="pt").input_ids + + + >>> # lets run beam search using 3 beams + >>> num_beams = 3 + >>> # define decoder start token ids + >>> input_ids = torch.ones((num_beams, 1), device=model.device, dtype=torch.long) + >>> input_ids = input_ids * model.config.decoder_start_token_id + + >>> # add encoder_outputs to model keyword arguments + >>> model_kwargs = { + ... "encoder_outputs": model.get_encoder()( + ... encoder_input_ids.repeat_interleave(num_beams, dim=0), return_dict=True + ... ) + ... } + + >>> constraint_str = "Sie" + >>> constraint_token_ids = tokenizer.encode(constraint_str)[:-1] # slice to remove eos token + >>> constraints = [PhrasalConstraint(token_ids=constraint_token_ids)] + + + >>> # instantiate beam scorer + >>> beam_scorer = ConstrainedBeamSearchScorer( + ... batch_size=1, num_beams=num_beams, device=model.device, constraints=constraints + ... ) + + >>> # instantiate logits processors + >>> logits_processor = LogitsProcessorList( + ... [ + ... MinLengthLogitsProcessor(5, eos_token_id=model.config.eos_token_id), + ... ] + ... ) + + >>> outputs = model.constrained_beam_search( + ... input_ids, beam_scorer, constraints=constraints, logits_processor=logits_processor, **model_kwargs + ... ) + + >>> tokenizer.batch_decode(outputs, skip_special_tokens=True) + ['Wie alt sind Sie?'] + ```""" + # init values + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + if max_length is not None: + warnings.warn( + "`max_length` is deprecated in this function, use" + " `stopping_criteria=StoppingCriteriaList(MaxLengthCriteria(max_length=max_length))` instead.", + UserWarning, + ) + stopping_criteria = validate_stopping_criteria(stopping_criteria, max_length) + if len(stopping_criteria) == 0: + warnings.warn("You don't have defined any stopping_criteria, this will likely loop forever", UserWarning) + pad_token_id = pad_token_id if pad_token_id is not None else self.generation_config.pad_token_id + eos_token_id = eos_token_id if eos_token_id is not None else self.generation_config.eos_token_id + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + output_scores = output_scores if output_scores is not None else self.generation_config.output_scores + output_attentions = ( + output_attentions if output_attentions is not None else self.generation_config.output_attentions + ) + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.generation_config.output_hidden_states + ) + return_dict_in_generate = ( + return_dict_in_generate + if return_dict_in_generate is not None + else self.generation_config.return_dict_in_generate + ) + + # init attention / hidden states / scores tuples + scores = () if (return_dict_in_generate and output_scores) else None + decoder_attentions = () if (return_dict_in_generate and output_attentions) else None + cross_attentions = () if (return_dict_in_generate and output_attentions) else None + decoder_hidden_states = () if (return_dict_in_generate and output_hidden_states) else None + + # if model is an encoder-decoder, retrieve encoder attention weights and hidden states + if return_dict_in_generate and self.config.is_encoder_decoder: + encoder_attentions = model_kwargs["encoder_outputs"].get("attentions") if output_attentions else None + encoder_hidden_states = ( + model_kwargs["encoder_outputs"].get("hidden_states") if output_hidden_states else None + ) + + batch_size = len(constrained_beam_scorer._beam_hyps) + num_beams = constrained_beam_scorer.num_beams + + batch_beam_size, cur_len = input_ids.shape + + if num_beams * batch_size != batch_beam_size: + raise ValueError( + f"Batch dimension of `input_ids` should be {num_beams * batch_size}, but is {batch_beam_size}." + ) + + # initialise score of first beam with 0 and the rest with -1e9. This makes sure that only tokens + # of the first beam are considered to avoid sampling the exact same tokens across all beams. + beam_scores = torch.zeros((batch_size, num_beams), dtype=torch.float, device=input_ids.device) + beam_scores[:, 1:] = -1e9 + beam_scores = beam_scores.view((batch_size * num_beams,)) + + this_peer_finished = False # used by synced_gpus only + while True: + if synced_gpus: + # Under synced_gpus the `forward` call must continue until all gpus complete their sequence. + # The following logic allows an early break if all peers finished generating their sequence + this_peer_finished_flag = torch.tensor(0.0 if this_peer_finished else 1.0).to(input_ids.device) + # send 0.0 if we finished, 1.0 otherwise + dist.all_reduce(this_peer_finished_flag, op=dist.ReduceOp.SUM) + # did all peers finish? the reduced sum will be 0.0 then + if this_peer_finished_flag.item() == 0.0: + break + + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + ) + + if synced_gpus and this_peer_finished: + cur_len = cur_len + 1 + continue # don't waste resources running the code we don't need + + next_token_logits = outputs.logits[:, -1, :] + # hack: adjust tokens for Marian. For Marian we have to make sure that the `pad_token_id` + # cannot be generated both before and after the `nn.functional.log_softmax` operation. + next_token_logits = self.adjust_logits_during_generation(next_token_logits, cur_len=cur_len) + next_token_scores = nn.functional.log_softmax( + next_token_logits, dim=-1 + ) # (batch_size * num_beams, vocab_size) + + next_token_scores_processed = logits_processor(input_ids, next_token_scores) + + next_token_scores = next_token_scores_processed + beam_scores[:, None].expand_as(next_token_scores) + + scores_for_all_vocab = next_token_scores.clone() + + # Store scores, attentions and hidden_states when required + if return_dict_in_generate: + if output_scores: + scores += (next_token_scores,) + if output_attentions: + decoder_attentions += ( + (outputs.decoder_attentions,) if self.config.is_encoder_decoder else (outputs.attentions,) + ) + if self.config.is_encoder_decoder: + cross_attentions += (outputs.cross_attentions,) + + if output_hidden_states: + decoder_hidden_states += ( + (outputs.decoder_hidden_states,) + if self.config.is_encoder_decoder + else (outputs.hidden_states,) + ) + + # reshape for beam search + vocab_size = next_token_scores.shape[-1] + next_token_scores = next_token_scores.view(batch_size, num_beams * vocab_size) + + # Sample 2 next tokens for each beam (so we have some spare tokens and match output of beam search) + next_token_scores, next_tokens = torch.topk( + next_token_scores, 2 * num_beams, dim=1, largest=True, sorted=True + ) + + next_indices = (next_tokens / vocab_size).long() + next_tokens = next_tokens % vocab_size + + # stateless + beam_outputs = constrained_beam_scorer.process( + input_ids, + next_token_scores, + next_tokens, + next_indices, + scores_for_all_vocab, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + ) + beam_scores = beam_outputs["next_beam_scores"] + beam_next_tokens = beam_outputs["next_beam_tokens"] + beam_idx = beam_outputs["next_beam_indices"] + + input_ids = torch.cat([input_ids[beam_idx, :], beam_next_tokens.unsqueeze(-1)], dim=-1) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + if model_kwargs["past_key_values"] is not None: + model_kwargs["past_key_values"] = self._reorder_cache(model_kwargs["past_key_values"], beam_idx) + + # increase cur_len + cur_len = cur_len + 1 + + if constrained_beam_scorer.is_done or stopping_criteria(input_ids, scores): + if not synced_gpus: + break + else: + this_peer_finished = True + + sequence_outputs = constrained_beam_scorer.finalize( + input_ids, + beam_scores, + next_tokens, + next_indices, + pad_token_id=pad_token_id, + eos_token_id=eos_token_id, + max_length=stopping_criteria.max_length, + ) + + if return_dict_in_generate: + if not output_scores: + sequence_outputs["sequence_scores"] = None + if self.config.is_encoder_decoder: + return BeamSearchEncoderDecoderOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + encoder_attentions=encoder_attentions, + encoder_hidden_states=encoder_hidden_states, + decoder_attentions=decoder_attentions, + cross_attentions=cross_attentions, + decoder_hidden_states=decoder_hidden_states, + ) + else: + return BeamSearchDecoderOnlyOutput( + sequences=sequence_outputs["sequences"], + sequences_scores=sequence_outputs["sequence_scores"], + scores=scores, + attentions=decoder_attentions, + hidden_states=decoder_hidden_states, + ) + else: + return sequence_outputs["sequences"] + + +def top_k_top_p_filtering( + logits: torch.FloatTensor, + top_k: int = 0, + top_p: float = 1.0, + filter_value: float = -float("Inf"), + min_tokens_to_keep: int = 1, +) -> torch.FloatTensor: + """ + Filter a distribution of logits using top-k and/or nucleus (top-p) filtering + + Args: + logits: logits distribution shape (batch size, vocabulary size) + top_k (`int`, *optional*, defaults to 0): + If > 0, only keep the top k tokens with highest probability (top-k filtering) + top_p (`float`, *optional*, defaults to 1.0): + If < 1.0, only keep the top tokens with cumulative probability >= top_p (nucleus filtering). Nucleus + filtering is described in Holtzman et al. (http://arxiv.org/abs/1904.09751) + min_tokens_to_keep (`int`, *optional*, defaults to 1): + Minimumber of tokens we keep per batch example in the output. + + From: https://gist.github.com/thomwolf/1a5a29f6962089e871b94cbd09daf317 + """ + if top_k > 0: + logits = TopKLogitsWarper(top_k=top_k, filter_value=filter_value, min_tokens_to_keep=min_tokens_to_keep)( + None, logits + ) + + if 0 <= top_p <= 1.0: + logits = TopPLogitsWarper(top_p=top_p, filter_value=filter_value, min_tokens_to_keep=min_tokens_to_keep)( + None, logits + ) + + return logits + + +def _ranking_fast( + context_hidden: torch.FloatTensor, + next_hidden: torch.FloatTensor, + next_top_k_probs: torch.FloatTensor, + alpha: float, + beam_width: int, +) -> torch.FloatTensor: + """ + Reranks the top_k candidates based on a degeneration penalty (cosine similarity with previous tokens), as described + in the paper "A Contrastive Framework for Neural Text Generation". Returns the index of the best candidate for each + row in the batch. + """ + norm_context_hidden = context_hidden / context_hidden.norm(dim=2, keepdim=True) + norm_next_hidden = next_hidden / next_hidden.norm(dim=2, keepdim=True) + cosine_matrix = torch.matmul(norm_context_hidden, norm_next_hidden.transpose(1, 2)).squeeze(-1) # [B*K, S] + degeneration_penalty, _ = torch.max(cosine_matrix, dim=-1) # [B*K] + next_top_k_probs = next_top_k_probs.view(-1) # [B*K] + contrastive_score = (1.0 - alpha) * next_top_k_probs - alpha * degeneration_penalty + contrastive_score = torch.stack(torch.split(contrastive_score, beam_width)) # [B, K] + _, selected_idx = contrastive_score.max(dim=-1) # [B] + return selected_idx diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..be562252738f314d4d1f51e09454efe9788262b8 --- /dev/null +++ b/main.py @@ -0,0 +1,149 @@ +import os +import pytorch_lightning as pl +from argparse import ArgumentParser +from pytorch_lightning import Trainer +import pytorch_lightning.callbacks as plc +from pytorch_lightning.loggers import TensorBoardLogger, CSVLogger + +from model.model_interface import MInterface +from data.data_interface import DInterface +from recommender.A_SASRec_final_bce_llm import SASRec, Caser, GRU +from SASRecModules_ori import * +from transformers import LlamaForCausalLM, LlamaTokenizer + +def load_callbacks(args): + callbacks = [] + callbacks.append(plc.EarlyStopping( + monitor='metric', + mode='max', + patience=10, + min_delta=0.001 + )) + + callbacks.append(plc.ModelCheckpoint( + monitor='metric', + dirpath=args.ckpt_dir, + filename='{epoch:02d}-{metric:.3f}', + save_top_k=-1, + mode='max', + save_last=True, + #train_time_interval=args.val_check_interval + every_n_epochs=1 + )) + + if args.lr_scheduler: + callbacks.append(plc.LearningRateMonitor( + logging_interval='step')) + return callbacks + +def main(args): + pl.seed_everything(args.seed) + model = MInterface(**vars(args)) + if args.ckpt_path: + ckpt = torch.load(args.ckpt_path, map_location='cpu') + + model.load_state_dict(ckpt['state_dict'], strict=False) + print("load checkpoints from {}".format(args.ckpt_path)) + + data_module = DInterface(llm_tokenizer=model.llama_tokenizer,**vars(args)) + + args.max_steps=len(data_module.trainset) * args.max_epochs // (args.accumulate_grad_batches * args.batch_size) + logger = TensorBoardLogger(save_dir='./log/', name=args.log_dir) + args.callbacks = load_callbacks(args) + args.logger = logger + if not os.path.exists(args.ckpt_dir): + os.makedirs(args.ckpt_dir) + + trainer = Trainer.from_argparse_args(args) + + if args.auto_lr_find: + lr_finder=trainer.tuner.lr_find(model=model, datamodule=data_module, min_lr=1e-10, max_lr=1e-3, num_training=100) + fig=lr_finder.plot(suggest=True) + fig_path="lr_finder.png" + fig.savefig(fig_path) + print("Saving to {}".format(fig_path)) + model.hparams.lr=lr_finder.suggestion() + + if args.mode == 'train': + trainer.fit(model=model, datamodule=data_module) + else: + trainer.test(model=model, datamodule=data_module) + + +if __name__ == '__main__': + torch.multiprocessing.set_start_method('spawn') + parser = ArgumentParser() + + parser.add_argument('--accelerator', default='gpu', type=str) + parser.add_argument('--devices', default=-1, type=list) + parser.add_argument('--precision', default=16, type=int) + parser.add_argument('--amp_backend', default="native", type=str) + + parser.add_argument('--batch_size', default=4, type=int) + parser.add_argument('--num_workers', default=8, type=int) + parser.add_argument('--seed', default=1234, type=int) + parser.add_argument('--lr', default=1e-4, type=float) + parser.add_argument('--accumulate_grad_batches', default=32, type=int) + parser.add_argument('--check_val_every_n_epoch', default=1, type=int) + + parser.add_argument('--lr_scheduler', default='cosine', choices=['cosine'], type=str) + parser.add_argument('--lr_decay_min_lr', default=1e-6, type=float) + parser.add_argument('--lr_warmup_start_lr', default=1e-6, type=float) + + parser.add_argument('--load_best', action='store_true') + parser.add_argument('--load_dir', default=None, type=str) + parser.add_argument('--load_ver', default=None, type=str) + parser.add_argument('--load_v_num', default=None, type=int) + + parser.add_argument('--dataset', default='steam_data', type=str) + parser.add_argument('--data_dir', default='LLaRA_MOE/data/ref/steam', type=str) + parser.add_argument('--model_name', default='mlp_projector', type=str) + parser.add_argument('--loss', default='lm', type=str) + parser.add_argument('--weight_decay', default=1e-5, type=float) + parser.add_argument('--no_augment', action='store_true') + parser.add_argument('--ckpt_dir', default='LLaRA_MOE/checkpoints/steam/', type=str) + parser.add_argument('--log_dir', default='steam_logs', type=str) + + parser.add_argument('--rec_size', default=64, type=int) + parser.add_argument('--padding_item_id', default=3581, type=int) + parser.add_argument('--llm_path', default='meta-llama/Llama-2-7b-hf', type=str) + parser.add_argument('--rec_model_path', default='LLaRA_MOE/rec_model/SASRec_steam.pt', type=str) + parser.add_argument('--prompt_path', default='LLaRA_MOE/prompt/game.txt', type=str) + parser.add_argument('--output_dir', default='LLaRA_MOE/output/steam_moe/', type=str) + parser.add_argument('--ckpt_path', type=str) + parser.add_argument('--rec_embed', default="SASRec", choices=['SASRec', 'Caser','GRU'], type=str) + + parser.add_argument('--aug_prob', default=0.5, type=float) + parser.add_argument('--mode', default='test', choices=['train', 'test'], type=str) + parser.add_argument('--auto_lr_find', default=False, action='store_true') + parser.add_argument('--metric', default='hr', choices=['hr'], type=str) + parser.add_argument('--max_epochs', default=5, type=int) + parser.add_argument('--save', default='part', choices=['part', 'all'], type=str) + parser.add_argument('--cans_num', default=20, type=int) + + # Finetuning + parser.add_argument('--llm_tuning', default='moelora', choices=['lora', 'freeze','freeze_lora', 'moelora'], type=str) + parser.add_argument('--peft_dir', default=None, type=str) + parser.add_argument('--peft_config', default=None, type=str) + parser.add_argument('--lora_r', default=8, type=float) + parser.add_argument('--lora_alpha', default=32, type=float) + parser.add_argument('--lora_dropout', default=0.1, type=float) + parser.add_argument('--num_moe', default=4, type=int) + parser.add_argument('--gating', default='Dense', type=str) + + parser.add_argument('--local_rank', default=3, type=int) + + parser.add_argument('--if_rand', default=False, type=bool) + + parser.add_argument('--router', default='unshare', choices=['share', 'unshare'], type=str) + + args = parser.parse_args() + + if 'movielens' in args.data_dir: + args.padding_item_id = 1682 + elif 'steam' in args.data_dir: + args.padding_item_id = 3581 + elif 'lastfm' in args.data_dir: + args.padding_item_id = 4606 + + main(args) diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/model/mlp_projector.py b/model/mlp_projector.py new file mode 100644 index 0000000000000000000000000000000000000000..07f66b36b4c44a5fcaabba6d5514b523de66868e --- /dev/null +++ b/model/mlp_projector.py @@ -0,0 +1,14 @@ +from torch import nn + +class MlpProjector(nn.Module): + def __init__(self, rec_size=64, llm_size=4096): + super().__init__() + self.mlp_proj = nn.Sequential( + nn.Linear(rec_size, llm_size), + nn.GELU(), + nn.Linear(llm_size, llm_size) + ) + + def forward(self, x): + x = self.mlp_proj(x) + return x \ No newline at end of file diff --git a/model/model_interface.py b/model/model_interface.py new file mode 100644 index 0000000000000000000000000000000000000000..de6f5e43b5efbb6669ceabb18c59a2094813ffa4 --- /dev/null +++ b/model/model_interface.py @@ -0,0 +1,492 @@ +import inspect +import torch +import importlib +from torch import nn +from torch.nn import functional as F +import torch.optim.lr_scheduler as lrs + +import pytorch_lightning as pl + +from transformers import LlamaForCausalLM, LlamaTokenizer +import random +from pandas.core.frame import DataFrame +import os.path as op +import os +from optims import LinearWarmupCosineLRScheduler +import numpy as np +from .peft import get_peft_config, get_peft_model, get_peft_model_state_dict, LoraConfig, TaskType, PeftModel, MoeLoraConfig, MoeLoraModel +import pickle +from .router.nlpr import LambdaLayer, ResidualBlock, GateFunction, NLPRecommendationRouter, build_router + + +# from peft import get_peft_config, get_peft_model, get_peft_model_state_dict, LoraConfig, TaskType, PeftModel +class MInterface(pl.LightningModule): + def __init__(self, + **kargs): + super().__init__() + self.save_hyperparameters() + self.load_llm(self.hparams.llm_path) + + if self.hparams.router == 'share': + self.router = build_router() + + self.load_rec_model(self.hparams.rec_model_path) + self.load_projector() + self.gradient_storage = {} + + def forward(self, batch): + targets = batch["tokens"].input_ids.masked_fill( + batch["tokens"].input_ids == self.llama_tokenizer.pad_token_id, -100 + ) # [batch_size, max_len] + + targets = targets.masked_fill((batch["tokens"].token_type_ids == 0)[:,1:], -100) + # targets = targets.masked_fill((batch["tokens"].token_type_ids == 0)[:,:], -100) + + input_embeds, user_embeds = self.wrap_emb(batch) + + if self.hparams.router == 'share': + gate_weights = self.router(user_embeds) + outputs = self.llama_model( + inputs_embeds=input_embeds, + attention_mask=batch["tokens"].attention_mask, + return_dict=True, + labels=targets, + use_cache=False, + user_embeds=user_embeds, + gate_weights=gate_weights + ) + return outputs + + outputs = self.llama_model( + inputs_embeds=input_embeds, + attention_mask=batch["tokens"].attention_mask, + return_dict=True, + labels=targets, + use_cache=False, + user_embeds=user_embeds + ) + return outputs + + def generate(self, batch,temperature=0.8,do_sample=False,num_beams=1,max_gen_length=64,min_gen_length=1,repetition_penalty=1.0,length_penalty=1.0, num_return_sequences=1): + input_embeds, user_embeds = self.wrap_emb(batch) + if self.hparams.router == 'share': + gate_weights = self.router(user_embeds) + generate_ids = self.llama_model.generate( + inputs_embeds=input_embeds, + attention_mask=batch["tokens"].attention_mask, + temperature=temperature, + do_sample=do_sample, + num_beams=num_beams, + max_new_tokens=max_gen_length, + min_new_tokens=min_gen_length, + pad_token_id=self.llama_tokenizer.pad_token_id, + repetition_penalty=repetition_penalty, + length_penalty=length_penalty, + num_return_sequences=num_return_sequences, + user_embeds=user_embeds, + gate_weights = gate_weights + ) + output_text=self.llama_tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False) + outputs=[text.strip() for text in output_text] + return outputs + + gate_weights = self.router(user_embeds) + + generate_ids = self.llama_model.generate( + inputs_embeds=input_embeds, + attention_mask=batch["tokens"].attention_mask, + temperature=temperature, + do_sample=do_sample, + num_beams=num_beams, + max_new_tokens=max_gen_length, + min_new_tokens=min_gen_length, + pad_token_id=self.llama_tokenizer.pad_token_id, + repetition_penalty=repetition_penalty, + length_penalty=length_penalty, + num_return_sequences=num_return_sequences, + + user_embeds=user_embeds, + gate_weights = gate_weights + ) + output_text=self.llama_tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False) + outputs=[text.strip() for text in output_text] + return outputs + + def capture_and_store_gradients(self): + for name, param in self.llama_model.named_parameters(): + if "lora" in name and param.grad is not None: + if name not in self.gradient_storage: + self.gradient_storage[name] = [] + self.gradient_storage[name].append(param.grad.clone().detach()) + + if self.trainer.global_step % 10 == 0: + self.save_gradients_to_file() + + def save_gradients_to_file(self): + directory = self.hparams.capture_dir + if not os.path.exists(directory): + os.makedirs(directory) + file_path = os.path.join(directory, f'gradients_step_{self.trainer.global_step}.pkl') + with open(file_path, 'wb') as f: + pickle.dump(self.gradient_storage, f) + self.gradient_storage = {} + + def training_step(self, batch, batch_idx): + if self.scheduler: + self.scheduler.step(self.trainer.global_step, self.current_epoch, self.trainer.max_steps) + if batch["flag"]: + for name, param in self.projector.named_parameters(): + param.requires_grad = False + else: + for name, param in self.projector.named_parameters(): + param.requires_grad = True + out = self(batch) + loss = self.configure_loss(out) + self.log('loss', loss, on_step=True, on_epoch=True, prog_bar=True) + self.log('lr', self.scheduler.optimizer.param_groups[0]['lr'], on_step=True, on_epoch=True, prog_bar=True) + self.log('global_step_num', self.trainer.global_step, on_step=True, on_epoch=True, prog_bar=True) + + return loss + + def on_validation_epoch_start(self): + self.val_content={ + "generate":[], + "real":[], + "cans":[], + } + + @torch.no_grad() + def validation_step(self, batch, batch_idx): + generate_output = self.generate(batch) + output=[] + for i,generate in enumerate(generate_output): + real=batch['correct_answer'][i] + cans=batch['cans_name'][i] + generate=generate.strip().split("\n")[0] + output.append((generate,real,cans)) + return output + + def on_validation_batch_end(self, outputs, batch, batch_idx, dataloader_idx): + for generate,real,cans in outputs: + self.val_content["generate"].append(generate) + self.val_content["real"].append(real) + self.val_content["cans"].append(cans) + + def on_validation_epoch_end(self): + df=DataFrame(self.val_content) + if not os.path.exists(self.hparams.output_dir): + os.makedirs(self.hparams.output_dir) + df.to_csv(op.join(self.hparams.output_dir, 'valid.csv')) + prediction_valid_ratio,hr=self.calculate_hr1(self.val_content) + metric=hr*prediction_valid_ratio + self.log('val_prediction_valid', prediction_valid_ratio, on_step=False, on_epoch=True, prog_bar=True) + self.log('val_hr', hr, on_step=False, on_epoch=True, prog_bar=True) + self.log('metric', metric, on_step=False, on_epoch=True, prog_bar=True) + + def on_test_epoch_start(self): + self.test_content={ + "generate":[], + "real":[], + "cans":[], + } + + @torch.no_grad() + def test_step(self, batch, batch_idx): + generate_output = self.generate(batch) + output=[] + for i,generate in enumerate(generate_output): + real=batch['correct_answer'][i] + cans=batch['cans_name'][i] + generate=generate.strip().split("\n")[0] + output.append((generate,real,cans)) + return output + + def on_test_batch_end(self, outputs, batch, batch_idx, dataloader_idx): + for generate,real,cans in outputs: + self.test_content["generate"].append(generate) + self.test_content["real"].append(real) + self.test_content["cans"].append(cans) + + def on_test_epoch_end(self): + df=DataFrame(self.test_content) + if not os.path.exists(self.hparams.output_dir): + os.makedirs(self.hparams.output_dir) + df.to_csv(op.join(self.hparams.output_dir, 'test.csv')) + prediction_valid_ratio,hr=self.calculate_hr1(self.test_content) + metric=hr*prediction_valid_ratio + + self.log('test_prediction_valid', prediction_valid_ratio, on_step=False, on_epoch=True, prog_bar=True) + self.log('test_hr', hr, on_step=False, on_epoch=True, prog_bar=True) + self.log('metric', metric, on_step=False, on_epoch=True, prog_bar=True) + + def configure_optimizers(self): + if hasattr(self.hparams, 'weight_decay'): + weight_decay = self.hparams.weight_decay + else: + weight_decay = 0 + optimizer = torch.optim.SGD([ + {'params': self.projector.parameters(), 'lr': self.hparams.lr, 'weight_decay':weight_decay}, + + {'params': self.router.parameters(), 'lr': self.hparams.lr * 0.3, 'weight_decay':weight_decay}, + + {'params': [p for n, p in self.llama_model.named_parameters() if "gating" not in n], 'lr': self.hparams.lr}, + # {'params': [p for n, p in self.llama_model.named_parameters() if "gating" in n], 'lr': self.hparams.lr * 1, 'weight_decay':weight_decay} + + # {'params': self.llama_model.parameters(), 'lr': self.hparams.lr}, + ]) + + + for i, param_group in enumerate(optimizer.param_groups): + print(f"Initial LR for group {i}: {param_group['lr']}") + total_params = sum(p.numel() for p in param_group['params']) + print(f"Parameter Group {i}: {total_params} parameters") + + if self.hparams.lr_scheduler is None: + return optimizer + else: + max_step = self.trainer.max_steps + warmup_steps = max_step // 20 + print(f'max_step: {max_step}') + print(f'warmup_steps: {warmup_steps}') + if self.hparams.lr_scheduler == 'cosine': + + init_lr_list = [ + self.hparams.lr, + self.hparams.lr * 0.3, + self.hparams.lr * 1 + ] + min_lr_list = [ + self.hparams.lr_decay_min_lr, + self.hparams.lr_decay_min_lr * 0.3, + self.hparams.lr_decay_min_lr * 1 + ] + warmup_start_lr_list = [ + self.hparams.lr_warmup_start_lr, + self.hparams.lr_warmup_start_lr * 0.3, + self.hparams.lr_warmup_start_lr * 1 + ] + self.scheduler = LinearWarmupCosineLRScheduler( + optimizer=optimizer, + max_step=max_step, + min_lr_list=min_lr_list, + init_lr_list=init_lr_list, + warmup_steps=warmup_steps, + warmup_start_lr_list=warmup_start_lr_list + ) + + + for i, param_group in enumerate(optimizer.param_groups): + print(f"Initial LR for group {i}: {param_group['lr']}") + total_params = sum(p.numel() for p in param_group['params']) + print(f"Parameter Group {i}: {total_params} parameters") + + + else: + self.scheduler = None + raise ValueError('Invalid lr_scheduler type!') + return optimizer + + def configure_loss(self, out, labels=None): + loss = self.hparams.loss.lower() + if loss == 'lm': + return out.loss + else: + raise ValueError("Invalid Loss Type!") + + def on_save_checkpoint(self, checkpoint): + if self.hparams.save == 'part': + checkpoint.pop('optimizer_states') + to_be_removed = [] + for key, value in checkpoint['state_dict'].items(): + try: + if not self.get_parameter(key).requires_grad: + to_be_removed.append(key) + except AttributeError: + to_be_removed.append(key) + for key in to_be_removed: + checkpoint['state_dict'].pop(key) + elif self.hparams.save == 'all': + pass + + def load_llm(self, llm_path): + print('Loading LLAMA') + self.llama_tokenizer = LlamaTokenizer.from_pretrained(llm_path, use_fast=False) + self.llama_tokenizer.pad_token = self.llama_tokenizer.eos_token + self.llama_tokenizer.add_special_tokens({'pad_token': '[PAD]'}) + self.llama_tokenizer.padding_side = "right" + self.llama_tokenizer.add_special_tokens({'additional_special_tokens': ['[PH]','[HistoryEmb]','[CansEmb]','[ItemEmb]']}) + self.llama_model = LlamaForCausalLM.from_pretrained(llm_path, device_map="auto",load_in_8bit=True) + self.llama_model.resize_token_embeddings(len(self.llama_tokenizer)) + if self.hparams.llm_tuning == 'lora': + if self.hparams.peft_dir: + self.llama_model = PeftModel.from_pretrained(self.llm_model, self.hparams.peft_dir, is_trainable=True) + else: + if self.hparams.peft_config: + peft_config = LoraConfig(**LoraConfig.from_json_file(self.hparams.peft_config)) + else: + peft_config = LoraConfig(task_type=TaskType.CAUSAL_LM, + inference_mode=False, + r=self.hparams.lora_r, + lora_alpha=self.hparams.lora_alpha, + lora_dropout=self.hparams.lora_dropout, + target_modules=['k_proj', 'v_proj', 'q_proj', 'o_proj', 'gate_proj', 'up_proj', 'down_proj']) + self.peft_config = peft_config + self.llama_model = get_peft_model(self.llama_model, peft_config) + self.llama_model.print_trainable_parameters() + elif self.hparams.llm_tuning == 'freeze': + for name, param in self.llama_model.named_parameters(): + param.requires_grad = False + elif self.hparams.llm_tuning == 'freeze_lora': + if self.hparams.peft_dir: + self.llama_model = PeftModel.from_pretrained(self.llm_model, self.hparams.peft_dir, is_trainable=True) + else: + if self.hparams.peft_config: + peft_config = LoraConfig(**LoraConfig.from_json_file(self.hparams.peft_config)) + else: + peft_config = LoraConfig(task_type=TaskType.CAUSAL_LM, + inference_mode=False, + r=self.hparams.lora_r, + lora_alpha=self.hparams.lora_alpha, + lora_dropout=self.hparams.lora_dropout, + target_modules=['k_proj', 'v_proj', 'q_proj', 'o_proj', 'gate_proj', 'up_proj', 'down_proj']) + self.peft_config = peft_config + self.llama_model = get_peft_model(self.llama_model, peft_config) + for name, param in self.llama_model.named_parameters(): + param.requires_grad = False + self.llama_model.print_trainable_parameters() + elif self.hparams.llm_tuning == 'moelora': + if self.hparams.peft_dir: + self.llama_model = PeftModel.from_pretrained(self.llm_model, self.hparams.peft_dir, is_trainable=True) + else: + if self.hparams.peft_config: + peft_config = MoeLoraConfig(**MoeLoraConfig.from_json_file(self.hparams.peft_config)) + else: + peft_config = MoeLoraConfig(task_type=TaskType.CAUSAL_LM, + inference_mode=False, + r=self.hparams.lora_r, + lora_alpha=self.hparams.lora_alpha, + lora_dropout=self.hparams.lora_dropout, + target_modules=['k_proj', 'v_proj', 'q_proj', 'o_proj', 'gate_proj', 'up_proj', 'down_proj'], + num_moe=self.hparams.num_moe, + gating=self.hparams.gating) + self.peft_config = peft_config + self.llama_model = get_peft_model(self.llama_model, peft_config) + + """for name, param in self.llama_model.named_parameters(): + if "gating" not in name: + param.requires_grad = False""" + self.llama_model.print_trainable_parameters() + else: + raise NotImplementedError() + + print('Loading LLAMA Done') + + def load_projector(self): + name = self.hparams.model_name + camel_name = ''.join([i.capitalize() for i in name.split('_')]) + try: + Model = getattr(importlib.import_module( + '.'+name, package=__package__), camel_name) + except: + raise ValueError( + f'Invalid Module File Name or Invalid Class Name {name}.{camel_name}!') + self.projector = self.instancialize(Model, rec_size=self.hparams.rec_size, llm_size=self.llama_model.config.hidden_size) + + def instancialize(self, Model, **other_args): + class_args = inspect.getargspec(Model.__init__).args[1:] + inkeys = self.hparams.keys() + args1 = {} + for arg in class_args: + if arg in inkeys: + args1[arg] = getattr(self.hparams, arg) + args1.update(other_args) + # args1: args在hparams中有的部分 + return Model(**args1) + + def load_rec_model(self, rec_model_path): + print('Loading Rec Model') + self.rec_model = torch.load(rec_model_path, map_location="cpu") + self.rec_model.eval() + for name, param in self.rec_model.named_parameters(): + param.requires_grad = False + print('Loding Rec model Done') + + def encode_items(self, seq): + if self.hparams.rec_embed=="SASRec": + item_rec_embs=self.rec_model.cacu_x(seq) + elif self.hparams.rec_embed in ['Caser','GRU']: + item_rec_embs=self.rec_model.item_embeddings(seq) + item_txt_embs=self.projector(item_rec_embs) + return item_txt_embs + + def encode_users(self, seq, len_seq): + if self.hparams.rec_embed=="SASRec": + user_rec_embs=self.rec_model.cacul_h(seq, len_seq) + elif self.hparams.rec_embed in ['Caser','GRU']: + user_rec_embs=self.rec_model.item_embeddings(seq) + + user_txt_embs=self.projector(user_rec_embs) + return user_rec_embs + + def embed_tokens(self, token_ids): + embeds = self.llama_model.base_model.embed_tokens(token_ids) + return embeds + + # batch -> embeds + def wrap_emb(self, batch): + input_embeds = self.llama_model.get_input_embeddings()(batch["tokens"].input_ids) + + + + his_token_id=self.llama_tokenizer("[HistoryEmb]", return_tensors="pt",add_special_tokens=False).input_ids.item() + cans_token_id=self.llama_tokenizer("[CansEmb]", return_tensors="pt",add_special_tokens=False).input_ids.item() + item_token_id=self.llama_tokenizer("[ItemEmb]", return_tensors="pt",add_special_tokens=False).input_ids.item() + + + his_item_embeds = self.encode_items(batch["seq"]) + cans_item_embeds = self.encode_items(batch["cans"]) + item_embeds=self.encode_items(batch["item_id"]) + + + user_embeds=self.encode_users(batch["seq"], batch["len_seq"]) + + for i in range(len(batch["len_seq"])): + if (batch["tokens"].input_ids[i]==his_token_id).nonzero().shape[0]>0: + idx_tensor=(batch["tokens"].input_ids[i]==his_token_id).nonzero().view(-1) + for idx, item_emb in zip(idx_tensor,his_item_embeds[i,:batch["len_seq"][i].item()]): + input_embeds[i,idx]=item_emb + if (batch["tokens"].input_ids[i]==cans_token_id).nonzero().shape[0]>0: + idx_tensor=(batch["tokens"].input_ids[i]==cans_token_id).nonzero().view(-1) + for idx, item_emb in zip(idx_tensor,cans_item_embeds[i,:batch["len_cans"][i].item()]): + input_embeds[i,idx]=item_emb + if (batch["tokens"].input_ids[i]==item_token_id).nonzero().shape[0]>0: + idx=(batch["tokens"].input_ids[i]==item_token_id).nonzero().item() + input_embeds[i,idx]=item_embeds[i] + + return input_embeds, user_embeds + + def calculate_hr1(self,eval_content): + correct_num=0 + valid_num=0 + total_num=0 + for i,generate in enumerate(eval_content["generate"]): + real=eval_content["real"][i] + cans=eval_content["cans"][i] + total_num+=1 + generate=generate.strip().lower().strip() + real=real.strip().lower().strip() + cans=[item.strip().lower().strip() for item in cans] + gen_cans_list=[] + for cans_item in cans: + if cans_item in generate: + gen_cans_list.append(cans_item) + if len(gen_cans_list)==1: + valid_num+=1 + if real == gen_cans_list[0]: + correct_num+=1 + valid_ratio=valid_num/total_num + if valid_num>0: + hr1=correct_num/valid_num + else: + hr1=0 + return valid_ratio,hr1 diff --git a/model/peft/__init__.py b/model/peft/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9cc94f7c2d5370276920e06dee87a1dd8a414d35 --- /dev/null +++ b/model/peft/__init__.py @@ -0,0 +1,61 @@ +# flake8: noqa +# There's no way to ignore "F401 '...' imported but unused" warnings in this +# module, but to preserve other warnings. So, don't check this module at all. + +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__version__ = "0.4.0.dev0" + +from .mapping import MODEL_TYPE_TO_PEFT_MODEL_MAPPING, PEFT_TYPE_TO_CONFIG_MAPPING, get_peft_config, get_peft_model +from .peft_model import ( + PeftModel, + PeftModelForCausalLM, + PeftModelForSeq2SeqLM, + PeftModelForSequenceClassification, + PeftModelForTokenClassification, + PeftModelForQuestionAnswering, +) +from .tuners import ( + AdaptionPromptConfig, + AdaptionPromptModel, + LoraConfig, + LoraModel, + AdaLoraConfig, + AdaLoraModel, + PrefixEncoder, + PrefixTuningConfig, + PromptEmbedding, + PromptEncoder, + PromptEncoderConfig, + PromptEncoderReparameterizationType, + PromptTuningConfig, + PromptTuningInit, + MoeLoraConfig, + MoeLoraModel, +) +from .utils import ( + TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPING, + PeftConfig, + PeftType, + PromptLearningConfig, + TaskType, + bloom_model_postprocess_past_key_value, + get_peft_model_state_dict, + prepare_model_for_int8_training, + prepare_model_for_kbit_training, + set_peft_model_state_dict, + shift_tokens_right, +) diff --git a/model/peft/import_utils.py b/model/peft/import_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..875e0e2c35e7672b6e10f9327dc331a4b8324590 --- /dev/null +++ b/model/peft/import_utils.py @@ -0,0 +1,28 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import importlib + + +def is_bnb_available(): + return importlib.util.find_spec("bitsandbytes") is not None + + +def is_bnb_4bit_available(): + if not is_bnb_available(): + return False + + import bitsandbytes as bnb + + return hasattr(bnb.nn, "Linear4bit") diff --git a/model/peft/mapping.py b/model/peft/mapping.py new file mode 100644 index 0000000000000000000000000000000000000000..13e933b37bd73ecc22517d75222268822d5f3cfb --- /dev/null +++ b/model/peft/mapping.py @@ -0,0 +1,134 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Dict + +from .peft_model import ( + PeftModel, + PeftModelForCausalLM, + PeftModelForQuestionAnswering, + PeftModelForSeq2SeqLM, + PeftModelForSequenceClassification, + PeftModelForTokenClassification, +) +from .tuners import ( + AdaLoraConfig, + AdaptionPromptConfig, + LoraConfig, + PrefixTuningConfig, + PromptEncoderConfig, + PromptTuningConfig, + MoeLoraConfig, +) +from .utils import PromptLearningConfig + + +if TYPE_CHECKING: + from transformers import PreTrainedModel + + from .utils.config import PeftConfig + + +MODEL_TYPE_TO_PEFT_MODEL_MAPPING = { + "SEQ_CLS": PeftModelForSequenceClassification, + "SEQ_2_SEQ_LM": PeftModelForSeq2SeqLM, + "CAUSAL_LM": PeftModelForCausalLM, + "TOKEN_CLS": PeftModelForTokenClassification, + "QUESTION_ANS": PeftModelForQuestionAnswering, +} + +PEFT_TYPE_TO_CONFIG_MAPPING = { + "ADAPTION_PROMPT": AdaptionPromptConfig, + "PROMPT_TUNING": PromptTuningConfig, + "PREFIX_TUNING": PrefixTuningConfig, + "P_TUNING": PromptEncoderConfig, + "LORA": LoraConfig, + "ADALORA": AdaLoraConfig, + "MOELORA": MoeLoraConfig, +} + + +def get_peft_config(config_dict: Dict[str, Any]): + """ + Returns a Peft config object from a dictionary. + + Args: + config_dict (`Dict[str, Any]`): Dictionary containing the configuration parameters. + """ + + return PEFT_TYPE_TO_CONFIG_MAPPING[config_dict["peft_type"]](**config_dict) + + +def _prepare_prompt_learning_config(peft_config: PeftConfig, model_config: Dict[str, Any]): + if peft_config.num_layers is None: + if "num_hidden_layers" in model_config: + num_layers = model_config["num_hidden_layers"] + elif "num_layers" in model_config: + num_layers = model_config["num_layers"] + elif "n_layer" in model_config: + num_layers = model_config["n_layer"] + else: + raise ValueError("Please specify `num_layers` in `peft_config`") + peft_config.num_layers = num_layers + + if peft_config.token_dim is None: + if "hidden_size" in model_config: + token_dim = model_config["hidden_size"] + elif "n_embd" in model_config: + token_dim = model_config["n_embd"] + elif "d_model" in model_config: + token_dim = model_config["d_model"] + else: + raise ValueError("Please specify `token_dim` in `peft_config`") + peft_config.token_dim = token_dim + + if peft_config.num_attention_heads is None: + if "num_attention_heads" in model_config: + num_attention_heads = model_config["num_attention_heads"] + elif "n_head" in model_config: + num_attention_heads = model_config["n_head"] + elif "num_heads" in model_config: + num_attention_heads = model_config["num_heads"] + elif "encoder_attention_heads" in model_config: + num_attention_heads = model_config["encoder_attention_heads"] + else: + raise ValueError("Please specify `num_attention_heads` in `peft_config`") + peft_config.num_attention_heads = num_attention_heads + + if getattr(peft_config, "encoder_hidden_size", None) is None: + setattr(peft_config, "encoder_hidden_size", peft_config.token_dim) + + return peft_config + + +def get_peft_model(model: PreTrainedModel, peft_config: PeftConfig, adapter_name: str = "default") -> PeftModel: + """ + Returns a Peft model object from a model and a config. + + Args: + model ([`transformers.PreTrainedModel`]): Model to be wrapped. + peft_config ([`PeftConfig`]): Configuration object containing the parameters of the Peft model. + """ + model_config = model.config.to_dict() if hasattr(model.config, "to_dict") else model.config + peft_config.base_model_name_or_path = model.__dict__.get("name_or_path", None) + if peft_config.task_type not in MODEL_TYPE_TO_PEFT_MODEL_MAPPING.keys() and not isinstance( + peft_config, PromptLearningConfig + ): + return PeftModel(model, peft_config, adapter_name=adapter_name) + if isinstance(peft_config, PromptLearningConfig): + peft_config = _prepare_prompt_learning_config(peft_config, model_config) + return MODEL_TYPE_TO_PEFT_MODEL_MAPPING[peft_config.task_type](model, peft_config, adapter_name=adapter_name) diff --git a/model/peft/peft_model.py b/model/peft/peft_model.py new file mode 100644 index 0000000000000000000000000000000000000000..2dd249025640018a98e4ea77665f875406f3cecf --- /dev/null +++ b/model/peft/peft_model.py @@ -0,0 +1,1619 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import inspect +import os +import warnings +from contextlib import contextmanager +from copy import deepcopy +from typing import Any, Dict, Optional, Union + +import torch +from accelerate import dispatch_model, infer_auto_device_map +from accelerate.hooks import AlignDevicesHook, add_hook_to_module, remove_hook_from_submodules +from accelerate.utils import get_balanced_memory +from huggingface_hub import hf_hub_download +from huggingface_hub.utils import EntryNotFoundError +from safetensors.torch import load_file as safe_load_file +from safetensors.torch import save_file as safe_save_file +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss +from transformers import PreTrainedModel +from transformers.modeling_outputs import QuestionAnsweringModelOutput, SequenceClassifierOutput, TokenClassifierOutput +from transformers.utils import PushToHubMixin + +from . import __version__ +from .tuners import ( + AdaLoraModel, + AdaptionPromptModel, + LoraModel, + PrefixEncoder, + PromptEmbedding, + PromptEncoder, + MoeLoraModel, +) +from .utils import ( + SAFETENSORS_WEIGHTS_NAME, + TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPING, + WEIGHTS_NAME, + PeftConfig, + PeftType, + PromptLearningConfig, + TaskType, + _set_adapter, + _set_trainable, + add_library_to_model_card, + get_peft_model_state_dict, + hub_file_exists, + set_peft_model_state_dict, + shift_tokens_right, +) + + +PEFT_TYPE_TO_MODEL_MAPPING = { + PeftType.LORA: LoraModel, + PeftType.PROMPT_TUNING: PromptEmbedding, + PeftType.P_TUNING: PromptEncoder, + PeftType.PREFIX_TUNING: PrefixEncoder, + PeftType.ADALORA: AdaLoraModel, + PeftType.ADAPTION_PROMPT: AdaptionPromptModel, + PeftType.MOELORA: MoeLoraModel, +} + + +class PeftModel(PushToHubMixin, torch.nn.Module): + """ + Base model encompassing various Peft methods. + + Args: + model ([`~transformers.PreTrainedModel`]): The base transformer model used for Peft. + peft_config ([`PeftConfig`]): The configuration of the Peft model. + + + **Attributes**: + - **base_model** ([`~transformers.PreTrainedModel`]) -- The base transformer model used for Peft. + - **peft_config** ([`PeftConfig`]) -- The configuration of the Peft model. + - **modules_to_save** (`list` of `str`) -- The list of sub-module names to save when + saving the model. + - **prompt_encoder** ([`PromptEncoder`]) -- The prompt encoder used for Peft if + using [`PromptLearningConfig`]. + - **prompt_tokens** (`torch.Tensor`) -- The virtual prompt tokens used for Peft if + using [`PromptLearningConfig`]. + - **transformer_backbone_name** (`str`) -- The name of the transformer + backbone in the base model if using [`PromptLearningConfig`]. + - **word_embeddings** (`torch.nn.Embedding`) -- The word embeddings of the transformer backbone + in the base model if using [`PromptLearningConfig`]. + """ + + def __init__(self, model: PreTrainedModel, peft_config: PeftConfig, adapter_name: str = "default"): + super().__init__() + self.base_model = model + self.config = self.base_model.config + self.modules_to_save = None + self.peft_config = {} + self.active_adapter = adapter_name + self.peft_type = peft_config.peft_type + self.base_model_torch_dtype = getattr(model, "dtype", None) + if not isinstance(peft_config, PromptLearningConfig): + self.peft_config[adapter_name] = peft_config + self.base_model = PEFT_TYPE_TO_MODEL_MAPPING[peft_config.peft_type]( + self.base_model, self.peft_config, adapter_name + ) + self.set_additional_trainable_modules(peft_config, adapter_name) + else: + self.add_adapter(adapter_name, peft_config) + + if getattr(model, "is_gradient_checkpointing", True): + model = self._prepare_model_for_gradient_checkpointing(model) + + def save_pretrained(self, save_directory: str, safe_serialization: bool = False, **kwargs: Any): + r""" + This function saves the adapter model and the adapter configuration files to a directory, so that it can be + reloaded using the [`LoraModel.from_pretrained`] class method, and also used by the [`LoraModel.push_to_hub`] + method. + + Args: + save_directory (`str`): + Directory where the adapter model and configuration files will be saved (will be created if it does not + exist). + kwargs (additional keyword arguments, *optional*): + Additional keyword arguments passed along to the `push_to_hub` method. + """ + if os.path.isfile(save_directory): + raise ValueError(f"Provided path ({save_directory}) should be a directory, not a file") + os.makedirs(save_directory, exist_ok=True) + self.create_or_update_model_card(save_directory) + + for adapter_name, peft_config in self.peft_config.items(): + # save only the trainable weights + output_state_dict = get_peft_model_state_dict( + self, state_dict=kwargs.get("state_dict", None), adapter_name=adapter_name + ) + output_dir = os.path.join(save_directory, adapter_name) if adapter_name != "default" else save_directory + os.makedirs(output_dir, exist_ok=True) + + if safe_serialization: + safe_save_file( + output_state_dict, os.path.join(output_dir, SAFETENSORS_WEIGHTS_NAME), metadata={"format": "pt"} + ) + else: + torch.save(output_state_dict, os.path.join(output_dir, WEIGHTS_NAME)) + + # save the config and change the inference mode to `True` + if peft_config.base_model_name_or_path is None: + peft_config.base_model_name_or_path = ( + self.base_model.__dict__.get("name_or_path", None) + if isinstance(peft_config, PromptLearningConfig) + else self.base_model.model.__dict__.get("name_or_path", None) + ) + inference_mode = peft_config.inference_mode + peft_config.inference_mode = True + peft_config.save_pretrained(output_dir) + peft_config.inference_mode = inference_mode + + @classmethod + def from_pretrained( + cls, + model: PreTrainedModel, + model_id: Union[str, os.PathLike], + adapter_name: str = "default", + is_trainable: bool = False, + config: Optional[PeftConfig] = None, + **kwargs: Any, + ): + r""" + Instantiate a [`LoraModel`] from a pretrained Lora configuration and weights. + + Args: + model ([`~transformers.PreTrainedModel`]): + The model to be adapted. The model should be initialized with the + [`~transformers.PreTrainedModel.from_pretrained`] method from the 🤗 Transformers library. + model_id (`str` or `os.PathLike`): + The name of the Lora configuration to use. Can be either: + - A string, the `model id` of a Lora configuration hosted inside a model repo on the Hugging Face + Hub. + - A path to a directory containing a Lora configuration file saved using the `save_pretrained` + method (`./my_lora_config_directory/`). + adapter_name (`str`, *optional*, defaults to `"default"`): + The name of the adapter to be loaded. This is useful for loading multiple adapters. + is_trainable (`bool`, *optional*, defaults to `False`): + Whether the adapter should be trainable or not. If `False`, the adapter will be frozen and use for + inference + config ([`~peft.PeftConfig`], *optional*): + The configuration object to use instead of an automatically loaded configuation. This configuration + object is mutually exclusive with `model_id` and `kwargs`. This is useful when configuration is already + loaded before calling `from_pretrained`. + kwargs: (`optional`): + Additional keyword arguments passed along to the specific Lora configuration class. + """ + from .mapping import MODEL_TYPE_TO_PEFT_MODEL_MAPPING, PEFT_TYPE_TO_CONFIG_MAPPING + + # load the config + if config is None: + config = PEFT_TYPE_TO_CONFIG_MAPPING[ + PeftConfig._get_peft_type( + model_id, + subfolder=kwargs.get("subfolder", None), + revision=kwargs.get("revision", None), + cache_dir=kwargs.get("cache_dir", None), + ) + ].from_pretrained(model_id, subfolder=kwargs.get("subfolder", None), **kwargs) + elif isinstance(config, PeftConfig): + config.inference_mode = not is_trainable + else: + raise ValueError(f"The input config must be a PeftConfig, got {config.__class__}") + + if (getattr(model, "hf_device_map", None) is not None) and len( + set(model.hf_device_map.values()).intersection({"cpu", "disk"}) + ) > 0: + remove_hook_from_submodules(model) + + if isinstance(config, PromptLearningConfig) and is_trainable: + raise ValueError("Cannot set a prompt learning adapter to trainable when loading pretrained adapter.") + else: + config.inference_mode = not is_trainable + + if config.task_type not in MODEL_TYPE_TO_PEFT_MODEL_MAPPING.keys(): + model = cls(model, config, adapter_name) + else: + model = MODEL_TYPE_TO_PEFT_MODEL_MAPPING[config.task_type](model, config, adapter_name) + model.load_adapter(model_id, adapter_name, is_trainable=is_trainable, **kwargs) + return model + + def _setup_prompt_encoder(self, adapter_name: str): + config = self.peft_config[adapter_name] + self.prompt_encoder = torch.nn.ModuleDict({}) + self.prompt_tokens = {} + transformer_backbone = None + for name, module in self.base_model.named_children(): + for param in module.parameters(): + param.requires_grad = False + if isinstance(module, PreTrainedModel): + # Make sure to freeze Tranformers model + if transformer_backbone is None: + transformer_backbone = module + self.transformer_backbone_name = name + + if config.num_transformer_submodules is None: + config.num_transformer_submodules = 2 if config.task_type == TaskType.SEQ_2_SEQ_LM else 1 + + for named_param, value in list(transformer_backbone.named_parameters()): + if value.shape[0] == self.base_model.config.vocab_size: + self.word_embeddings = transformer_backbone.get_submodule(named_param.replace(".weight", "")) + break + + if config.peft_type == PeftType.PROMPT_TUNING: + prompt_encoder = PromptEmbedding(config, self.word_embeddings) + elif config.peft_type == PeftType.P_TUNING: + prompt_encoder = PromptEncoder(config) + elif config.peft_type == PeftType.PREFIX_TUNING: + prompt_encoder = PrefixEncoder(config) + else: + raise ValueError("Not supported") + self.prompt_encoder.update(torch.nn.ModuleDict({adapter_name: prompt_encoder})) + self.prompt_tokens[adapter_name] = torch.arange( + config.num_virtual_tokens * config.num_transformer_submodules + ).long() + + def _prepare_model_for_gradient_checkpointing(self, model: PreTrainedModel): + r""" + Prepares the model for gradient checkpointing if necessary + """ + if not (getattr(model, "is_loaded_in_8bit", False) or getattr(model, "is_loaded_in_4bit", False)): + if hasattr(model, "enable_input_require_grads"): + model.enable_input_require_grads() + else: + + def make_inputs_require_grad(module, input, output): + output.requires_grad_(True) + + model.get_input_embeddings().register_forward_hook(make_inputs_require_grad) + return model + + def get_prompt_embedding_to_save(self, adapter_name: str): + """ + Returns the prompt embedding to save when saving the model. Only applicable when `peft_config.peft_type != + PeftType.LORA`. + """ + prompt_encoder = self.prompt_encoder[adapter_name] + prompt_tokens = ( + self.prompt_tokens[adapter_name].unsqueeze(0).expand(1, -1).to(prompt_encoder.embedding.weight.device) + ) + if self.peft_config[adapter_name].peft_type == PeftType.PREFIX_TUNING: + prompt_tokens = prompt_tokens[:, : self.peft_config[adapter_name].num_virtual_tokens] + prompt_embeddings = prompt_encoder(prompt_tokens) + return prompt_embeddings[0].detach().cpu() + + def get_prompt(self, batch_size: int): + """ + Returns the virtual prompts to use for Peft. Only applicable when `peft_config.peft_type != PeftType.LORA`. + """ + peft_config = self.active_peft_config + prompt_encoder = self.prompt_encoder[self.active_adapter] + prompt_tokens = ( + self.prompt_tokens[self.active_adapter] + .unsqueeze(0) + .expand(batch_size, -1) + .to(prompt_encoder.embedding.weight.device) + ) + if peft_config.peft_type == PeftType.PREFIX_TUNING: + prompt_tokens = prompt_tokens[:, : peft_config.num_virtual_tokens] + if peft_config.inference_mode: + past_key_values = prompt_encoder.embedding.weight.repeat(batch_size, 1, 1) + else: + past_key_values = prompt_encoder(prompt_tokens) + if self.base_model_torch_dtype is not None: + past_key_values = past_key_values.to(self.base_model_torch_dtype) + past_key_values = past_key_values.view( + batch_size, + peft_config.num_virtual_tokens, + peft_config.num_layers * 2, + peft_config.num_attention_heads, + peft_config.token_dim // peft_config.num_attention_heads, + ) + if peft_config.num_transformer_submodules == 2: + past_key_values = torch.cat([past_key_values, past_key_values], dim=2) + past_key_values = past_key_values.permute([2, 0, 3, 1, 4]).split( + peft_config.num_transformer_submodules * 2 + ) + if TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPING.get(self.config.model_type, None) is not None: + post_process_fn = TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPING[self.config.model_type] + past_key_values = post_process_fn(past_key_values) + return past_key_values + else: + if peft_config.inference_mode: + prompts = prompt_encoder.embedding.weight.repeat(batch_size, 1, 1) + else: + prompts = prompt_encoder(prompt_tokens) + return prompts + + def print_trainable_parameters(self): + """ + Prints the number of trainable parameters in the model. + """ + trainable_params = 0 + all_param = 0 + for _, param in self.named_parameters(): + num_params = param.numel() + # if using DS Zero 3 and the weights are initialized empty + if num_params == 0 and hasattr(param, "ds_numel"): + num_params = param.ds_numel + + all_param += num_params + if param.requires_grad: + trainable_params += num_params + print( + f"trainable params: {trainable_params:,d} || all params: {all_param:,d} || trainable%: {100 * trainable_params / all_param}" + ) + + def __getattr__(self, name: str): + """Forward missing attributes to the wrapped module.""" + try: + return super().__getattr__(name) # defer to nn.Module's logic + except AttributeError: + return getattr(self.base_model, name) + + def forward(self, *args: Any, **kwargs: Any): + """ + Forward pass of the model. + """ + return self.get_base_model()(*args, **kwargs) + + @contextmanager + def disable_adapter(self): + """ + Disables the adapter module. + """ + try: + if isinstance(self.peft_config[self.active_adapter], PromptLearningConfig): + old_forward = self.forward + self.forward = self.base_model.forward + else: + self.base_model.disable_adapter_layers() + yield + finally: + if isinstance(self.peft_config[self.active_adapter], PromptLearningConfig): + self.forward = old_forward + else: + self.base_model.enable_adapter_layers() + + def get_base_model(self): + """ + Returns the base model. + """ + return self.base_model if isinstance(self.active_peft_config, PromptLearningConfig) else self.base_model.model + + def add_adapter(self, adapter_name: str, peft_config: PeftConfig): + if peft_config.peft_type != self.peft_type: + raise ValueError( + f"Cannot combine adapters with different peft types. " + f"Found {self.peft_type} and {peft_config.peft_type}." + ) + self.peft_config[adapter_name] = peft_config + if isinstance(peft_config, PromptLearningConfig): + self._setup_prompt_encoder(adapter_name) + else: + self.base_model.add_adapter(adapter_name, peft_config) + + self.set_additional_trainable_modules(peft_config, adapter_name) + + def set_additional_trainable_modules(self, peft_config, adapter_name): + if getattr(peft_config, "modules_to_save", None) is not None: + if self.modules_to_save is None: + self.modules_to_save = set(peft_config.modules_to_save) + else: + self.modules_to_save.update(peft_config.modules_to_save) + _set_trainable(self, adapter_name) + + @classmethod + def _split_kwargs(cls, kwargs: Dict[str, Any]): + hf_hub_download_kwargs = {} + other_kwargs = {} + + for key, value in kwargs.items(): + if key in inspect.signature(hf_hub_download).parameters: + hf_hub_download_kwargs[key] = value + else: + other_kwargs[key] = value + + return hf_hub_download_kwargs, other_kwargs + + def load_adapter(self, model_id: str, adapter_name: str, is_trainable: bool = False, **kwargs: Any): + from .mapping import PEFT_TYPE_TO_CONFIG_MAPPING + + hf_hub_download_kwargs, kwargs = self._split_kwargs(kwargs) + + if adapter_name not in self.peft_config: + # load the config + peft_config = PEFT_TYPE_TO_CONFIG_MAPPING[ + PeftConfig._get_peft_type( + model_id, + subfolder=kwargs.get("subfolder", None), + revision=kwargs.get("revision", None), + cache_dir=kwargs.get("cache_dir", None), + ) + ].from_pretrained( + model_id, + subfolder=kwargs.get("subfolder", None), + revision=kwargs.get("revision", None), + cache_dir=kwargs.get("cache_dir", None), + ) + if isinstance(peft_config, PromptLearningConfig) and is_trainable: + raise ValueError("Cannot set a prompt learning adapter to trainable when loading pretrained adapter.") + else: + peft_config.inference_mode = not is_trainable + self.add_adapter(adapter_name, peft_config) + + # load weights if any + path = os.path.join(model_id, kwargs["subfolder"]) if kwargs.get("subfolder", None) is not None else model_id + + if os.path.exists(os.path.join(path, SAFETENSORS_WEIGHTS_NAME)): + filename = os.path.join(path, SAFETENSORS_WEIGHTS_NAME) + use_safetensors = True + elif os.path.exists(os.path.join(path, WEIGHTS_NAME)): + filename = os.path.join(path, WEIGHTS_NAME) + use_safetensors = False + else: + has_remote_safetensors_file = hub_file_exists( + model_id, SAFETENSORS_WEIGHTS_NAME, revision=kwargs.get("revision", None) + ) + use_safetensors = has_remote_safetensors_file + + if has_remote_safetensors_file: + # Priority 1: load safetensors weights + filename = hf_hub_download( + model_id, + SAFETENSORS_WEIGHTS_NAME, + subfolder=kwargs.get("subfolder", None), + **hf_hub_download_kwargs, + ) + else: + try: + filename = hf_hub_download( + model_id, WEIGHTS_NAME, subfolder=kwargs.get("subfolder", None), **hf_hub_download_kwargs + ) + except EntryNotFoundError: + raise ValueError( + f"Can't find weights for {model_id} in {model_id} or in the Hugging Face Hub. " + f"Please check that the file {WEIGHTS_NAME} or {SAFETENSORS_WEIGHTS_NAME} is present at {model_id}." + ) + + if use_safetensors: + adapters_weights = safe_load_file(filename, device="cuda" if torch.cuda.is_available() else "cpu") + else: + adapters_weights = torch.load( + filename, map_location=torch.device("cuda" if torch.cuda.is_available() else "cpu") + ) + + # load the weights into the model + load_result = set_peft_model_state_dict(self, adapters_weights, adapter_name=adapter_name) + if ( + (getattr(self, "hf_device_map", None) is not None) + and (len(set(self.hf_device_map.values()).intersection({"cpu", "disk"})) > 0) + and len(self.peft_config) == 1 + ): + device_map = kwargs.get("device_map", "auto") + max_memory = kwargs.get("max_memory", None) + offload_dir = kwargs.get("offload_folder", None) + offload_index = kwargs.get("offload_index", None) + + dispatch_model_kwargs = {} + # Safety checker for previous `accelerate` versions + # `offload_index` was introduced in https://github.com/huggingface/accelerate/pull/873/ + if "offload_index" in inspect.signature(dispatch_model).parameters: + dispatch_model_kwargs["offload_index"] = offload_index + + no_split_module_classes = self._no_split_modules + + if device_map != "sequential": + max_memory = get_balanced_memory( + self, + max_memory=max_memory, + no_split_module_classes=no_split_module_classes, + low_zero=(device_map == "balanced_low_0"), + ) + if isinstance(device_map, str): + device_map = infer_auto_device_map( + self, max_memory=max_memory, no_split_module_classes=no_split_module_classes + ) + dispatch_model( + self, + device_map=device_map, + offload_dir=offload_dir, + **dispatch_model_kwargs, + ) + hook = AlignDevicesHook(io_same_device=True) + if isinstance(self.peft_config[adapter_name], PromptLearningConfig): + remove_hook_from_submodules(self.prompt_encoder) + add_hook_to_module(self.get_base_model(), hook) + + # Set model in evaluation mode to deactivate Dropout modules by default + if not is_trainable: + self.eval() + return load_result + + def set_adapter(self, adapter_name: str): + """ + Sets the active adapter. + """ + if adapter_name not in self.peft_config: + raise ValueError(f"Adapter {adapter_name} not found.") + self.active_adapter = adapter_name + if not isinstance(self.peft_config[adapter_name], PromptLearningConfig): + self.base_model.set_adapter(adapter_name) + _set_adapter(self, adapter_name) + + @property + def active_peft_config(self): + return self.peft_config[self.active_adapter] + + def create_or_update_model_card(self, output_dir: str): + """ + Updates or create model card to include information about peft: + 1. Adds `peft` library tag + 2. Adds peft version + 3. Adds quantization information if it was used + """ + # Adds `peft` library tag + add_library_to_model_card(output_dir) + + with open(os.path.join(output_dir, "README.md"), "r") as f: + lines = f.readlines() + + quantization_config = None + if hasattr(self.config, "quantization_config"): + quantization_config = self.config.quantization_config.to_dict() + training_config_text = "" + # Adds quantization information if it was used + if quantization_config is not None: + training_config_text += "\nThe following `bitsandbytes` quantization config was used during training:\n" + training_config_text += "\n".join([f"- {name}: {value}" for name, value in quantization_config.items()]) + training_config_text += "\n" + + training_procedure_heading = "## Training procedure\n" + if training_procedure_heading in lines: + lines.insert(lines.index(training_procedure_heading) + 2, training_config_text) + else: + lines.append(f"{training_procedure_heading}\n{training_config_text}") + + # Adds peft version + framework_block_heading = "### Framework versions\n" + if framework_block_heading in lines: + lines.insert(lines.index(framework_block_heading) + 2, f"- PEFT {__version__}\n") + else: + lines.append(f"{framework_block_heading}\n\n- PEFT {__version__}\n") + + # write the lines back to README.md + with open(os.path.join(output_dir, "README.md"), "w") as f: + f.writelines(lines) + + +class PeftModelForSequenceClassification(PeftModel): + """ + Peft model for sequence classification tasks. + + Args: + model ([`~transformers.PreTrainedModel`]): Base transformer model. + peft_config ([`PeftConfig`]): Peft config. + + **Attributes**: + - **config** ([`~transformers.PretrainedConfig`]) -- The configuration object of the base model. + - **cls_layer_name** (`str`) -- The name of the classification layer. + + Example: + + ```py + >>> from transformers import AutoModelForSequenceClassification + >>> from peft import PeftModelForSequenceClassification, get_peft_config + + >>> config = { + ... "peft_type": "PREFIX_TUNING", + ... "task_type": "SEQ_CLS", + ... "inference_mode": False, + ... "num_virtual_tokens": 20, + ... "token_dim": 768, + ... "num_transformer_submodules": 1, + ... "num_attention_heads": 12, + ... "num_layers": 12, + ... "encoder_hidden_size": 768, + ... "prefix_projection": False, + ... "postprocess_past_key_value_function": None, + ... } + + >>> peft_config = get_peft_config(config) + >>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased") + >>> peft_model = PeftModelForSequenceClassification(model, peft_config) + >>> peft_model.print_trainable_parameters() + trainable params: 370178 || all params: 108680450 || trainable%: 0.3406113979101117 + ``` + """ + + def __init__(self, model, peft_config: PeftConfig, adapter_name="default"): + super().__init__(model, peft_config, adapter_name) + if self.modules_to_save is None: + self.modules_to_save = {"classifier", "score"} + else: + self.modules_to_save.update({"classifier", "score"}) + + for name, _ in self.base_model.named_children(): + if any(module_name in name for module_name in self.modules_to_save): + self.cls_layer_name = name + break + + # to make sure classifier layer is trainable + _set_trainable(self, adapter_name) + + def forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + labels=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + peft_config = self.active_peft_config + if not isinstance(peft_config, PromptLearningConfig): + return self.base_model( + input_ids=input_ids, + attention_mask=attention_mask, + inputs_embeds=inputs_embeds, + labels=labels, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + **kwargs, + ) + + batch_size = input_ids.shape[0] + if attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to(attention_mask.device) + attention_mask = torch.cat((prefix_attention_mask, attention_mask), dim=1) + if kwargs.get("position_ids", None) is not None: + warnings.warn("Position ids are not supported for parameter efficient tuning. Ignoring position ids.") + kwargs["position_ids"] = None + kwargs.update( + { + "attention_mask": attention_mask, + "labels": labels, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + } + ) + + if peft_config.peft_type == PeftType.PREFIX_TUNING: + return self._prefix_tuning_forward(input_ids=input_ids, **kwargs) + else: + if kwargs.get("token_type_ids", None) is not None: + kwargs["token_type_ids"] = torch.cat( + ( + torch.zeros(batch_size, peft_config.num_virtual_tokens).to(self.word_embeddings.weight.device), + kwargs["token_type_ids"], + ), + dim=1, + ).long() + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + inputs_embeds = torch.cat((prompts, inputs_embeds), dim=1) + return self.base_model(inputs_embeds=inputs_embeds, **kwargs) + + def _prefix_tuning_forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + labels=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + batch_size = input_ids.shape[0] + past_key_values = self.get_prompt(batch_size) + fwd_params = list(inspect.signature(self.base_model.forward).parameters.keys()) + kwargs.update( + { + "input_ids": input_ids, + "attention_mask": attention_mask, + "inputs_embeds": inputs_embeds, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + "past_key_values": past_key_values, + } + ) + if "past_key_values" in fwd_params: + return self.base_model(labels=labels, **kwargs) + else: + transformer_backbone_name = self.base_model.get_submodule(self.transformer_backbone_name) + fwd_params = list(inspect.signature(transformer_backbone_name.forward).parameters.keys()) + if "past_key_values" not in fwd_params: + raise ValueError("Model does not support past key values which are required for prefix tuning.") + outputs = transformer_backbone_name(**kwargs) + pooled_output = outputs[1] if len(outputs) > 1 else outputs[0] + if "dropout" in [name for name, _ in list(self.base_model.named_children())]: + pooled_output = self.base_model.dropout(pooled_output) + logits = self.base_model.get_submodule(self.cls_layer_name)(pooled_output) + + loss = None + if labels is not None: + if self.config.problem_type is None: + if self.base_model.num_labels == 1: + self.config.problem_type = "regression" + elif self.base_model.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.base_model.num_labels == 1: + loss = loss_fct(logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(logits.view(-1, self.base_model.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(logits, labels) + if not return_dict: + output = (logits,) + outputs[2:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutput( + loss=loss, + logits=logits, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + +class PeftModelForCausalLM(PeftModel): + """ + Peft model for causal language modeling. + + Args: + model ([`~transformers.PreTrainedModel`]): Base transformer model. + peft_config ([`PeftConfig`]): Peft config. + + + Example: + + ```py + >>> from transformers import AutoModelForCausalLM + >>> from peft import PeftModelForCausalLM, get_peft_config + + >>> config = { + ... "peft_type": "PREFIX_TUNING", + ... "task_type": "CAUSAL_LM", + ... "inference_mode": False, + ... "num_virtual_tokens": 20, + ... "token_dim": 1280, + ... "num_transformer_submodules": 1, + ... "num_attention_heads": 20, + ... "num_layers": 36, + ... "encoder_hidden_size": 1280, + ... "prefix_projection": False, + ... "postprocess_past_key_value_function": None, + ... } + + >>> peft_config = get_peft_config(config) + >>> model = AutoModelForCausalLM.from_pretrained("gpt2-large") + >>> peft_model = PeftModelForCausalLM(model, peft_config) + >>> peft_model.print_trainable_parameters() + trainable params: 1843200 || all params: 775873280 || trainable%: 0.23756456724479544 + ``` + """ + + def __init__(self, model, peft_config: PeftConfig, adapter_name="default"): + super().__init__(model, peft_config, adapter_name) + # 备份self.base_model_prepare_inputs_for_generation + self.base_model_prepare_inputs_for_generation = self.base_model.prepare_inputs_for_generation + self.base_model._validate_model_kwargs = self.base_model_validate_model_kwargs + + def forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + labels=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + peft_config = self.active_peft_config + + # 添加 + # print("kwargs = ", kwargs) + + if not isinstance(peft_config, PromptLearningConfig): + if self.base_model.config.model_type == "mpt": + if inputs_embeds is not None: + raise AssertionError("forward in MPTForCausalLM does not support inputs_embeds") + return self.base_model( + input_ids=input_ids, + attention_mask=attention_mask, + labels=labels, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + **kwargs, + ) + + return self.base_model( + input_ids=input_ids, + attention_mask=attention_mask, + inputs_embeds=inputs_embeds, + labels=labels, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + **kwargs, + ) + + batch_size = input_ids.shape[0] + if attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to(attention_mask.device) + attention_mask = torch.cat((prefix_attention_mask, attention_mask), dim=1) + + if kwargs.get("position_ids", None) is not None: + warnings.warn("Position ids are not supported for parameter efficient tuning. Ignoring position ids.") + kwargs["position_ids"] = None + if kwargs.get("token_type_ids", None) is not None: + warnings.warn("Token type ids are not supported for parameter efficient tuning. Ignoring token type ids") + kwargs["token_type_ids"] = None + kwargs.update( + { + "attention_mask": attention_mask, + "labels": labels, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + } + ) + + if peft_config.peft_type == PeftType.PREFIX_TUNING: + past_key_values = self.get_prompt(batch_size) + return self.base_model(input_ids=input_ids, past_key_values=past_key_values, **kwargs) + else: + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + # concat prompt labels + if labels is not None: + prefix_labels = torch.full((batch_size, peft_config.num_virtual_tokens), -100).to(labels.device) + kwargs["labels"] = torch.cat((prefix_labels, labels), dim=1) + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + inputs_embeds = torch.cat((prompts, inputs_embeds), dim=1) + return self.base_model(inputs_embeds=inputs_embeds, **kwargs) + + def generate(self, **kwargs): + self.base_model.prepare_inputs_for_generation = self.prepare_inputs_for_generation + if hasattr(self.base_model, "model"): + self.base_model.model.generation_config = self.generation_config + else: + self.base_model.generation_config = self.generation_config + try: + # MoeLoRAModel.generate + outputs = self.base_model.generate(**kwargs) + except: + # 引发异常 + self.base_model.prepare_inputs_for_generation = self.base_model_prepare_inputs_for_generation + raise + else: + self.base_model.prepare_inputs_for_generation = self.base_model_prepare_inputs_for_generation + return outputs + + def prepare_inputs_for_generation(self, *args, **kwargs): + peft_config = self.active_peft_config + model_kwargs = self.base_model_prepare_inputs_for_generation(*args, **kwargs) + if isinstance(peft_config, PromptLearningConfig): + if model_kwargs.get("attention_mask", None) is not None: + prefix_attention_mask = torch.ones( + model_kwargs["input_ids"].shape[0], peft_config.num_virtual_tokens + ).to(model_kwargs["input_ids"].device) + model_kwargs["attention_mask"] = torch.cat( + (prefix_attention_mask, model_kwargs["attention_mask"]), dim=1 + ) + + if model_kwargs.get("position_ids", None) is not None: + warnings.warn("Position ids are not supported for parameter efficient tuning. Ignoring position ids.") + model_kwargs["position_ids"] = None + + if kwargs.get("token_type_ids", None) is not None: + warnings.warn( + "Token type ids are not supported for parameter efficient tuning. Ignoring token type ids" + ) + kwargs["token_type_ids"] = None + + if model_kwargs["past_key_values"] is None and peft_config.peft_type == PeftType.PREFIX_TUNING: + past_key_values = self.get_prompt(batch_size=model_kwargs["input_ids"].shape[0]) + model_kwargs["past_key_values"] = past_key_values + else: + if model_kwargs["past_key_values"] is None: + inputs_embeds = self.word_embeddings(model_kwargs["input_ids"]) + prompts = self.get_prompt(batch_size=model_kwargs["input_ids"].shape[0]) + prompts = prompts.to(inputs_embeds.dtype) + model_kwargs["inputs_embeds"] = torch.cat((prompts, inputs_embeds), dim=1) + model_kwargs["input_ids"] = None + # !!! + model_kwargs["user_embeds"] = None + return model_kwargs + + # !!! + def base_model_validate_model_kwargs(self, model_kwargs: Dict[str, Any]): + """Validates model kwargs for generation. Generate argument typos will also be caught here.""" + pass + # If a `Cache` instance is passed, checks whether the model is compatible with it + if isinstance(model_kwargs.get("past_key_values", None), Cache) and not self._supports_cache_class: + raise ValueError( + f"{self.__class__.__name__} does not support an instance of `Cache` as `past_key_values`. Please " + "check the model documentation for supported cache formats." + ) + + # Excludes arguments that are handled before calling any model function + if self.config.is_encoder_decoder: + for key in ["decoder_input_ids"]: + model_kwargs.pop(key, None) + + unused_model_args = [] + model_args = set(inspect.signature(self.prepare_inputs_for_generation).parameters) + # `kwargs`/`model_kwargs` is often used to handle optional forward pass inputs like `attention_mask`. If + # `prepare_inputs_for_generation` doesn't accept them, then a stricter check can be made ;) + if "kwargs" in model_args or "model_kwargs" in model_args: + model_args |= set(inspect.signature(self.forward).parameters) + + # Encoder-Decoder models may also need Encoder arguments from `model_kwargs` + if self.config.is_encoder_decoder: + base_model = getattr(self, self.base_model_prefix, None) + + # allow encoder kwargs + encoder = getattr(self, "encoder", None) + # `MusicgenForConditionalGeneration` has `text_encoder` and `audio_encoder`. + # Also, it has `base_model_prefix = "encoder_decoder"` but there is no `self.encoder_decoder` + # TODO: A better way to handle this. + if encoder is None and base_model is not None: + encoder = getattr(base_model, "encoder", None) + + if encoder is not None: + encoder_model_args = set(inspect.signature(encoder.forward).parameters) + model_args |= encoder_model_args + + # allow decoder kwargs + decoder = getattr(self, "decoder", None) + if decoder is None and base_model is not None: + decoder = getattr(base_model, "decoder", None) + + if decoder is not None: + decoder_model_args = set(inspect.signature(decoder.forward).parameters) + model_args |= {f"decoder_{x}" for x in decoder_model_args} + + # allow assistant_encoder_outputs to be passed if we're doing assisted generating + if "assistant_encoder_outputs" in model_kwargs: + model_args |= {"assistant_encoder_outputs"} + + for key, value in model_kwargs.items(): + if value is not None and key not in model_args: + unused_model_args.append(key) + + if unused_model_args: + raise ValueError( + f"The following `model_kwargs` are not used by the model: {unused_model_args} (note: typos in the" + " generate arguments will also show up in this list)" + ) + +class PeftModelForSeq2SeqLM(PeftModel): + """ + Peft model for sequence-to-sequence language modeling. + + Args: + model ([`~transformers.PreTrainedModel`]): Base transformer model. + peft_config ([`PeftConfig`]): Peft config. + + + Example: + + ```py + >>> from transformers import AutoModelForSeq2SeqLM + >>> from peft import PeftModelForSeq2SeqLM, get_peft_config + + >>> config = { + ... "peft_type": "LORA", + ... "task_type": "SEQ_2_SEQ_LM", + ... "inference_mode": False, + ... "r": 8, + ... "target_modules": ["q", "v"], + ... "lora_alpha": 32, + ... "lora_dropout": 0.1, + ... "fan_in_fan_out": False, + ... "enable_lora": None, + ... "bias": "none", + ... } + + >>> peft_config = get_peft_config(config) + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + >>> peft_model = PeftModelForSeq2SeqLM(model, peft_config) + >>> peft_model.print_trainable_parameters() + trainable params: 884736 || all params: 223843584 || trainable%: 0.3952474242013566 + ``` + """ + + def __init__(self, model, peft_config: PeftConfig, adapter_name="default"): + super().__init__(model, peft_config, adapter_name) + self.base_model_prepare_inputs_for_generation = self.base_model.prepare_inputs_for_generation + self.base_model_prepare_encoder_decoder_kwargs_for_generation = ( + self.base_model._prepare_encoder_decoder_kwargs_for_generation + ) + + def forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + decoder_input_ids=None, + decoder_attention_mask=None, + decoder_inputs_embeds=None, + labels=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + peft_config = self.active_peft_config + if not isinstance(peft_config, PromptLearningConfig): + return self.base_model( + input_ids=input_ids, + attention_mask=attention_mask, + inputs_embeds=inputs_embeds, + decoder_input_ids=decoder_input_ids, + decoder_attention_mask=decoder_attention_mask, + decoder_inputs_embeds=decoder_inputs_embeds, + labels=labels, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + **kwargs, + ) + + batch_size = input_ids.shape[0] + if decoder_attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to( + decoder_attention_mask.device + ) + decoder_attention_mask = torch.cat((prefix_attention_mask, decoder_attention_mask), dim=1) + + if kwargs.get("position_ids", None) is not None: + warnings.warn("Position ids are not supported for parameter efficient tuning. Ignoring position ids.") + kwargs["position_ids"] = None + if kwargs.get("token_type_ids", None) is not None: + warnings.warn("Token type ids are not supported for parameter efficient tuning. Ignoring token type ids") + kwargs["token_type_ids"] = None + kwargs.update( + { + "attention_mask": attention_mask, + "decoder_attention_mask": decoder_attention_mask, + "labels": labels, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + } + ) + + if peft_config.peft_type == PeftType.PREFIX_TUNING: + past_key_values = self.get_prompt(batch_size) + return self.base_model( + input_ids=input_ids, decoder_input_ids=decoder_input_ids, past_key_values=past_key_values, **kwargs + ) + elif peft_config.peft_type in [PeftType.PROMPT_TUNING, PeftType.P_TUNING]: + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + + if attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to( + attention_mask.device + ) + kwargs["attention_mask"] = torch.cat((prefix_attention_mask, attention_mask), dim=1) + + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + inputs_embeds = torch.cat((prompts[:, : peft_config.num_virtual_tokens], inputs_embeds), dim=1) + + return self.base_model(inputs_embeds=inputs_embeds, **kwargs) + else: + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + if decoder_inputs_embeds is None and decoder_input_ids is None: + decoder_input_ids = shift_tokens_right( + labels, self.config.pad_token_id, self.config.decoder_start_token_id + ) + decoder_inputs_embeds = self.word_embeddings(decoder_input_ids) + + if attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to( + attention_mask.device + ) + kwargs["attention_mask"] = torch.cat((prefix_attention_mask, attention_mask), dim=1) + # concat prompt labels + if labels is not None: + if peft_config.num_transformer_submodules == 1: + kwargs["labels"] = labels + elif peft_config.num_transformer_submodules == 2: + prefix_labels = torch.full((batch_size, peft_config.num_virtual_tokens), -100).to(labels.device) + kwargs["labels"] = torch.cat((prefix_labels, labels), dim=1) + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + inputs_embeds = torch.cat((prompts[:, : peft_config.num_virtual_tokens], inputs_embeds), dim=1) + if peft_config.num_transformer_submodules == 1: + return self.base_model(inputs_embeds=inputs_embeds, **kwargs) + elif peft_config.num_transformer_submodules == 2: + decoder_inputs_embeds = torch.cat( + (prompts[:, peft_config.num_virtual_tokens :], decoder_inputs_embeds), dim=1 + ) + return self.base_model( + inputs_embeds=inputs_embeds, decoder_inputs_embeds=decoder_inputs_embeds, **kwargs + ) + + def generate(self, **kwargs): + peft_config = self.active_peft_config + self.base_model.prepare_inputs_for_generation = self.prepare_inputs_for_generation + self.base_model._prepare_encoder_decoder_kwargs_for_generation = ( + self._prepare_encoder_decoder_kwargs_for_generation + ) + try: + if not isinstance(peft_config, PromptLearningConfig): + outputs = self.base_model.generate(**kwargs) + else: + if "input_ids" not in kwargs: + raise ValueError("input_ids must be provided for Peft model generation") + if kwargs.get("position_ids", None) is not None: + warnings.warn( + "Position ids are not supported for parameter efficient tuning. Ignoring position ids." + ) + kwargs["position_ids"] = None + if kwargs.get("token_type_ids", None) is not None: + warnings.warn( + "Token type ids are not supported for parameter efficient tuning. Ignoring token type ids" + ) + kwargs["token_type_ids"] = None + + if peft_config.peft_type == PeftType.PREFIX_TUNING: + outputs = self.base_model.generate(**kwargs) + elif peft_config.peft_type in [PeftType.PROMPT_TUNING, PeftType.P_TUNING]: + kwargs = deepcopy(kwargs) + + if "encoder_outputs" in kwargs: + del kwargs["encoder_ouputs"] + warnings.warn( + "`encoder_outputs` should not be passed to `generate` when using prompt tuning. Ignoring it." + ) + + input_ids = kwargs.pop("input_ids") + inputs_embeds = self.word_embeddings(input_ids) + batch_size = inputs_embeds.shape[0] + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + + inputs_embeds = torch.cat((prompts[:, : peft_config.num_virtual_tokens], inputs_embeds), dim=1) + kwargs["inputs_embeds"] = inputs_embeds + + if "attention_mask" in kwargs: + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to( + kwargs["attention_mask"].device + ) + kwargs["attention_mask"] = torch.cat((prefix_attention_mask, kwargs["attention_mask"]), dim=1) + + return self.base_model.generate(**kwargs) + else: + raise NotImplementedError + except: + self.base_model.prepare_inputs_for_generation = self.base_model_prepare_inputs_for_generation + self.base_model._prepare_encoder_decoder_kwargs_for_generation = ( + self.base_model_prepare_encoder_decoder_kwargs_for_generation + ) + raise + else: + self.base_model.prepare_inputs_for_generation = self.base_model_prepare_inputs_for_generation + self.base_model._prepare_encoder_decoder_kwargs_for_generation = ( + self.base_model_prepare_encoder_decoder_kwargs_for_generation + ) + return outputs + + def prepare_inputs_for_generation(self, *args, **kwargs): + peft_config = self.active_peft_config + model_kwargs = self.base_model_prepare_inputs_for_generation(*args, **kwargs) + if model_kwargs["past_key_values"] is None and peft_config.peft_type == PeftType.PREFIX_TUNING: + batch_size = model_kwargs["decoder_input_ids"].shape[0] + past_key_values = self.get_prompt(batch_size) + model_kwargs["past_key_values"] = past_key_values + + return model_kwargs + + +class PeftModelForTokenClassification(PeftModel): + """ + Peft model for token classification tasks. + + Args: + model ([`~transformers.PreTrainedModel`]): Base transformer model. + peft_config ([`PeftConfig`]): Peft config. + + **Attributes**: + - **config** ([`~transformers.PretrainedConfig`]) -- The configuration object of the base model. + - **cls_layer_name** (`str`) -- The name of the classification layer. + + Example: + + ```py + >>> from transformers import AutoModelForSequenceClassification + >>> from peft import PeftModelForTokenClassification, get_peft_config + + >>> config = { + ... "peft_type": "PREFIX_TUNING", + ... "task_type": "TOKEN_CLS", + ... "inference_mode": False, + ... "num_virtual_tokens": 20, + ... "token_dim": 768, + ... "num_transformer_submodules": 1, + ... "num_attention_heads": 12, + ... "num_layers": 12, + ... "encoder_hidden_size": 768, + ... "prefix_projection": False, + ... "postprocess_past_key_value_function": None, + ... } + + >>> peft_config = get_peft_config(config) + >>> model = AutoModelForTokenClassification.from_pretrained("bert-base-cased") + >>> peft_model = PeftModelForTokenClassification(model, peft_config) + >>> peft_model.print_trainable_parameters() + trainable params: 370178 || all params: 108680450 || trainable%: 0.3406113979101117 + ``` + """ + + def __init__(self, model, peft_config: PeftConfig = None, adapter_name="default"): + super().__init__(model, peft_config, adapter_name) + if self.modules_to_save is None: + self.modules_to_save = {"classifier", "score"} + else: + self.modules_to_save.update({"classifier", "score"}) + + for name, _ in self.base_model.named_children(): + if any(module_name in name for module_name in self.modules_to_save): + self.cls_layer_name = name + break + + # to make sure classifier layer is trainable + _set_trainable(self, adapter_name) + + def forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + labels=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + peft_config = self.active_peft_config + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if not isinstance(peft_config, PromptLearningConfig): + return self.base_model( + input_ids=input_ids, + attention_mask=attention_mask, + inputs_embeds=inputs_embeds, + labels=labels, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + **kwargs, + ) + + batch_size = input_ids.shape[0] + if attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to(attention_mask.device) + attention_mask = torch.cat((prefix_attention_mask, attention_mask), dim=1) + if kwargs.get("position_ids", None) is not None: + warnings.warn("Position ids are not supported for parameter efficient tuning. Ignoring position ids.") + kwargs["position_ids"] = None + kwargs.update( + { + "attention_mask": attention_mask, + "labels": labels, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + } + ) + + if peft_config.peft_type == PeftType.PREFIX_TUNING: + return self._prefix_tuning_forward(input_ids=input_ids, **kwargs) + else: + if kwargs.get("token_type_ids", None) is not None: + kwargs["token_type_ids"] = torch.cat( + ( + torch.zeros(batch_size, peft_config.num_virtual_tokens).to(self.word_embeddings.weight.device), + kwargs["token_type_ids"], + ), + dim=1, + ).long() + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + inputs_embeds = torch.cat((prompts, inputs_embeds), dim=1) + return self.base_model(inputs_embeds=inputs_embeds, **kwargs) + + def _prefix_tuning_forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + labels=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + batch_size = input_ids.shape[0] + past_key_values = self.get_prompt(batch_size) + fwd_params = list(inspect.signature(self.base_model.forward).parameters.keys()) + kwargs.update( + { + "input_ids": input_ids, + "attention_mask": attention_mask, + "inputs_embeds": inputs_embeds, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + "past_key_values": past_key_values, + } + ) + if "past_key_values" in fwd_params: + return self.base_model(labels=labels, **kwargs) + else: + transformer_backbone_name = self.base_model.get_submodule(self.transformer_backbone_name) + fwd_params = list(inspect.signature(transformer_backbone_name.forward).parameters.keys()) + if "past_key_values" not in fwd_params: + raise ValueError("Model does not support past key values which are required for prefix tuning.") + outputs = transformer_backbone_name(**kwargs) + sequence_output = outputs[0] + if "dropout" in [name for name, _ in list(self.base_model.named_children())]: + sequence_output = self.base_model.dropout(sequence_output) + logits = self.base_model.get_submodule(self.cls_layer_name)(sequence_output) + + loss = None + if labels is not None: + loss_fct = CrossEntropyLoss() + loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1)) + + if not return_dict: + output = (logits,) + outputs[2:] + return ((loss,) + output) if loss is not None else output + + return TokenClassifierOutput( + loss=loss, + logits=logits, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + +class PeftModelForQuestionAnswering(PeftModel): + """ + Peft model for extractive question answering. + + Args: + model ([`~transformers.PreTrainedModel`]): Base transformer model. + peft_config ([`PeftConfig`]): Peft config. + + **Attributes**: + - **config** ([`~transformers.PretrainedConfig`]) -- The configuration object of the base model. + - **cls_layer_name** (`str`) -- The name of the classification layer. + + Example: + + ```py + >>> from transformers import AutoModelForQuestionAnswering + >>> from peft import PeftModelForQuestionAnswering, get_peft_config + + >>> config = { + ... "peft_type": "LORA", + ... "task_type": "QUESTION_ANS", + ... "inference_mode": False, + ... "r": 16, + ... "target_modules": ["query", "value"], + ... "lora_alpha": 32, + ... "lora_dropout": 0.05, + ... "fan_in_fan_out": False, + ... "bias": "none", + ... } + + >>> peft_config = get_peft_config(config) + >>> model = AutoModelForQuestionAnswering.from_pretrained("bert-base-cased") + >>> peft_model = PeftModelForQuestionAnswering(model, peft_config) + >>> peft_model.print_trainable_parameters() + trainable params: 592900 || all params: 108312580 || trainable%: 0.5473971721475013 + ``` + """ + + def __init__(self, model, peft_config: PeftConfig = None, adapter_name="default"): + super().__init__(model, peft_config, adapter_name) + if self.modules_to_save is None: + self.modules_to_save = {"qa_outputs"} + else: + self.modules_to_save.update({"qa_outputs"}) + + for name, _ in self.base_model.named_children(): + if any(module_name in name for module_name in self.modules_to_save): + self.cls_layer_name = name + break + + # to make sure classifier layer is trainable + _set_trainable(self, adapter_name) + + def forward( + self, + input_ids=None, + attention_mask=None, + token_type_ids=None, + position_ids=None, + inputs_embeds=None, + start_positions=None, + end_positions=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + peft_config = self.active_peft_config + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if not isinstance(peft_config, PromptLearningConfig): + return self.base_model( + input_ids=input_ids, + attention_mask=attention_mask, + inputs_embeds=inputs_embeds, + start_positions=start_positions, + end_positions=end_positions, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + **kwargs, + ) + + batch_size = input_ids.shape[0] + if attention_mask is not None: + # concat prompt attention mask + prefix_attention_mask = torch.ones(batch_size, peft_config.num_virtual_tokens).to(attention_mask.device) + attention_mask = torch.cat((prefix_attention_mask, attention_mask), dim=1) + if kwargs.get("position_ids", None) is not None: + warnings.warn("Position ids are not supported for parameter efficient tuning. Ignoring position ids.") + kwargs["position_ids"] = None + kwargs.update( + { + "attention_mask": attention_mask, + "start_positions": start_positions, + "end_positions": end_positions, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + } + ) + + if peft_config.peft_type == PeftType.PREFIX_TUNING: + return self._prefix_tuning_forward(input_ids=input_ids, **kwargs) + else: + if kwargs.get("token_type_ids", None) is not None: + kwargs["token_type_ids"] = torch.cat( + ( + torch.zeros(batch_size, peft_config.num_virtual_tokens).to(self.word_embeddings.weight.device), + kwargs["token_type_ids"], + ), + dim=1, + ).long() + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + prompts = self.get_prompt(batch_size=batch_size) + prompts = prompts.to(inputs_embeds.dtype) + inputs_embeds = torch.cat((prompts, inputs_embeds), dim=1) + return self.base_model(inputs_embeds=inputs_embeds, **kwargs) + + def _prefix_tuning_forward( + self, + input_ids=None, + attention_mask=None, + inputs_embeds=None, + start_positions=None, + end_positions=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + **kwargs, + ): + batch_size = input_ids.shape[0] + past_key_values = self.get_prompt(batch_size) + fwd_params = list(inspect.signature(self.base_model.forward).parameters.keys()) + kwargs.update( + { + "input_ids": input_ids, + "attention_mask": attention_mask, + "inputs_embeds": inputs_embeds, + "output_attentions": output_attentions, + "output_hidden_states": output_hidden_states, + "return_dict": return_dict, + "past_key_values": past_key_values, + } + ) + if "past_key_values" in fwd_params: + return self.base_model(start_positions=start_positions, end_positions=end_positions, **kwargs) + else: + transformer_backbone_name = self.base_model.get_submodule(self.transformer_backbone_name) + fwd_params = list(inspect.signature(transformer_backbone_name.forward).parameters.keys()) + if "past_key_values" not in fwd_params: + raise ValueError("Model does not support past key values which are required for prefix tuning.") + outputs = transformer_backbone_name(**kwargs) + sequence_output = outputs[0] + if "dropout" in [name for name, _ in list(self.base_model.named_children())]: + sequence_output = self.base_model.dropout(sequence_output) + logits = self.base_model.get_submodule(self.cls_layer_name)(sequence_output) + start_logits, end_logits = logits.split(1, dim=-1) + start_logits = start_logits.squeeze(-1).contiguous() + end_logits = end_logits.squeeze(-1).contiguous() + + total_loss = None + if start_positions is not None and end_positions is not None: + # If we are on multi-GPU, split add a dimension + if len(start_positions.size()) > 1: + start_positions = start_positions.squeeze(-1) + if len(end_positions.size()) > 1: + end_positions = end_positions.squeeze(-1) + # sometimes the start/end positions are outside our model inputs, we ignore these terms + ignored_index = start_logits.size(1) + start_positions = start_positions.clamp(0, ignored_index) + end_positions = end_positions.clamp(0, ignored_index) + + loss_fct = CrossEntropyLoss(ignore_index=ignored_index) + start_loss = loss_fct(start_logits, start_positions) + end_loss = loss_fct(end_logits, end_positions) + total_loss = (start_loss + end_loss) / 2 + + if not return_dict: + output = (start_logits, end_logits) + outputs[2:] + return ((total_loss,) + output) if total_loss is not None else output + + return QuestionAnsweringModelOutput( + loss=total_loss, + start_logits=start_logits, + end_logits=end_logits, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) diff --git a/model/peft/tuners/__init__.py b/model/peft/tuners/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e3d5653bf165ec1a647e99b74fe8c9d9b960f78d --- /dev/null +++ b/model/peft/tuners/__init__.py @@ -0,0 +1,27 @@ +# flake8: noqa +# There's no way to ignore "F401 '...' imported but unused" warnings in this +# module, but to preserve other warnings. So, don't check this module at all + +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .adaption_prompt import AdaptionPromptConfig, AdaptionPromptModel +from .lora import LoraConfig, LoraModel +from .adalora import AdaLoraConfig, AdaLoraModel +from .p_tuning import PromptEncoder, PromptEncoderConfig, PromptEncoderReparameterizationType +from .prefix_tuning import PrefixEncoder, PrefixTuningConfig +from .prompt_tuning import PromptEmbedding, PromptTuningConfig, PromptTuningInit +from .moelora import MoeLoraConfig, MoeLoraModel +from .gating import GATING_TO_MODEL_MAPPING diff --git a/model/peft/tuners/adalora.py b/model/peft/tuners/adalora.py new file mode 100644 index 0000000000000000000000000000000000000000..aff877adacedd92ca13601fbd829459a50afdbc1 --- /dev/null +++ b/model/peft/tuners/adalora.py @@ -0,0 +1,751 @@ +import re +import warnings +from dataclasses import dataclass, field +from typing import Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from transformers.pytorch_utils import Conv1D + +from ..import_utils import is_bnb_4bit_available, is_bnb_available +from ..utils import ( + TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING, + PeftType, + _freeze_adapter, + _get_submodules, + transpose, +) +from .lora import ( + LoraConfig, + LoraLayer, + LoraModel, + mark_only_lora_as_trainable, +) + + +if is_bnb_available(): + import bitsandbytes as bnb + + +@dataclass +class AdaLoraConfig(LoraConfig): + """ + This is the configuration class to store the configuration of a [`~peft.AdaLora`]. + + Args: + target_r (`int`): The target average rank of incremental matrix. + init_r (`int`): The initial rank for each incremental matrix. + tinit (`int`): The steps of initial fine-tuning warmup. + tfinal (`int`): The step of final fine-tuning. + deltaT (`int`): The time internval between two budget allocations. + beta1 (`float`): The hyperparameter of EMA for sensitivity smoothing. + beta2 (`float`): The hyperparameter of EMA for undertainty quantification. + orth_reg_weight (`float`): The coefficient of orthogonal regularization. + total_step (`int`): The total training steps that should be specified before training. + rank_pattern (`list`): The allocated rank for each weight matrix by RankAllocator. + """ + + target_r: int = field(default=8, metadata={"help": "Target Lora matrix dimension."}) + init_r: int = field(default=12, metadata={"help": "Intial Lora matrix dimension."}) + tinit: int = field(default=0, metadata={"help": "The steps of initial warmup."}) + tfinal: int = field(default=0, metadata={"help": "The steps of final warmup."}) + deltaT: int = field(default=1, metadata={"help": "Step interval of rank allocation."}) + beta1: float = field(default=0.85, metadata={"help": "Hyperparameter of EMA."}) + beta2: float = field(default=0.85, metadata={"help": "Hyperparameter of EMA."}) + orth_reg_weight: float = field(default=0.5, metadata={"help": "The orthogonal regularization coefficient."}) + total_step: Optional[int] = field(default=None, metadata={"help": "The total training steps."}) + rank_pattern: Optional[dict] = field(default=None, metadata={"help": "The saved rank pattern."}) + + def __post_init__(self): + self.peft_type = PeftType.ADALORA + + +class AdaLoraModel(LoraModel): + """ + Creates AdaLoRA (Adaptive LoRA) model from a pretrained transformers model. Paper: + https://openreview.net/pdf?id=lq62uWRJjiY + + Args: + model ([`transformers.PreTrainedModel`]): The model to be adapted. + config ([`AdaLoraConfig`]): The configuration of the AdaLora model. + + Returns: + `torch.nn.Module`: The AdaLora model. + + Example:: + + >>> from transformers import AutoModelForSeq2SeqLM, LoraConfig >>> from peft import AdaLoraModel, AdaLoraConfig + >>> config = AdaLoraConfig( + peft_type="ADALORA", task_type="SEQ_2_SEQ_LM", r=8, lora_alpha=32, target_modules=["q", "v"], + lora_dropout=0.01, + ) + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") >>> model = AdaLoraModel(config, model) + + **Attributes**: + - **model** ([`transformers.PreTrainedModel`]) -- The model to be adapted. + - **peft_config** ([`AdaLoraConfig`]): The configuration of the AdaLora model. + """ + + def __init__(self, model, config, adapter_name): + nn.Module.__init__(self) + self.model = model + self.peft_config = config + self.add_adapter(adapter_name, self.peft_config[adapter_name]) + + def add_adapter(self, adapter_name, config=None): + if config is not None: + model_config = self.model.config.to_dict() if hasattr(self.model.config, "to_dict") else self.model.config + config = self._prepare_adalora_config(config, model_config) + self.peft_config[adapter_name] = config + self._find_and_replace(adapter_name) + if len(self.peft_config) > 1 and self.peft_config[adapter_name].bias != "none": + raise ValueError( + "AdaLoraModel supports only 1 adapter with bias. When using multiple adapters, set bias to 'none' for all adapters." + ) + traininable_mode_counter = 0 + for config in self.peft_config.values(): + if not config.inference_mode: + traininable_mode_counter += 1 + + if traininable_mode_counter > 1: + raise ValueError( + "AdaLoraModel supports only 1 trainable adapter. " + "When using multiple adapters, set inference_mode to True for all adapters except the one you want to train." + ) + + mark_only_lora_as_trainable(self.model, self.peft_config[adapter_name].bias) + if self.peft_config[adapter_name].inference_mode: + _freeze_adapter(self.model, adapter_name) + else: + self.trainable_adapter_name = adapter_name + self.rankallocator = RankAllocator(self.model, self.peft_config[adapter_name], self.trainable_adapter_name) + + def _find_and_replace(self, adapter_name): + lora_config = self.peft_config[adapter_name] + loaded_in_8bit = getattr(self.model, "is_loaded_in_8bit", False) + loaded_in_4bit = getattr(self.model, "is_loaded_in_4bit", False) + + if (loaded_in_8bit or loaded_in_4bit) and not is_bnb_available(): + raise ImportError( + "To use Lora with 8-bit quantization, please install the `bitsandbytes` package. " + "You can install it with `pip install bitsandbytes`." + ) + is_target_modules_in_base_model = False + kwargs = { + "r": lora_config.init_r, + "lora_alpha": lora_config.lora_alpha, + "lora_dropout": lora_config.lora_dropout, + "fan_in_fan_out": lora_config.fan_in_fan_out, + "init_lora_weights": lora_config.init_lora_weights, + } + key_list = [key for key, _ in self.model.named_modules()] + for key in key_list: + if isinstance(lora_config.target_modules, str): + target_module_found = re.fullmatch(lora_config.target_modules, key) + else: + target_module_found = any(key.endswith(target_key) for target_key in lora_config.target_modules) + if target_module_found: + if not is_target_modules_in_base_model: + is_target_modules_in_base_model = True + parent, target, target_name = _get_submodules(self.model, key) + bias = target.bias is not None + if isinstance(target, LoraLayer): + target.update_layer( + adapter_name, + lora_config.init_r, + lora_config.lora_alpha, + lora_config.lora_dropout, + lora_config.init_lora_weights, + ) + else: + if loaded_in_8bit and isinstance(target, bnb.nn.Linear8bitLt): + kwargs.update( + { + "has_fp16_weights": target.state.has_fp16_weights, + "memory_efficient_backward": target.state.memory_efficient_backward, + "threshold": target.state.threshold, + "index": target.index, + } + ) + new_module = SVDLinear8bitLt( + adapter_name, target.in_features, target.out_features, bias=bias, **kwargs + ) + elif loaded_in_4bit and is_bnb_4bit_available() and isinstance(target, bnb.nn.Linear4bit): + fourbit_kwargs = kwargs.copy() + fourbit_kwargs.update( + { + "compute_dtype": target.compute_dtype, + "compress_statistics": target.weight.compress_statistics, + "quant_type": target.weight.quant_type, + } + ) + new_module = SVDLinear4bit( + adapter_name, target.in_features, target.out_features, bias=bias, **fourbit_kwargs + ) + else: + if isinstance(target, torch.nn.Linear): + in_features, out_features = target.in_features, target.out_features + if kwargs["fan_in_fan_out"]: + warnings.warn( + "fan_in_fan_out is set to True but the target module is `torch.nn.Linear`. " + "Setting fan_in_fan_out to False." + ) + kwargs["fan_in_fan_out"] = lora_config.fan_in_fan_out = False + elif isinstance(target, Conv1D): + in_features, out_features = ( + target.weight.ds_shape if hasattr(target.weight, "ds_shape") else target.weight.shape + ) + if not kwargs["fan_in_fan_out"]: + warnings.warn( + "fan_in_fan_out is set to False but the target module is `Conv1D`. " + "Setting fan_in_fan_out to True." + ) + kwargs["fan_in_fan_out"] = lora_config.fan_in_fan_out = True + else: + raise ValueError( + f"Target module {target} is not supported. " + f"Currently, only `torch.nn.Linear` and `Conv1D` are supported." + ) + new_module = SVDLinear(adapter_name, in_features, out_features, bias=bias, **kwargs) + + self._replace_module(parent, target_name, new_module, target) + if not is_target_modules_in_base_model: + raise ValueError( + f"Target modules {lora_config.target_modules} not found in the base model. " + f"Please check the target modules and try again." + ) + + def __getattr__(self, name: str): + """Forward missing attributes to the wrapped module.""" + try: + return super().__getattr__(name) # defer to nn.Module's logic + except AttributeError: + return getattr(self.model, name) + + def forward(self, *args, **kwargs): + outputs = self.model.forward(*args, **kwargs) + + # Calculate the orthogonal regularization + orth_reg_weight = self.peft_config[self.trainable_adapter_name].orth_reg_weight + assert orth_reg_weight > 0 + + if hasattr(outputs, "loss"): + regu_loss = 0 + num_param = 0 + for n, p in self.model.named_parameters(): + if ("lora_A" in n or "lora_B" in n) and self.trainable_adapter_name in n: + para_cov = p @ p.T if "lora_A" in n else p.T @ p + I = torch.eye(*para_cov.size(), out=torch.empty_like(para_cov)) + I.requires_grad = False + num_param += 1 + regu_loss += torch.norm(para_cov - I, p="fro") + if num_param > 0: + regu_loss = regu_loss / num_param + else: + regu_loss = 0 + outputs.loss += orth_reg_weight * regu_loss + return outputs + + def resize_modules_by_rank_pattern(self, rank_pattern, adapter_name): + lora_config = self.peft_config[adapter_name] + for name, rank_idx in rank_pattern.items(): + if isinstance(rank_idx, list): + rank = sum(rank_idx) + elif isinstance(rank_idx, torch.Tensor): + rank_idx = rank_idx.view(-1) + rank = rank_idx.sum().item() + else: + raise ValueError("Unexcepted type of rank_idx") + key = ".".join(name.split(".")[0:-2]) if adapter_name in name else ".".join(name.split(".")[0:-1]) + _, target, _ = _get_submodules(self.model, key) + lora_E_weights = target.lora_E[adapter_name][rank_idx] + lora_A_weights = target.lora_A[adapter_name][rank_idx] + lora_B_weights = target.lora_B[adapter_name][:, rank_idx] + ranknum = target.ranknum[adapter_name] + target.update_layer( + adapter_name, + rank, + lora_config.lora_alpha, + lora_config.lora_dropout, + lora_config.init_lora_weights, + ) + with torch.no_grad(): + if rank > 0: + target.lora_E[adapter_name].copy_(lora_E_weights) + target.lora_A[adapter_name].copy_(lora_A_weights) + target.lora_B[adapter_name].copy_(lora_B_weights) + # The scaling is exactly as the previous + target.ranknum[adapter_name].copy_(ranknum) + + def resize_state_dict_by_rank_pattern(self, rank_pattern, state_dict, adapter_name): + for name, rank_idx in rank_pattern.items(): + rank = sum(rank_idx) + prefix = ".".join(name.split(".")[0:-2]) if adapter_name in name else ".".join(name.split(".")[0:-1]) + for layer in ["lora_E", "lora_A", "lora_B"]: + key = f"base_model.model.{prefix}.{layer}.{adapter_name}" + if layer != "lora_B": + state_dict[key] = ( + state_dict[key][rank_idx] if rank != state_dict[key].shape[0] else state_dict[key] + ) + else: + state_dict[key] = ( + state_dict[key][:, rank_idx] if rank != state_dict[key].shape[1] else state_dict[key] + ) + return state_dict + + def update_and_allocate(self, global_step): + lora_config = self.peft_config[self.trainable_adapter_name] + # Update the importance score and allocate the budget + if global_step < lora_config.total_step - lora_config.tfinal: + _, rank_pattern = self.rankallocator.update_and_allocate(self.model, global_step) + if rank_pattern: + lora_config.rank_pattern = rank_pattern + # Finalize the budget allocation + elif global_step == lora_config.total_step - lora_config.tfinal: + _, rank_pattern = self.rankallocator.update_and_allocate(self.model, global_step, force_mask=True) + # for some reason, this freezes the trainable parameters and nothing gets updates + # self.resize_modules_by_rank_pattern(rank_pattern, self.trainable_adapter_name) + lora_config.rank_pattern = rank_pattern + self.rankallocator.reset_ipt() + # Currently using inefficient way to mask the unimportant weights using the rank pattern + # due to problem mentioned above + elif global_step > lora_config.total_step - lora_config.tfinal: + self.rankallocator.mask_using_rank_pattern(self.model, lora_config.rank_pattern) + # Pass the function and do forward propagation + else: + return None + + @staticmethod + def _prepare_adalora_config(peft_config, model_config): + if peft_config.target_modules is None: + if model_config["model_type"] not in TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING: + raise ValueError("Please specify `target_modules` in `peft_config`") + peft_config.target_modules = TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING[ + model_config["model_type"] + ] + return peft_config + + +class AdaLoraLayer(LoraLayer): + def __init__( + self, + in_features: int, + out_features: int, + ): + super().__init__(in_features, out_features) + self.lora_E = nn.ParameterDict({}) + self.lora_A = nn.ParameterDict({}) + self.lora_B = nn.ParameterDict({}) + self.ranknum = nn.ParameterDict({}) + + def update_layer(self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights): + self.r[adapter_name] = r + self.lora_alpha[adapter_name] = lora_alpha + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + + def lora_dropout_layer(x): + return x + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + # Right singular vectors + self.lora_A.update(nn.ParameterDict({adapter_name: nn.Parameter(torch.zeros(r, self.in_features))})) + # Singular values + self.lora_E.update(nn.ParameterDict({adapter_name: nn.Parameter(torch.zeros(r, 1))})) + # Left singular vectors + self.lora_B.update(nn.ParameterDict({adapter_name: nn.Parameter(torch.zeros(self.out_features, r))})) + # The current rank + self.ranknum.update(nn.ParameterDict({adapter_name: nn.Parameter(torch.zeros(1), requires_grad=False)})) + self.ranknum[adapter_name].data.fill_(float(r)) + self.ranknum[adapter_name].requires_grad = False + self.scaling[adapter_name] = lora_alpha if lora_alpha > 0 else float(r) + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def reset_lora_parameters(self, adapter_name): + if adapter_name in self.lora_A.keys(): + nn.init.zeros_(self.lora_E[adapter_name]) + nn.init.normal_(self.lora_A[adapter_name], mean=0.0, std=0.02) + nn.init.normal_(self.lora_B[adapter_name], mean=0.0, std=0.02) + + +class SVDLinear(nn.Linear, AdaLoraLayer): + # SVD-based adaptation by a dense layer + def __init__( + self, + adapter_name: str, + in_features: int, + out_features: int, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + fan_in_fan_out: bool = False, + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + nn.Linear.__init__(self, in_features, out_features, **kwargs) + AdaLoraLayer.__init__(self, in_features=in_features, out_features=out_features) + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + self.fan_in_fan_out = fan_in_fan_out + if fan_in_fan_out: + self.weight.data = self.weight.data.T + + nn.Linear.reset_parameters(self) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def merge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data += ( + transpose( + self.lora_B[self.active_adapter] + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]), + self.fan_in_fan_out, + ) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + self.merged = True + + def unmerge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data -= ( + transpose( + self.lora_B[self.active_adapter] + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]) + ) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + self.merged = False + + def forward(self, x: torch.Tensor): + if self.active_adapter not in self.lora_A.keys(): + return F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + result += ( + ( + self.lora_dropout[self.active_adapter](x) + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]).T + @ self.lora_B[self.active_adapter].T + ) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + else: + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + return result + + +if is_bnb_available(): + + class SVDLinear8bitLt(bnb.nn.Linear8bitLt, AdaLoraLayer): + # Low-rank matrix for SVD-based adaptation + def __init__( + self, + adapter_name, + in_features, + out_features, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + bnb.nn.Linear8bitLt.__init__( + self, + in_features, + out_features, + bias=kwargs.get("bias", True), + has_fp16_weights=kwargs.get("has_fp16_weights", True), + memory_efficient_backward=kwargs.get("memory_efficient_backward", False), + threshold=kwargs.get("threshold", 0.0), + index=kwargs.get("index", None), + ) + AdaLoraLayer.__init__(self, in_features=in_features, out_features=out_features) + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + init_lora_weights = kwargs.pop("init_lora_weights", True) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def forward(self, x: torch.Tensor): + result = super().forward(x) + + if self.disable_adapters or self.active_adapter not in self.lora_A.keys(): + return result + elif self.r[self.active_adapter] > 0: + if not torch.is_autocast_enabled(): + expected_dtype = result.dtype + + if x.dtype != torch.float32: + x = x.float() + output = ( + ( + self.lora_dropout[self.active_adapter](x) + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]).T + @ self.lora_B[self.active_adapter].T + ).to(expected_dtype) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + else: + output = ( + ( + self.lora_dropout[self.active_adapter](x) + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]).T + @ self.lora_B[self.active_adapter].T + ) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + result = result + output + return result + + +if is_bnb_4bit_available(): + + class SVDLinear4bit(bnb.nn.Linear4bit, AdaLoraLayer): + # Low-rank matrix for SVD-based adaptation + def __init__( + self, + adapter_name, + in_features, + out_features, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + bnb.nn.Linear4bit.__init__( + self, + in_features, + out_features, + bias=kwargs.get("bias", True), + compute_dtype=kwargs.get("compute_dtype", torch.float32), + compress_statistics=kwargs.get("compress_statistics", True), + quant_type=kwargs.get("quant_type", "nf4"), + ) + AdaLoraLayer.__init__(self, in_features=in_features, out_features=out_features) + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + init_lora_weights = kwargs.pop("init_lora_weights", True) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def forward(self, x: torch.Tensor): + result = super().forward(x) + + if self.disable_adapters or self.active_adapter not in self.lora_A.keys(): + return result + elif self.r[self.active_adapter] > 0: + if not torch.is_autocast_enabled(): + expected_dtype = result.dtype + + if x.dtype != torch.float32: + x = x.float() + output = ( + ( + self.lora_dropout[self.active_adapter](x) + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]).T + @ self.lora_B[self.active_adapter].T + ).to(expected_dtype) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + else: + output = ( + ( + self.lora_dropout[self.active_adapter](x) + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]).T + @ self.lora_B[self.active_adapter].T + ) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + result = result + output + return result + + +class RankAllocator(object): + """ + The RankAllocator for AdaLoraModel. Paper: https://openreview.net/pdf?id=lq62uWRJjiY + + Args: + config ([`AdaLoraConfig`]): The configuration of the AdaLora model. + model: the model that we apply AdaLoRA to. + + """ + + def __init__(self, model, peft_config, adapter_name): + self.peft_config = peft_config + self.adapter_name = adapter_name + self.beta1 = peft_config.beta1 + self.beta2 = peft_config.beta2 + assert self.beta1 > 0 and self.beta1 < 1 + assert self.beta2 > 0 and self.beta2 < 1 + + self.reset_ipt() + self._set_budget_scheduler(model) + + def set_total_step(self, total_step): + self.peft_config.total_step = total_step + + def reset_ipt(self): + self.ipt = {} + self.exp_avg_ipt = {} + self.exp_avg_unc = {} + + def _set_budget_scheduler(self, model): + self.init_bgt = 0 + self.name_set = set() + for n, p in model.named_parameters(): + if f"lora_A.{self.adapter_name}" in n: + self.init_bgt += p.size(0) + self.name_set.add(n.replace("lora_A", "%s")) + self.name_set = sorted(self.name_set) + # The total final rank budget + self.target_bgt = self.peft_config.target_r * len(self.name_set) + + def budget_schedule(self, step: int): + tinit = self.peft_config.tinit + tfinal = self.peft_config.tfinal + total_step = self.peft_config.total_step + # Initial warmup + if step <= tinit: + budget = self.init_bgt + mask_ind = False + # Final fine-tuning + elif step > total_step - tfinal: + budget = self.target_bgt + mask_ind = True + else: + # Budget decreasing with a cubic scheduler + mul_coeff = 1 - (step - tinit) / (total_step - tfinal - tinit) + budget = int((self.init_bgt - self.target_bgt) * (mul_coeff**3) + self.target_bgt) + mask_ind = True if step % self.peft_config.deltaT == 0 else False + return budget, mask_ind + + def update_ipt(self, model): + # Update the sensitivity and uncertainty for every weight + for n, p in model.named_parameters(): + if "lora_" in n and self.adapter_name in n: + if n not in self.ipt: + self.ipt[n] = torch.zeros_like(p) + self.exp_avg_ipt[n] = torch.zeros_like(p) + self.exp_avg_unc[n] = torch.zeros_like(p) + with torch.no_grad(): + self.ipt[n] = (p * p.grad).abs().detach() + # Sensitivity smoothing + self.exp_avg_ipt[n] = self.beta1 * self.exp_avg_ipt[n] + (1 - self.beta1) * self.ipt[n] + # Uncertainty quantification + self.exp_avg_unc[n] = ( + self.beta2 * self.exp_avg_unc[n] + (1 - self.beta2) * (self.ipt[n] - self.exp_avg_ipt[n]).abs() + ) + + def _element_score(self, n): + return self.exp_avg_ipt[n] * self.exp_avg_unc[n] + + def _combine_ipt(self, ipt_E, ipt_AB): + ipt_AB = ipt_AB.sum(dim=1, keepdim=False) + sum_ipt = ipt_E.view(-1) + ipt_AB.view(-1) + return sum_ipt + + def mask_to_budget(self, model, budget): + value_ipt = {} + vector_ipt = {} + triplet_ipt = {} + # Get the importance score for A, E, B + for n, p in model.named_parameters(): + if f"lora_A.{self.adapter_name}" in n: + entry_ipt = self._element_score(n) + comb_ipt = torch.mean(entry_ipt, dim=1, keepdim=True) + name_m = n.replace("lora_A", "%s") + if name_m not in vector_ipt: + vector_ipt[name_m] = [comb_ipt] + else: + vector_ipt[name_m].append(comb_ipt) + if f"lora_B.{self.adapter_name}" in n: + entry_ipt = self._element_score(n) + comb_ipt = torch.mean(entry_ipt, dim=0, keepdim=False).view(-1, 1) + name_m = n.replace("lora_B", "%s") + if name_m not in vector_ipt: + vector_ipt[name_m] = [comb_ipt] + else: + vector_ipt[name_m].append(comb_ipt) + if f"lora_E.{self.adapter_name}" in n: + entry_ipt = self._element_score(n) + name_m = n.replace("lora_E", "%s") + value_ipt[name_m] = entry_ipt + + all_score = [] + # Calculate the score for each triplet + for name_m in vector_ipt: + ipt_E = value_ipt[name_m] + ipt_AB = torch.cat(vector_ipt[name_m], dim=1) + sum_ipt = self._combine_ipt(ipt_E, ipt_AB) + name_E = name_m % "lora_E" + triplet_ipt[name_E] = sum_ipt.view(-1, 1) + all_score.append(sum_ipt.view(-1)) + + # Get the threshold by ranking ipt + mask_threshold = torch.kthvalue( + torch.cat(all_score), + k=self.init_bgt - budget, + )[0].item() + + rank_pattern = {} + # Mask the unimportant triplets + with torch.no_grad(): + for n, p in model.named_parameters(): + if f"lora_E.{self.adapter_name}" in n: + p.masked_fill_(triplet_ipt[n] <= mask_threshold, 0.0) + rank_pattern[n] = (~(triplet_ipt[n] <= mask_threshold)).view(-1).tolist() + return rank_pattern + + def update_and_allocate(self, model, global_step, force_mask=False): + # # Update the importance score and allocate the budget + if global_step < self.peft_config.total_step - self.peft_config.tfinal: + self.update_ipt(model) + budget, mask_ind = self.budget_schedule(global_step) + # Allocate the budget according to importance scores + if mask_ind or force_mask: + rank_pattern = self.mask_to_budget(model, budget) + else: + rank_pattern = None + return budget, rank_pattern + + def mask_using_rank_pattern(self, model, rank_pattern): + # Mask the unimportant triplets + is_adapter_name_truncated = False + if self.adapter_name not in next(iter(rank_pattern.keys())): + is_adapter_name_truncated = True + + with torch.no_grad(): + for n, p in model.named_parameters(): + if f"lora_E.{self.adapter_name}" in n: + key = n if not is_adapter_name_truncated else n.replace(f".{self.adapter_name}", "") + mask = torch.Tensor(rank_pattern[key]).unsqueeze(-1).to(p.device) + p.masked_fill_(~mask.bool(), 0.0) diff --git a/model/peft/tuners/adaption_prompt.py b/model/peft/tuners/adaption_prompt.py new file mode 100644 index 0000000000000000000000000000000000000000..3ce7d8b7fa9c19fb0a69904762551555e972b7ac --- /dev/null +++ b/model/peft/tuners/adaption_prompt.py @@ -0,0 +1,368 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math +from collections import namedtuple +from dataclasses import dataclass, field +from typing import Dict, List + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from peft.utils.config import PeftConfig, PeftType +from peft.utils.other import _freeze_adapter, _get_submodules + + +def llama_rotate_half(x: torch.Tensor) -> torch.Tensor: + """ + Rotate half the hidden dims of the input. + + This function was duplicated verbatim from: + https://github.com/huggingface/transformers/blob/1de8ce9ee1191ba761a593ac15d9ccbf5851bfc5/src/transformers/models/llama/modeling_llama.py#L126 + + This was done to eliminate the Llama transformers implementation as a dependency of this file. Note that some other + functions were also adapted from the transformers implementation but were modified. + """ + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def llama_apply_rotary_pos_emb(q, cos, sin, position_ids): + """ + Apply rotary position embedding to query states in the Llama model. + + This function was adapted from: + https://github.com/huggingface/transformers/blob/1de8ce9ee1191ba761a593ac15d9ccbf5851bfc5/src/transformers/models/llama/modeling_llama.py#L133 + + It was modified to remove unnecessary processing of key states. + """ + gather_indices = position_ids[:, None, :, None] # [bs, 1, seq_len, 1] + gather_indices = gather_indices.repeat(1, cos.shape[1], 1, cos.shape[3]) + cos = torch.gather(cos.repeat(gather_indices.shape[0], 1, 1, 1), 2, gather_indices) + sin = torch.gather(sin.repeat(gather_indices.shape[0], 1, 1, 1), 2, gather_indices) + q_embed = (q * cos) + (llama_rotate_half(q) * sin) + return q_embed + + +def llama_compute_query_states(model: nn.Module, **kwargs) -> torch.Tensor: + """ + Compute query states for Llama models specifically. + + They need to be recomputed as the forward() method of the original LlamaModel in the transformers library does not + return them. See the related discussion in the PR: https://github.com/huggingface/peft/pull/268 + """ + hidden_states = kwargs.get("hidden_states") + position_ids = kwargs.get("position_ids") + past_key_value = kwargs.get("past_key_value") + bsz, q_len, _ = hidden_states.size() + query_states = model.q_proj(hidden_states).view(bsz, q_len, model.num_heads, model.head_dim).transpose(1, 2) + value_states = model.v_proj(hidden_states).view(bsz, q_len, model.num_heads, model.head_dim).transpose(1, 2) + + seq_len = q_len + if past_key_value is not None: + seq_len += past_key_value[0].shape[-2] + cos, sin = model.rotary_emb(value_states, seq_len=seq_len) + + return llama_apply_rotary_pos_emb(query_states, cos, sin, position_ids) + + +# Contains the config that is specific to a transformers model type. +ModelTypeConfig = namedtuple( + "ModelTypeConfig", ["compute_query_states", "target_modules", "k_proj_layer", "v_proj_layer", "o_proj_layer"] +) +# Mapping of transformers model types to their specific configuration. +TRANSFORMERS_MODEL_CONFIG = { + "llama": ModelTypeConfig( + compute_query_states=llama_compute_query_states, + target_modules="self_attn", + k_proj_layer="k_proj", + v_proj_layer="v_proj", + o_proj_layer="o_proj", + ), +} + + +def is_adaption_prompt_trainable(params: str) -> bool: + """Return True if module is trainable under adaption prompt fine-tuning.""" + return params.split(".")[-1].startswith("adaption_") + + +@dataclass +class AdaptionPromptConfig(PeftConfig): + """Stores the configuration of an [`AdaptionPromptModel`].""" + + target_modules: str = field( + default=None, metadata={"help": "Name of the attention submodules to insert adaption prompts into."} + ) + adapter_len: int = field(default=None, metadata={"help": "Number of adapter tokens to insert"}) + adapter_layers: int = field(default=None, metadata={"help": "Number of adapter layers (from the top)"}) + + def __post_init__(self): + self.peft_type = PeftType.ADAPTION_PROMPT + + +def prepare_config( + peft_config: AdaptionPromptConfig, + model, +) -> AdaptionPromptConfig: + """Prepare the config based on the llama model type.""" + if model.config.model_type not in TRANSFORMERS_MODEL_CONFIG: + raise ValueError("Unsupported model type for adaption prompt: '{model.config.model_type}'.") + + model_config = TRANSFORMERS_MODEL_CONFIG[model.config.model_type] + + if peft_config.target_modules is None: + peft_config.target_modules = model_config.target_modules + + return peft_config + + +class AdaptionPromptModel(nn.Module): + """ + Implements adaption prompts as described in https://arxiv.org/pdf/2303.16199.pdf. + + The top L attention modules are replaced with AdaptedAttention modules that wrap the original ones, but insert + trainable prompts with gates (for zero init). + + Notes on the multi-adapter pattern: + - We store the states of different adapters by keeping a dictionary of AdaptedAttention modules indexed by adapter + name. + - Every time we switch adapters, we remove the modules of the currently active adapter from the model, store them + in the dictionary, and replace them with the modules of the new adapter. + - To avoid duplicated and potentially inconsistent state, the currently active adapter is always removed from the + dictionary. + - Disabling the adapter would also result in the modules being removed from the model. + """ + + def __init__(self, model, configs: Dict, adapter_name: str): + super().__init__() + self.model = model + # Store adapter configs by name. + self._configs: Dict[str, AdaptionPromptConfig] = {} + # Store lists of the parents of the affected attention modules by adapter name. + # We keep references to the parents so we can swap the adapters in-and-out of the model. + self._parents: Dict[str, List[nn.Module]] = {} + # Store lists of cached AdaptedAttention modules by name. + self._cached_adapters: Dict[str, List] = {} + # The name of the currently active adapter. + self._active_adapter = None + # Whether the adapter is enabled. + self._enabled = True + self.forward = self.model.forward + self.add_adapter(adapter_name, configs[adapter_name]) + self._mark_only_adaption_prompts_as_trainable() + + def add_adapter(self, adapter_name: str, config: AdaptionPromptConfig) -> None: + """Add an adapter with the given name and config.""" + config = prepare_config(config, self.model) + if adapter_name in self._configs: + raise ValueError(f"Adapter with name '{adapter_name}' already exists.") + + parents = [] + for name, _ in self.model.named_modules(): + if name.endswith(config.target_modules): + par, _, _ = _get_submodules(self.model, name) + parents.append(par) + if len(parents) < config.adapter_layers: + raise ValueError( + f"Config specifies more adapter layers '{config.adapter_layers}'" + f" than the model has '{len(parents)}'." + ) + # Note that if the target modules are not in Sequential, ModuleList, or + # some other PyTorch ordered container, the behavior is undefined as we + # assume here that the order of the modules is the same as the order of + # the transformer decoder layers. + parents = parents[-config.adapter_layers :] + self._parents[adapter_name] = parents + + # It is only None during initialization. + # If it is disabled, we don't have to remove the modules. + if self._active_adapter is not None and self._enabled: + self._remove_adapted_attentions(self._active_adapter) + self._active_adapter = adapter_name + self._configs[adapter_name] = config + self._create_adapted_attentions(config, parents) + if not self._enabled: + self._remove_adapted_attentions(self._active_adapter) + + if config.inference_mode: + _freeze_adapter(self.model, adapter_name) + + def set_adapter(self, adapter_name: str) -> None: + """Set the model to use the adapter with the given name.""" + if self._active_adapter == adapter_name: + return + if adapter_name not in self._configs: + raise ValueError(f"Adapter with name '{adapter_name}' does not exist.") + + if self._enabled: + self._remove_adapted_attentions(self._active_adapter) + self._set_adapted_attentions(adapter_name) + + self._active_adapter = adapter_name + + def enable_adapter_layers(self): + """Enable adapter layers by swapping in cached AdaptedAttention modules.""" + self._enabled = True + self._set_adapted_attentions(self._active_adapter) + + def disable_adapter_layers(self): + """Disable adapter layers by swapping out AdaptedAttention modules.""" + self._enabled = False + self._remove_adapted_attentions(self._active_adapter) + + def _create_adapted_attentions(self, config: AdaptionPromptConfig, parents: List[nn.Module]) -> None: + """Wrap LlamaAttention modules with newly created AdaptedAttention modules.""" + for par in parents: + attn = AdaptedAttention( + model_type=self.model.config.model_type, + adapter_len=config.adapter_len, + model=getattr(par, config.target_modules), + ) + setattr(par, config.target_modules, attn) + + def _set_adapted_attentions(self, adapter_name: str) -> None: + """Replace LlamaAttention modules with cached AdaptedAttention modules.""" + cached = self._cached_adapters[adapter_name] + del self._cached_adapters[adapter_name] + config = self._configs[adapter_name] + for i, par in enumerate(self._parents[adapter_name]): + setattr(par, config.target_modules, cached[i]) + + def _remove_adapted_attentions(self, adapter_name: str) -> None: + """Remove AdaptedAttention modules from the model and store them in the cache.""" + config = self._configs[adapter_name] + adapted_attentions = [] + for par in self._parents[adapter_name]: + attn = getattr(par, config.target_modules) + adapted_attentions.append(attn) + setattr(par, config.target_modules, attn.model) + self._cached_adapters[adapter_name] = adapted_attentions + + def _mark_only_adaption_prompts_as_trainable(self) -> None: + """Freeze all parameters of the model except the adaption prompts.""" + for n, p in self.model.named_parameters(): + if not is_adaption_prompt_trainable(n): + p.requires_grad = False + + def __getattr__(self, name: str): + """Forward missing attributes to the wrapped module.""" + try: + return super().__getattr__(name) # defer to nn.Module's logic + except AttributeError: + # This is necessary as e.g. causal models have various methods that we + # don't want to re-implement here. + return getattr(self.model, name) + + +class AdaptedAttention(nn.Module): + """This module wraps a LLamaAttention module and injects adaption prompts.""" + + def __init__(self, model_type: str, adapter_len: int, model): + """ + Initialize object. + + Args: + model_type: The transformer model type. This is used to retrieve the right method to + compute query states. + adapter_len: The length of the adaption prompt to insert. + model: The original transformer attention module that is being wrapped. + """ + assert not isinstance(model, AdaptedAttention) + super().__init__() + self.model_type = model_type + self.model = model + self.adapter_len = adapter_len + # Assume all parameters of the attention model we are wrapping are on the same device. + device = next(model.parameters()).device + # Don't think this was specified in the paper, but we follow the official repo which used an Embedding + # which initializes the tokens with standard normal values. + # https://github.com/ZrrSkywalker/LLaMA-Adapter/blob/41c3546fe1997ab8a65809dc8d8f9252b19d9faf/llama/model.py#L234 + # (bsz, adapter_len, hidden_size) + target_dtype = ( + model.q_proj.weight.dtype if model.q_proj.weight.dtype not in [torch.int8, torch.uint8] else torch.float32 + ) + self.adaption_prompt = nn.Parameter( + torch.empty(1, adapter_len, self.model.hidden_size, device=device, dtype=target_dtype).normal_() + ) + # Initialize the gate to 0 as this is "zero-init". + self.adaption_gate = nn.Parameter(torch.zeros(1, device=device, dtype=target_dtype)) + + def forward(self, **kwargs): + """ + Forward pass for the adapter which wraps the original LlamaAttention module. + + "Official" paper implementation: + https://github.com/ZrrSkywalker/LLaMA-Adapter/blob/41c3546fe1997ab8a65809dc8d8f9252b19d9faf/llama/model.py#L141 + + Args: + kwargs: See the original LlamaAttention module. + """ + if kwargs.get("output_attention", False): + raise NotImplementedError("output_attention is not currently supported.") + + output, _, past_key_value = self.model(**kwargs) + bsz = output.shape[0] + q_len = output.shape[1] + embed_dim = output.shape[2] + k_proj_layer = TRANSFORMERS_MODEL_CONFIG[self.model_type].k_proj_layer + v_proj_layer = TRANSFORMERS_MODEL_CONFIG[self.model_type].v_proj_layer + o_proj_layer = TRANSFORMERS_MODEL_CONFIG[self.model_type].o_proj_layer + + if k_proj_layer == v_proj_layer: + _, key, value = getattr(self.model, k_proj_layer)(self.adaption_prompt).split(embed_dim, dim=2) + else: + key = getattr(self.model, k_proj_layer)(self.adaption_prompt) + value = getattr(self.model, v_proj_layer)(self.adaption_prompt) + # (bsz, num_heads, adapter_len, head_dim) + adapter_k = ( + key.view(1, self.adapter_len, self.model.num_heads, self.model.head_dim) + .repeat(bsz, 1, 1, 1) + .transpose(1, 2) + ) + # (bsz, num_heads, adapter_len, head_dim) + adapter_v = ( + value.view(1, self.adapter_len, self.model.num_heads, self.model.head_dim) + .repeat(bsz, 1, 1, 1) + .transpose(1, 2) + ) + + # Recompute query states. + compute_query_states = TRANSFORMERS_MODEL_CONFIG[self.model_type].compute_query_states + # (bsz, num_heads, q_len, head_dim) + query_states = compute_query_states(model=self.model, **kwargs) + + previous_dtype = query_states.dtype + # (bsz, num_heads, q_len, adapter_len) + scores = torch.matmul(query_states, adapter_k.transpose(2, 3).to(previous_dtype)) / math.sqrt( + self.model.head_dim + ) + # Upcast attention to fp32 + # (bsz, num_heads, q_len, adapter_len) + scores = self.adaption_gate * F.softmax(scores, dim=-1, dtype=torch.float32).to(previous_dtype) + # (bsz, q_len, num_heads * head_dim) + adapter_output = torch.matmul(scores, adapter_v).transpose(1, 2).reshape(bsz, q_len, -1) + # (bsz, q_len, hidden_size) + if o_proj_layer is not None: + adapter_output = getattr(self.model, o_proj_layer)(adapter_output) + + # Add adaption prompt output to original output. + output = output + adapter_output + + # Restore original dtype. + output = output.to(previous_dtype) + return output, None, past_key_value diff --git a/model/peft/tuners/debug_utils.py b/model/peft/tuners/debug_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..2fcfe26c39ee6a328bc0ecd10b132af0e6dece80 --- /dev/null +++ b/model/peft/tuners/debug_utils.py @@ -0,0 +1,64 @@ +import os +import torch +import matplotlib.pyplot as plt +import numpy as np +from typing import Optional + +class DebugUtils: + def __init__(self, pic_dir: str): + self.pic_dir = pic_dir + if not os.path.exists(self.pic_dir): + os.makedirs(self.pic_dir) + + def check_orthogonal(self, tensor: torch.Tensor) -> float: + if tensor.dim() > 2: + raise ValueError("Tensor dimension must be 1 or 2.") + + if tensor.dim() == 1: + return 0.0 # 1D tensor is not applicable for orthogonality + + if tensor.dim() == 2: + num_rows, num_dims = tensor.shape + dot_products = torch.mm(tensor, tensor.t()) + norms_squared = torch.diag(dot_products) + sum_abs_dot_products = torch.sum(torch.abs(dot_products - torch.diag(norms_squared))) + max_sum = (num_rows * (num_rows - 1)) / 2 + orthogonality_score = 1.0 - (sum_abs_dot_products / max_sum) + return orthogonality_score.item() + + def plot_tensor(self, tensor: torch.Tensor, pic_name: str, x_axis: Optional[str], y_axis: Optional[str], plot_number: bool = False) -> None: + if tensor.dim() > 2: + raise ValueError("Tensor dimensions must be 2 or lower for plotting.") + + fig, ax = plt.subplots() + + if tensor.dim() == 1: + tensor_shape = tensor.shape[0] + ax.set_yticks([]) + ax.set_xticks(np.arange(tensor_shape)) + color_matrix = np.ones((1, tensor_shape, 3)) * [0.7, 0.7, 1.0] + ax.imshow(color_matrix, aspect='equal') + for i in range(1, tensor_shape): + ax.axvline(x=i - 0.5, color='black', linewidth=1) + if x_axis: + ax.set_xlabel(x_axis) + else: + heatmap = ax.imshow(tensor, cmap='YlOrRd', aspect='auto') + + if plot_number: + for i in range(tensor.shape[0]): + for j in range(tensor.shape[1]): + ax.text(j, i, f'{tensor[i, j]:.3f}', ha='center', va='center', color='black') + + if y_axis: + ax.set_ylabel(y_axis) + if x_axis: + ax.set_xlabel(x_axis) + + plt.colorbar(heatmap, ax=ax, orientation='vertical') + + plt.savefig(os.path.join(self.pic_dir, pic_name)) + plt.close() + + +debuge_utils = DebugUtils("./picture") \ No newline at end of file diff --git a/model/peft/tuners/gating.py b/model/peft/tuners/gating.py new file mode 100644 index 0000000000000000000000000000000000000000..268048200b84fbfccff16d4cbc48761f05710acc --- /dev/null +++ b/model/peft/tuners/gating.py @@ -0,0 +1,124 @@ +import torch +from torch import nn +import torch.nn.functional as F + +class Dense(nn.Module): + def __init__(self, dim: int, num_moe: int) -> None: + super().__init__() + self.dim = 64 + self.num_moe = num_moe + self.linear_layer = nn.Linear(self.dim, num_moe, bias=False) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + logits = self.linear_layer(x) + probs = self.softmax(logits) + return probs + +class topK(nn.Module): + def __init__(self, dim: int, num_moe: int) -> None: + super().__init__() + self.dim = 64 + self.num_moe = num_moe + self.linear_layer = nn.Linear(self.dim, num_moe, bias=False) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x, topk=1): + logits = self.linear_layer(x) + probs = self.softmax(logits) + # 使用topk来选择最高的k个概率 + topk_values, topk_indices = torch.topk(probs, k=topk, dim=-1) + # 创建一个初始值全为负无穷的张量,形状与probs相同 + topk_probs = torch.full_like(probs, float('-inf')) + # 使用scatter填充topk的概率值 + topk_probs = topk_probs.scatter_(-1, topk_indices, topk_values) + # 应用softmax确保top k值的和为1 + topk_probs = self.softmax(topk_probs) + return topk_probs + +class MLP(nn.Module): + def __init__(self, dim: int, num_moe: int, hidden_dim: int = 128) -> None: + super().__init__() + self.dim = 64 + self.num_moe = num_moe + # 添加多层感知机结构 + self.linear_layer1 = nn.Linear(self.dim, hidden_dim) + self.activation = nn.GELU() # 使用GELU激活函数 + self.linear_layer2 = nn.Linear(hidden_dim, self.num_moe) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + x = self.linear_layer1(x) + x = self.activation(x) + logits = self.linear_layer2(x) + probs = self.softmax(logits) + return probs + + +class Noise(nn.Module): + def __init__(self, dim: int, num_moe: int, noise_std: float = 0.1) -> None: + super().__init__() + self.dim = 64 + self.num_moe = num_moe + self.noise_std = noise_std + self.linear_layer = nn.Linear(self.dim, num_moe, bias=False) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + logits = self.linear_layer(x) + + # 添加噪声 + noise = torch.randn_like(logits) * self.noise_std + logits = logits + noise + + probs = self.softmax(logits) + return probs + +class MLP_noise(nn.Module): + def __init__(self, dim: int, num_moe: int, hidden_dim: int = 128, noise_std: float = 0.1) -> None: + super().__init__() + self.dim = 64 + self.num_moe = num_moe + self.noise_std = noise_std + self.linear1 = nn.Linear(self.dim, hidden_dim, bias=False) + self.relu = nn.ReLU() + self.linear2 = nn.Linear(hidden_dim, num_moe, bias=False) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + hidden = self.linear1(x) + hidden = self.relu(hidden) + logits = self.linear2(hidden) + + # 添加噪声 + noise = torch.randn_like(logits) * self.noise_std + logits = logits + noise + + probs = self.softmax(logits) + return probs + + +class Drop(nn.Module): + def __init__(self, dim: int, num_moe: int, dropout_rate: float = 0.1) -> None: + super().__init__() + self.dim = 64 + self.num_moe = num_moe + self.linear_layer = nn.Linear(self.dim, num_moe, bias=False) + self.dropout = nn.Dropout(dropout_rate) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x): + logits = self.linear_layer(x) + # 添加Dropout + logits = self.dropout(logits) + probs = self.softmax(logits) + return probs + +GATING_TO_MODEL_MAPPING = { + "Dense": Dense, + "topK": topK, + "MLP": MLP, + "Drop": Drop, + "MLP_noise": MLP_noise, + "Noise": Noise, +} \ No newline at end of file diff --git a/model/peft/tuners/lora.py b/model/peft/tuners/lora.py new file mode 100644 index 0000000000000000000000000000000000000000..09f410989abcbde7a09948cf00ef58bb70b8a24f --- /dev/null +++ b/model/peft/tuners/lora.py @@ -0,0 +1,1033 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import math +import re +import warnings +from dataclasses import asdict, dataclass, field +from enum import Enum +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn as nn +import torch.nn.functional as F +from transformers.pytorch_utils import Conv1D + +from ..import_utils import is_bnb_4bit_available, is_bnb_available +from ..utils import ( + COMMON_LAYERS_PATTERN, + TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING, + ModulesToSaveWrapper, + PeftConfig, + PeftType, + _freeze_adapter, + _get_submodules, + transpose, +) + + +if is_bnb_available(): + import bitsandbytes as bnb + + +@dataclass +class LoraConfig(PeftConfig): + """ + This is the configuration class to store the configuration of a [`LoraModel`]. + + Args: + r (`int`): Lora attention dimension. + target_modules (`Union[List[str],str]`): The names of the modules to apply Lora to. + lora_alpha (`int`): The alpha parameter for Lora scaling. + lora_dropout (`float`): The dropout probability for Lora layers. + fan_in_fan_out (`bool`): Set this to True if the layer to replace stores weight like (fan_in, fan_out). + For example, gpt-2 uses `Conv1D` which stores weights like (fan_in, fan_out) and hence this should be set to `True`.: + bias (`str`): Bias type for Lora. Can be 'none', 'all' or 'lora_only' + modules_to_save (`List[str]`):List of modules apart from LoRA layers to be set as trainable + and saved in the final checkpoint. + layers_to_transform (`Union[List[int],int]`): + The layer indexes to transform, if this argument is specified, it will apply the LoRA transformations on + the layer indexes that are specified in this list. If a single integer is passed, it will apply the LoRA + transformations on the layer at this index. + layers_pattern (`str`): + The layer pattern name, used only if `layers_to_transform` is different from `None` and if the layer + pattern is not in the common layers pattern. + """ + + r: int = field(default=8, metadata={"help": "Lora attention dimension"}) + target_modules: Optional[Union[List[str], str]] = field( + default=None, + metadata={ + "help": "List of module names or regex expression of the module names to replace with Lora." + "For example, ['q', 'v'] or '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$' " + }, + ) + lora_alpha: int = field(default=8, metadata={"help": "Lora alpha"}) + lora_dropout: float = field(default=0.0, metadata={"help": "Lora dropout"}) + fan_in_fan_out: bool = field( + default=False, + metadata={"help": "Set this to True if the layer to replace stores weight like (fan_in, fan_out)"}, + ) + bias: str = field(default="none", metadata={"help": "Bias type for Lora. Can be 'none', 'all' or 'lora_only'"}) + modules_to_save: Optional[List[str]] = field( + default=None, + metadata={ + "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " + "For example, in Sequence Classification or Token Classification tasks, " + "the final layer `classifier/score` are randomly initialized and as such need to be trainable and saved." + }, + ) + init_lora_weights: bool = field( + default=True, + metadata={"help": "Whether to initialize the weights of the Lora layers."}, + ) + layers_to_transform: Optional[Union[List, int]] = field( + default=None, + metadata={ + "help": "The layer indexes to transform, is this argument is specified, PEFT will transform only the layers indexes that are specified inside this list. If a single integer is passed, PEFT will transform only the layer at this index." + }, + ) + layers_pattern: Optional[str] = field( + default=None, + metadata={ + "help": "The layer pattern name, used only if `layers_to_transform` is different to None and if the layer pattern is not in the common layers pattern." + }, + ) + + def __post_init__(self): + self.peft_type = PeftType.LORA + + +class LoraModel(torch.nn.Module): + """ + Creates Low Rank Adapter (Lora) model from a pretrained transformers model. + + Args: + model ([`~transformers.PreTrainedModel`]): The model to be adapted. + config ([`LoraConfig`]): The configuration of the Lora model. + + Returns: + `torch.nn.Module`: The Lora model. + + Example: + + ```py + >>> from transformers import AutoModelForSeq2SeqLM + >>> from peft import LoraModel, LoraConfig + + >>> config = LoraConfig( + ... peft_type="LORA", + ... task_type="SEQ_2_SEQ_LM", + ... r=8, + ... lora_alpha=32, + ... target_modules=["q", "v"], + ... lora_dropout=0.01, + ... ) + + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + >>> lora_model = LoraModel(config, model) + ``` + + ```py + >>> import transformers + >>> from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_int8_training + + >>> target_modules = ["q_proj", "k_proj", "v_proj", "out_proj", "fc_in", "fc_out", "wte"] + >>> config = LoraConfig( + ... r=4, lora_alpha=16, target_modules=target_modules, lora_dropout=0.1, bias="none", task_type="CAUSAL_LM" + ... ) + + >>> model = transformers.GPTJForCausalLM.from_pretrained( + ... "kakaobrain/kogpt", + ... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b + ... pad_token_id=tokenizer.eos_token_id, + ... use_cache=False, + ... device_map={"": rank}, + ... torch_dtype=torch.float16, + ... load_in_8bit=True, + ... ) + >>> model = prepare_model_for_int8_training(model) + >>> lora_model = get_peft_model(model, config) + ``` + + **Attributes**: + - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted. + - **peft_config** ([`LoraConfig`]): The configuration of the Lora model. + """ + + def __init__(self, model, config, adapter_name): + super().__init__() + self.model = model + self.forward = self.model.forward + self.peft_config = config + self.add_adapter(adapter_name, self.peft_config[adapter_name]) + + def add_adapter(self, adapter_name, config=None): + if config is not None: + model_config = self.model.config.to_dict() if hasattr(self.model.config, "to_dict") else self.model.config + config = self._prepare_lora_config(config, model_config) + self.peft_config[adapter_name] = config + self._find_and_replace(adapter_name) + if len(self.peft_config) > 1 and self.peft_config[adapter_name].bias != "none": + raise ValueError( + "LoraModel supports only 1 adapter with bias. When using multiple adapters, set bias to 'none' for all adapters." + ) + mark_only_lora_as_trainable(self.model, self.peft_config[adapter_name].bias) + if self.peft_config[adapter_name].inference_mode: + _freeze_adapter(self.model, adapter_name) + + def _check_quantization_dependency(self): + loaded_in_4bit = getattr(self.model, "is_loaded_in_4bit", False) + loaded_in_8bit = getattr(self.model, "is_loaded_in_8bit", False) + if (loaded_in_4bit or loaded_in_8bit) and not is_bnb_available(): + raise ImportError( + "To use Lora with 8-bit or 4-bit quantization, please install the `bitsandbytes` package. " + "You can install it with `pip install bitsandbytes`." + ) + + def _check_target_module_exists(self, lora_config, key): + if isinstance(lora_config.target_modules, str): + target_module_found = re.fullmatch(lora_config.target_modules, key) + else: + target_module_found = any(key.endswith(target_key) for target_key in lora_config.target_modules) + is_using_layer_indexes = getattr(lora_config, "layers_to_transform", None) is not None + layer_indexing_pattern = getattr(lora_config, "layers_pattern", None) + + if is_using_layer_indexes and target_module_found: + layers_pattern = COMMON_LAYERS_PATTERN if layer_indexing_pattern is None else layer_indexing_pattern + layers_pattern = [layers_pattern] if isinstance(layers_pattern, str) else layers_pattern + + for pattern in layers_pattern: + layer_index = re.match(f".*.{pattern}\.(\d+)\.*", key) + if layer_index is not None: + layer_index = int(layer_index.group(1)) + if isinstance(lora_config.layers_to_transform, int): + target_module_found = layer_index == lora_config.layers_to_transform + else: + target_module_found = layer_index in lora_config.layers_to_transform + + break + else: + target_module_found = False + return target_module_found + + def _create_new_module(self, lora_config, adapter_name, target): + bias = hasattr(target, "bias") and target.bias is not None + kwargs = { + "r": lora_config.r, + "lora_alpha": lora_config.lora_alpha, + "lora_dropout": lora_config.lora_dropout, + "fan_in_fan_out": lora_config.fan_in_fan_out, + "init_lora_weights": lora_config.init_lora_weights, + } + loaded_in_4bit = getattr(self.model, "is_loaded_in_4bit", False) + loaded_in_8bit = getattr(self.model, "is_loaded_in_8bit", False) + + if loaded_in_8bit and isinstance(target, bnb.nn.Linear8bitLt): + eightbit_kwargs = kwargs.copy() + eightbit_kwargs.update( + { + "has_fp16_weights": target.state.has_fp16_weights, + "memory_efficient_backward": target.state.memory_efficient_backward, + "threshold": target.state.threshold, + "index": target.index, + } + ) + new_module = Linear8bitLt( + adapter_name, target.in_features, target.out_features, bias=bias, **eightbit_kwargs + ) + elif loaded_in_4bit and is_bnb_4bit_available() and isinstance(target, bnb.nn.Linear4bit): + fourbit_kwargs = kwargs.copy() + fourbit_kwargs.update( + { + "compute_dtype": target.compute_dtype, + "compress_statistics": target.weight.compress_statistics, + "quant_type": target.weight.quant_type, + } + ) + new_module = Linear4bit(adapter_name, target.in_features, target.out_features, bias=bias, **fourbit_kwargs) + elif isinstance(target, torch.nn.Embedding): + embedding_kwargs = kwargs.copy() + embedding_kwargs.pop("fan_in_fan_out", None) + in_features, out_features = target.num_embeddings, target.embedding_dim + new_module = Embedding(adapter_name, in_features, out_features, **embedding_kwargs) + elif isinstance(target, torch.nn.Conv2d): + out_channels, in_channels = target.weight.size()[:2] + kernel_size = target.weight.size()[2:] + stride = target.stride + padding = target.padding + new_module = Conv2d(adapter_name, in_channels, out_channels, kernel_size, stride, padding, **kwargs) + else: + if isinstance(target, torch.nn.Linear): + in_features, out_features = target.in_features, target.out_features + if kwargs["fan_in_fan_out"]: + warnings.warn( + "fan_in_fan_out is set to True but the target module is `torch.nn.Linear`. " + "Setting fan_in_fan_out to False." + ) + kwargs["fan_in_fan_out"] = lora_config.fan_in_fan_out = False + elif isinstance(target, Conv1D): + in_features, out_features = ( + target.weight.ds_shape if hasattr(target.weight, "ds_shape") else target.weight.shape + ) + if not kwargs["fan_in_fan_out"]: + warnings.warn( + "fan_in_fan_out is set to False but the target module is `Conv1D`. " + "Setting fan_in_fan_out to True." + ) + kwargs["fan_in_fan_out"] = lora_config.fan_in_fan_out = True + else: + raise ValueError( + f"Target module {target} is not supported. " + f"Currently, only `torch.nn.Linear` and `Conv1D` are supported." + ) + new_module = Linear(adapter_name, in_features, out_features, bias=bias, **kwargs) + + return new_module + + def _find_and_replace(self, adapter_name): + lora_config = self.peft_config[adapter_name] + self._check_quantization_dependency() + is_target_modules_in_base_model = False + key_list = [key for key, _ in self.model.named_modules()] + + for key in key_list: + if not self._check_target_module_exists(lora_config, key): + continue + + is_target_modules_in_base_model = True + parent, target, target_name = _get_submodules(self.model, key) + + if isinstance(target, LoraLayer) and isinstance(target, torch.nn.Conv2d): + target.update_layer_conv2d( + adapter_name, + lora_config.r, + lora_config.lora_alpha, + lora_config.lora_dropout, + lora_config.init_lora_weights, + ) + elif isinstance(target, LoraLayer): + target.update_layer( + adapter_name, + lora_config.r, + lora_config.lora_alpha, + lora_config.lora_dropout, + lora_config.init_lora_weights, + ) + else: + new_module = self._create_new_module(lora_config, adapter_name, target) + self._replace_module(parent, target_name, new_module, target) + + if not is_target_modules_in_base_model: + raise ValueError( + f"Target modules {lora_config.target_modules} not found in the base model. " + f"Please check the target modules and try again." + ) + + def _replace_module(self, parent_module, child_name, new_module, old_module): + setattr(parent_module, child_name, new_module) + new_module.weight = old_module.weight + if hasattr(old_module, "bias"): + if old_module.bias is not None: + new_module.bias = old_module.bias + + if getattr(old_module, "state", None) is not None: + new_module.state = old_module.state + new_module.to(old_module.weight.device) + + # dispatch to correct device + for name, module in new_module.named_modules(): + if "lora_" in name: + module.to(old_module.weight.device) + if "ranknum" in name: + module.to(old_module.weight.device) + + def __getattr__(self, name: str): + """Forward missing attributes to the wrapped module.""" + try: + return super().__getattr__(name) # defer to nn.Module's logic + except AttributeError: + return getattr(self.model, name) + + def get_peft_config_as_dict(self, inference: bool = False): + config_dict = {} + for key, value in self.peft_config.items(): + config = {k: v.value if isinstance(v, Enum) else v for k, v in asdict(value).items()} + if inference: + config["inference_mode"] = True + config_dict[key] = config + return config + + def _set_adapter_layers(self, enabled=True): + for module in self.model.modules(): + if isinstance(module, LoraLayer): + module.disable_adapters = False if enabled else True + + def enable_adapter_layers(self): + self._set_adapter_layers(enabled=True) + + def disable_adapter_layers(self): + self._set_adapter_layers(enabled=False) + + def set_adapter(self, adapter_name): + for module in self.model.modules(): + if isinstance(module, LoraLayer): + if module.merged: + warnings.warn("Adapter cannot be set when the model is merged. Unmerging the model first.") + module.unmerge() + module.active_adapter = adapter_name + + def merge_adapter(self): + for module in self.model.modules(): + if isinstance(module, LoraLayer): + module.merge() + + def unmerge_adapter(self): + for module in self.model.modules(): + if isinstance(module, LoraLayer): + module.unmerge() + + @staticmethod + def _prepare_lora_config(peft_config, model_config): + if peft_config.target_modules is None: + if model_config["model_type"] not in TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING: + raise ValueError("Please specify `target_modules` in `peft_config`") + peft_config.target_modules = TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING[model_config["model_type"]] + return peft_config + + def merge_and_unload(self): + r""" + This method merges the LoRa layers into the base model. This is needed if someone wants to use the base model + as a standalone model. + """ + if getattr(self.config, "model_type", None) == "gpt2": + raise ValueError("GPT2 models are not supported for merging LORA layers") + + if getattr(self.model, "is_loaded_in_8bit", False) or getattr(self.model, "is_loaded_in_4bit", False): + raise ValueError("Cannot merge LORA layers when the model is loaded in 8-bit mode") + + key_list = [key for key, _ in self.model.named_modules() if "lora" not in key] + for key in key_list: + try: + parent, target, target_name = _get_submodules(self.model, key) + except AttributeError: + continue + if isinstance(target, LoraLayer): + if isinstance(target, nn.Embedding): + new_module = torch.nn.Embedding(target.in_features, target.out_features) + elif isinstance(target, nn.Conv2d): + new_module = torch.nn.Conv2d( + target.in_channels, + target.out_channels, + kernel_size=target.kernel_size, + stride=target.stride, + padding=target.padding, + dilation=target.dilation, + ) + else: + bias = target.bias is not None + new_module = torch.nn.Linear(target.in_features, target.out_features, bias=bias) + target.merge() + self._replace_module(parent, target_name, new_module, target) + + # save any additional trainable modules part of `modules_to_save` + if isinstance(target, ModulesToSaveWrapper): + setattr(parent, target_name, target.modules_to_save[target.active_adapter]) + + return self.model + + def add_weighted_adapter(self, adapters, weights, adapter_name): + if len({self.peft_config[adapter].r for adapter in adapters}) != 1: + raise ValueError("All adapters must have the same r value") + self.peft_config[adapter_name] = self.peft_config[adapters[0]] + self.peft_config[adapter_name].lora_alpha = self.peft_config[adapters[0]].r + self._find_and_replace(adapter_name) + mark_only_lora_as_trainable(self.model, self.peft_config[adapter_name].bias) + _freeze_adapter(self.model, adapter_name) + key_list = [key for key, _ in self.model.named_modules() if "lora" not in key] + for key in key_list: + _, target, _ = _get_submodules(self.model, key) + if isinstance(target, LoraLayer): + if adapter_name in target.lora_A: + target.lora_A[adapter_name].weight.data = target.lora_A[adapter_name].weight.data * 0.0 + target.lora_B[adapter_name].weight.data = target.lora_B[adapter_name].weight.data * 0.0 + for adapter, weight in zip(adapters, weights): + if adapter not in target.lora_A: + continue + target.lora_A[adapter_name].weight.data += ( + target.lora_A[adapter].weight.data * weight * target.scaling[adapter] + ) + target.lora_B[adapter_name].weight.data += target.lora_B[adapter].weight.data * weight + + elif adapter_name in target.lora_embedding_A: + target.lora_embedding_A[adapter_name].data = target.lora_embedding_A[adapter_name].data * 0.0 + target.lora_embedding_B[adapter_name].data = target.lora_embedding_B[adapter_name].data * 0.0 + for adapter, weight in zip(adapters, weights): + if adapter not in target.lora_embedding_A: + continue + target.lora_embedding_A[adapter_name].data += ( + target.lora_embedding_A[adapter].data * weight * target.scaling[adapter] + ) + target.lora_embedding_B[adapter_name].data += target.lora_embedding_B[adapter].data * weight + + +# Below code is based on https://github.com/microsoft/LoRA/blob/main/loralib/layers.py +# and modified to work with PyTorch FSDP + + +# ------------------------------------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. +# ------------------------------------------------------------------------------------------ + + +# had to adapt it for `lora_only` to work +def mark_only_lora_as_trainable(model: nn.Module, bias: str = "none") -> None: + for n, p in model.named_parameters(): + if "lora_" not in n: + p.requires_grad = False + if bias == "none": + return + elif bias == "all": + for n, p in model.named_parameters(): + if "bias" in n: + p.requires_grad = True + elif bias == "lora_only": + for m in model.modules(): + if isinstance(m, LoraLayer) and hasattr(m, "bias") and m.bias is not None: + m.bias.requires_grad = True + else: + raise NotImplementedError + + +class LoraLayer: + def __init__(self, in_features: int, out_features: int, **kwargs): + self.r = {} + self.lora_alpha = {} + self.scaling = {} + self.lora_dropout = nn.ModuleDict({}) + self.lora_A = nn.ModuleDict({}) + self.lora_B = nn.ModuleDict({}) + # For Embedding layer + self.lora_embedding_A = nn.ParameterDict({}) + self.lora_embedding_B = nn.ParameterDict({}) + # Mark the weight as unmerged + self.merged = False + self.disable_adapters = False + self.in_features = in_features + self.out_features = out_features + self.kwargs = kwargs + + def update_layer(self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights): + self.r[adapter_name] = r + self.lora_alpha[adapter_name] = lora_alpha + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + lora_dropout_layer = nn.Identity() + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + if r > 0: + self.lora_A.update(nn.ModuleDict({adapter_name: nn.Linear(self.in_features, r, bias=False)})) + self.lora_B.update(nn.ModuleDict({adapter_name: nn.Linear(r, self.out_features, bias=False)})) + self.scaling[adapter_name] = lora_alpha / r + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def update_layer_conv2d(self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights): + self.r[adapter_name] = r + self.lora_alpha[adapter_name] = lora_alpha + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + lora_dropout_layer = nn.Identity() + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + if r > 0: + kernel_size = self.kwargs["kernel_size"] + stride = self.kwargs["stride"] + padding = self.kwargs["padding"] + self.lora_A.update( + nn.ModuleDict({adapter_name: nn.Conv2d(self.in_features, r, kernel_size, stride, padding, bias=False)}) + ) + self.lora_B.update( + nn.ModuleDict({adapter_name: nn.Conv2d(r, self.out_features, (1, 1), (1, 1), bias=False)}) + ) + self.scaling[adapter_name] = lora_alpha / r + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def update_layer_embedding(self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights): + self.r[adapter_name] = r + self.lora_alpha[adapter_name] = lora_alpha + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + lora_dropout_layer = nn.Identity() + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + if r > 0: + self.lora_embedding_A.update( + nn.ParameterDict({adapter_name: nn.Parameter(self.weight.new_zeros((r, self.in_features)))}) + ) + self.lora_embedding_B.update( + nn.ParameterDict({adapter_name: nn.Parameter(self.weight.new_zeros((self.out_features, r)))}) + ) + self.scaling[adapter_name] = lora_alpha / r + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def reset_lora_parameters(self, adapter_name): + if adapter_name in self.lora_A.keys(): + # initialize A the same way as the default for nn.Linear and B to zero + nn.init.kaiming_uniform_(self.lora_A[adapter_name].weight, a=math.sqrt(5)) + nn.init.zeros_(self.lora_B[adapter_name].weight) + if adapter_name in self.lora_embedding_A.keys(): + # initialize a the same way as the default for nn.linear and b to zero + nn.init.zeros_(self.lora_embedding_A[adapter_name]) + nn.init.normal_(self.lora_embedding_B[adapter_name]) + + +class Linear(nn.Linear, LoraLayer): + # Lora implemented in a dense layer + def __init__( + self, + adapter_name: str, + in_features: int, + out_features: int, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + fan_in_fan_out: bool = False, # Set this to True if the layer to replace stores weight like (fan_in, fan_out) + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + nn.Linear.__init__(self, in_features, out_features, **kwargs) + LoraLayer.__init__(self, in_features=in_features, out_features=out_features) + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + self.fan_in_fan_out = fan_in_fan_out + if fan_in_fan_out: + self.weight.data = self.weight.data.T + + nn.Linear.reset_parameters(self) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def merge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data += ( + transpose( + self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, + self.fan_in_fan_out, + ) + * self.scaling[self.active_adapter] + ) + self.merged = True + + def unmerge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data -= ( + transpose( + self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, + self.fan_in_fan_out, + ) + * self.scaling[self.active_adapter] + ) + self.merged = False + + def forward(self, x: torch.Tensor): + previous_dtype = x.dtype + if self.active_adapter not in self.lora_A.keys(): + return F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + + result += ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ) + * self.scaling[self.active_adapter] + ) + else: + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + + result = result.to(previous_dtype) + + return result + + +class Embedding(nn.Embedding, LoraLayer): + # LoRA implemented in a Embedding layer + def __init__( + self, + adapter_name: str, + num_embeddings: int, + embedding_dim: int, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + nn.Embedding.__init__(self, num_embeddings, embedding_dim, **kwargs) + LoraLayer.__init__(self, in_features=num_embeddings, out_features=embedding_dim) + + self.weight.requires_grad = False + + nn.Embedding.reset_parameters(self) + self.update_layer_embedding(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def unmerge(self, mode: bool = True): + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data -= ( + transpose( + self.lora_embedding_B[self.active_adapter] @ self.lora_embedding_A[self.active_adapter], True + ) + * self.scaling[self.active_adapter] + ) + self.merged = False + + def merge(self): + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data += ( + transpose( + self.lora_embedding_B[self.active_adapter] @ self.lora_embedding_A[self.active_adapter], True + ) + * self.scaling[self.active_adapter] + ) + self.merged = True + + def forward(self, x: torch.Tensor): + if self.disable_adapters: + if self.r[self.active.adapter] > 0 and self.merged: + self.weight.data -= ( + transpose( + self.lora_embedding_B[self.active_adapter].weight + @ self.lora_embedding_A[self.active_adapter].weight, + True, + ) + * self.scaling[self.active_adapter] + ) + self.merged = False + return nn.Embedding.forward(self, x) + + elif self.r[self.active_adapter] > 0 and not self.merged: + result = nn.Embedding.forward(self, x) + if self.r[self.active_adapter] > 0: + after_A = F.embedding( + x, + self.lora_embedding_A[self.active_adapter].T, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) + result += (after_A @ self.lora_embedding_B[self.active_adapter].T) * self.scaling[self.active_adapter] + return result + else: + return nn.Embedding.forward(self, x) + + +class Conv2d(nn.Conv2d, LoraLayer): + # Lora implemented in a conv2d layer + def __init__( + self, + adapter_name: str, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int]], + stride: Union[int, Tuple[int]] = 1, + padding: Union[int, Tuple[int]] = 0, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + nn.Conv2d.__init__(self, in_channels, out_channels, kernel_size, stride, padding) + LoraLayer.__init__( + self, + in_features=in_channels, + out_features=out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding, + ) + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + nn.Conv2d.reset_parameters(self) + self.update_layer_conv2d(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def merge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + # https://github.com/bmaltais/kohya_ss/blob/feb6728762a8f463d15ba936d189d4c3abfaa1ab/networks/lora.py#L117 + if self.weight.size()[2:4] == (1, 1): + # conv2d 1x1 + self.weight.data += ( + self.lora_B[self.active_adapter].weight.squeeze(3).squeeze(2) + @ self.lora_A[self.active_adapter].weight.squeeze(3).squeeze(2) + ).unsqueeze(2).unsqueeze(3) * self.scaling[self.active_adapter] + else: + # conv2d 3x3 + self.weight.data += ( + F.conv2d( + self.lora_A[self.active_adapter].weight.permute(1, 0, 2, 3), + self.lora_B[self.active_adapter].weight, + ).permute(1, 0, 2, 3) + * self.scaling[self.active_adapter] + ) + self.merged = True + + def unmerge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + if self.weight.size()[2:4] == (1, 1): + # conv2d 1x1 + self.weight.data -= ( + self.lora_B[self.active_adapter].weight.squeeze(3).squeeze(2) + @ self.lora_A[self.active_adapter].weight.squeeze(3).squeeze(2) + ).unsqueeze(2).unsqueeze(3) * self.scaling[self.active_adapter] + else: + # conv2d 3x3 + self.weight.data += ( + F.conv2d( + self.lora_A[self.active_adapter].weight.permute(1, 0, 2, 3), + self.lora_B[self.active_adapter].weight, + ).permute(1, 0, 2, 3) + * self.scaling[self.active_adapter] + ) + self.merged = False + + def forward(self, x: torch.Tensor): + previous_dtype = x.dtype + + if self.active_adapter not in self.lora_A.keys(): + return F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + + result += ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ) + * self.scaling[self.active_adapter] + ) + else: + result = F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + + result = result.to(previous_dtype) + + return result + + +if is_bnb_available(): + + class Linear8bitLt(bnb.nn.Linear8bitLt, LoraLayer): + # Lora implemented in a dense layer + def __init__( + self, + adapter_name, + in_features, + out_features, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + bnb.nn.Linear8bitLt.__init__( + self, + in_features, + out_features, + bias=kwargs.get("bias", True), + has_fp16_weights=kwargs.get("has_fp16_weights", True), + memory_efficient_backward=kwargs.get("memory_efficient_backward", False), + threshold=kwargs.get("threshold", 0.0), + index=kwargs.get("index", None), + ) + LoraLayer.__init__(self, in_features=in_features, out_features=out_features) + + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + init_lora_weights = kwargs.pop("init_lora_weights", True) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def forward(self, x: torch.Tensor): + result = super().forward(x) + + if self.disable_adapters or self.active_adapter not in self.lora_A.keys(): + return result + elif self.r[self.active_adapter] > 0: + if not torch.is_autocast_enabled(): + expected_dtype = result.dtype + + if x.dtype != torch.float32: + x = x.float() + output = ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ).to(expected_dtype) + * self.scaling[self.active_adapter] + ) + else: + output = ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ) + * self.scaling[self.active_adapter] + ) + result += output + return result + + if is_bnb_4bit_available(): + + class Linear4bit(bnb.nn.Linear4bit, LoraLayer): + # Lora implemented in a dense layer + def __init__( + self, + adapter_name, + in_features, + out_features, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + bnb.nn.Linear4bit.__init__( + self, + in_features, + out_features, + bias=kwargs.get("bias", True), + compute_dtype=kwargs.get("compute_dtype", torch.float32), + compress_statistics=kwargs.get("compress_statistics", True), + quant_type=kwargs.get("quant_type", "nf4"), + ) + LoraLayer.__init__(self, in_features=in_features, out_features=out_features) + + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + init_lora_weights = kwargs.pop("init_lora_weights", True) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def forward(self, x: torch.Tensor): + result = super().forward(x) + + if self.disable_adapters or self.active_adapter not in self.lora_A.keys(): + return result + elif self.r[self.active_adapter] > 0: + result = result.clone() + if not torch.is_autocast_enabled(): + expected_dtype = result.dtype + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + output = ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ).to(expected_dtype) + * self.scaling[self.active_adapter] + ) + else: + output = ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ) + * self.scaling[self.active_adapter] + ) + result += output + return result diff --git a/model/peft/tuners/moelora.py b/model/peft/tuners/moelora.py new file mode 100644 index 0000000000000000000000000000000000000000..a5f1b7f9b9313052d7bf7e7953ceb51110b3a0e0 --- /dev/null +++ b/model/peft/tuners/moelora.py @@ -0,0 +1,1164 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import traceback +import pickle +import math +import re +import warnings +from dataclasses import asdict, dataclass, field +from enum import Enum +from typing import List, Optional, Tuple, Union +import itertools +import copy +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.functional as F +from transformers.pytorch_utils import Conv1D +from .gating import GATING_TO_MODEL_MAPPING + +from ..import_utils import is_bnb_4bit_available, is_bnb_available +from ..utils import ( + COMMON_LAYERS_PATTERN, + TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING, + ModulesToSaveWrapper, + PeftConfig, + PeftType, + _freeze_adapter, + _get_submodules, + transpose, +) + +if is_bnb_available(): + import bitsandbytes as bnb + + +@dataclass +class MoeLoraConfig(PeftConfig): + """ + This is the configuration class to store the configuration of a [`MoeLoraModel`]. + + Args: + r (`int`): Lora attention dimension. + target_modules (`Union[List[str],str]`): The names of the modules to apply Lora to. + lora_alpha (`int`): The alpha parameter for Lora scaling. + lora_dropout (`float`): The dropout probability for Lora layers. + fan_in_fan_out (`bool`): Set this to True if the layer to replace stores weight like (fan_in, fan_out). + For example, gpt-2 uses `Conv1D` which stores weights like (fan_in, fan_out) and hence this should be set to `True`.: + bias (`str`): Bias type for Lora. Can be 'none', 'all' or 'lora_only' + modules_to_save (`List[str]`):List of modules apart from LoRA layers to be set as trainable + and saved in the final checkpoint. + layers_to_transform (`Union[List[int],int]`): + The layer indexes to transform, if this argument is specified, it will apply the LoRA transformations on + the layer indexes that are specified in this list. If a single integer is passed, it will apply the LoRA + transformations on the layer at this index. + layers_pattern (`str`): + The layer pattern name, used only if `layers_to_transform` is different from `None` and if the layer + pattern is not in the common layers pattern. + """ + + r: int = field(default=8, metadata={"help": "Lora attention dimension"}) + num_moe: int = field(default=8, metadata={"help": "Num experts of MoeLora"}) + gating: str = field(default="Standard", metadata={"help": "Select the gating network for each MoeLora"}) + target_modules: Optional[Union[List[str], str]] = field( + default=None, + metadata={ + "help": "List of module names or regex expression of the module names to replace with Lora." + "For example, ['q', 'v'] or '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$' " + }, + ) + lora_alpha: int = field(default=8, metadata={"help": "Lora alpha"}) + lora_dropout: float = field(default=0.0, metadata={"help": "Lora dropout"}) + fan_in_fan_out: bool = field( + default=False, + metadata={"help": "Set this to True if the layer to replace stores weight like (fan_in, fan_out)"}, + ) + bias: str = field(default="none", metadata={"help": "Bias type for Lora. Can be 'none', 'all' or 'lora_only'"}) + modules_to_save: Optional[List[str]] = field( + default=None, + metadata={ + "help": "List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. " + "For example, in Sequence Classification or Token Classification tasks, " + "the final layer `classifier/score` are randomly initialized and as such need to be trainable and saved." + }, + ) + init_lora_weights: bool = field( + default=True, + metadata={"help": "Whether to initialize the weights of the Lora layers."}, + ) + layers_to_transform: Optional[Union[List, int]] = field( + default=None, + metadata={ + "help": "The layer indexes to transform, is this argument is specified, PEFT will transform only the layers indexes that are specified inside this list. If a single integer is passed, PEFT will transform only the layer at this index." + }, + ) + layers_pattern: Optional[str] = field( + default=None, + metadata={ + "help": "The layer pattern name, used only if `layers_to_transform` is different to None and if the layer pattern is not in the common layers pattern." + }, + ) + + def __post_init__(self): + self.peft_type = PeftType.MOELORA + + +class MoeLoraModel(torch.nn.Module): + """ + Creates Low Rank Adapter (Lora) model from a pretrained transformers model. + + Args: + model ([`~transformers.PreTrainedModel`]): The model to be adapted. + config ([`LoraConfig`]): The configuration of the Lora model. + + Returns: + `torch.nn.Module`: The Lora model. + + Example: + + ```py + >>> from transformers import AutoModelForSeq2SeqLM + >>> from moelora import MoeLoraModel, MoeLoraConfig + + >>> config = LoraConfig( + ... peft_type="LORA", + ... task_type="SEQ_2_SEQ_LM", + ... r=8, + ... lora_alpha=32, + ... target_modules=["q", "v"], + ... lora_dropout=0.01, + ... ) + + >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") + >>> lora_model = MoeLoraModel(config, model) + ``` + + ```py + >>> import transformers + >>> from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_int8_training + + >>> target_modules = ["q_proj", "k_proj", "v_proj", "out_proj", "fc_in", "fc_out", "wte"] + >>> config = LoraConfig( + ... r=4, lora_alpha=16, target_modules=target_modules, lora_dropout=0.1, bias="none", task_type="CAUSAL_LM" + ... ) + + >>> model = transformers.GPTJForCausalLM.from_pretrained( + ... "kakaobrain/kogpt", + ... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b + ... pad_token_id=tokenizer.eos_token_id, + ... use_cache=False, + ... device_map={"": rank}, + ... torch_dtype=torch.float16, + ... load_in_8bit=True, + ... ) + >>> model = prepare_model_for_int8_training(model) + >>> lora_model = get_peft_model(model, config) + ``` + + **Attributes**: + - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted. + - **peft_config** ([`LoraConfig`]): The configuration of the Lora model. + """ + + def __init__(self, model, config, adapter_name): + super().__init__() + self.model = model + + # self.forward = self.model.forward + + + self.self_model_generate = self.model.generate + self.model.generate = self.generate + + """self.self_model_forward = self.model.forward + self.model.forward = self.forward""" + + self.peft_config = config + self.global_user_embeds = [] + self.gate_weights = [] + self.add_adapter(adapter_name, self.peft_config[adapter_name]) + + def forward(self, **kwargs): + self.global_user_embeds.clear() + user_embeds = kwargs['user_embeds'] + self.global_user_embeds.extend([user_embeds]) + + self.gate_weights.clear() + gate_weights = kwargs['gate_weights'] + self.gate_weights.extend([gate_weights]) + + return self.model(**kwargs) + # return self.self_model_forward(**kwargs) + + def generate(self, **kwargs): + self.global_user_embeds.clear() + user_embeds = kwargs['user_embeds'] + self.global_user_embeds.extend([user_embeds]) + + self.gate_weights.clear() + gate_weights = kwargs['gate_weights'] + # print("generate, gate_weights:", gate_weights) + self.gate_weights.extend([gate_weights]) + + return self.self_model_generate(**kwargs) + + def add_adapter(self, adapter_name, config=None): + if config is not None: + model_config = self.model.config.to_dict() if hasattr(self.model.config, "to_dict") else self.model.config + config = self._prepare_moelora_config(config, model_config) + self.peft_config[adapter_name] = config + self._find_and_replace(adapter_name) + if len(self.peft_config) > 1 and self.peft_config[adapter_name].bias != "none": + raise ValueError( + "MoeLoraModel supports only 1 adapter with bias. When using multiple adapters, set bias to 'none' for all adapters." + ) + mark_only_lora_as_trainable(self.model, self.peft_config[adapter_name].bias) + if self.peft_config[adapter_name].inference_mode: + _freeze_adapter(self.model, adapter_name) + + def _check_quantization_dependency(self): + loaded_in_4bit = getattr(self.model, "is_loaded_in_4bit", False) + loaded_in_8bit = getattr(self.model, "is_loaded_in_8bit", False) + if (loaded_in_4bit or loaded_in_8bit) and not is_bnb_available(): + raise ImportError( + "To use Lora with 8-bit or 4-bit quantization, please install the `bitsandbytes` package. " + "You can install it with `pip install bitsandbytes`." + ) + + def _check_target_module_exists(self, moelora_config, key): + if isinstance(moelora_config.target_modules, str): + target_module_found = re.fullmatch(moelora_config.target_modules, key) + else: + target_module_found = any(key.endswith(target_key) for target_key in moelora_config.target_modules) + is_using_layer_indexes = getattr(moelora_config, "layers_to_transform", None) is not None + layer_indexing_pattern = getattr(moelora_config, "layers_pattern", None) + + if is_using_layer_indexes and target_module_found: + layers_pattern = COMMON_LAYERS_PATTERN if layer_indexing_pattern is None else layer_indexing_pattern + layers_pattern = [layers_pattern] if isinstance(layers_pattern, str) else layers_pattern + + for pattern in layers_pattern: + layer_index = re.match(f".*.{pattern}\.(\d+)\.*", key) + if layer_index is not None: + layer_index = int(layer_index.group(1)) + if isinstance(moelora_config.layers_to_transform, int): + target_module_found = layer_index == moelora_config.layers_to_transform + else: + target_module_found = layer_index in moelora_config.layers_to_transform + + break + else: + target_module_found = False + return target_module_found + + def _create_new_module(self, moelora_config, adapter_name, target, **kwargs): + bias = hasattr(target, "bias") and target.bias is not None + kwargs = { + "r": moelora_config.r, + + "num_moe": moelora_config.num_moe, + "gating": moelora_config.gating, + "global_user_embeds": self.global_user_embeds, + + "gate_weights": self.gate_weights, + + "lora_alpha": moelora_config.lora_alpha, + "lora_dropout": moelora_config.lora_dropout, + "fan_in_fan_out": moelora_config.fan_in_fan_out, + "init_lora_weights": moelora_config.init_lora_weights, + } + loaded_in_4bit = getattr(self.model, "is_loaded_in_4bit", False) + loaded_in_8bit = getattr(self.model, "is_loaded_in_8bit", False) + + if loaded_in_8bit and isinstance(target, bnb.nn.Linear8bitLt): + eightbit_kwargs = kwargs.copy() + eightbit_kwargs.update( + { + "has_fp16_weights": target.state.has_fp16_weights, + "memory_efficient_backward": target.state.memory_efficient_backward, + "threshold": target.state.threshold, + "index": target.index, + } + ) + eightbit_kwargs.pop('fan_in_fan_out', None) + eightbit_kwargs.pop('init_lora_weights', None) + new_module = Linear8bitLt( + adapter_name, target.in_features, target.out_features, bias=bias, **eightbit_kwargs + ) + elif loaded_in_4bit and is_bnb_4bit_available() and isinstance(target, bnb.nn.Linear4bit): + fourbit_kwargs = kwargs.copy() + fourbit_kwargs.update( + { + "compute_dtype": target.compute_dtype, + "compress_statistics": target.weight.compress_statistics, + "quant_type": target.weight.quant_type, + } + ) + new_module = Linear4bit(adapter_name, target.in_features, target.out_features, bias=bias, **fourbit_kwargs) + elif isinstance(target, torch.nn.Embedding): + embedding_kwargs = kwargs.copy() + embedding_kwargs.pop("fan_in_fan_out", None) + in_features, out_features = target.num_embeddings, target.embedding_dim + new_module = Embedding(adapter_name, in_features, out_features, **embedding_kwargs) + elif isinstance(target, torch.nn.Conv2d): + out_channels, in_channels = target.weight.size()[:2] + kernel_size = target.weight.size()[2:] + stride = target.stride + padding = target.padding + new_module = Conv2d(adapter_name, in_channels, out_channels, kernel_size, stride, padding, **kwargs) + else: + if isinstance(target, torch.nn.Linear): + in_features, out_features = target.in_features, target.out_features + if kwargs["fan_in_fan_out"]: + warnings.warn( + "fan_in_fan_out is set to True but the target module is `torch.nn.Linear`. " + "Setting fan_in_fan_out to False." + ) + kwargs["fan_in_fan_out"] = moelora_config.fan_in_fan_out = False + elif isinstance(target, Conv1D): + in_features, out_features = ( + target.weight.ds_shape if hasattr(target.weight, "ds_shape") else target.weight.shape + ) + if not kwargs["fan_in_fan_out"]: + warnings.warn( + "fan_in_fan_out is set to False but the target module is `Conv1D`. " + "Setting fan_in_fan_out to True." + ) + kwargs["fan_in_fan_out"] = moelora_config.fan_in_fan_out = True + else: + raise ValueError( + f"Target module {target} is not supported. " + f"Currently, only `torch.nn.Linear` and `Conv1D` are supported." + ) + new_module = Linear(adapter_name, in_features, out_features, bias=bias, **kwargs) + + return new_module + + def _find_and_replace(self, adapter_name): + moelora_config = self.peft_config[adapter_name] + self._check_quantization_dependency() + is_target_modules_in_base_model = False + key_list = [key for key, _ in self.model.named_modules()] + + for key in key_list: + if not self._check_target_module_exists(moelora_config, key): + continue + + is_target_modules_in_base_model = True + parent, target, target_name = _get_submodules(self.model, key) + + if isinstance(target, MoeLoraLayer) and isinstance(target, torch.nn.Conv2d): + target.update_layer_conv2d( + adapter_name, + moelora_config.r, + moelora_config.lora_alpha, + moelora_config.lora_dropout, + moelora_config.init_lora_weights, + ) + elif isinstance(target, MoeLoraLayer): + target.update_layer( + adapter_name, + moelora_config.r, + moelora_config.num_moe, + moelora_config.gating, + moelora_config.lora_alpha, + moelora_config.lora_dropout, + moelora_config.init_lora_weights, + ) + else: + new_module = self._create_new_module(moelora_config, adapter_name, target) + self._replace_module(parent, target_name, new_module, target) + + if not is_target_modules_in_base_model: + raise ValueError( + f"Target modules {moelora_config.target_modules} not found in the base model. " + f"Please check the target modules and try again." + ) + + def _replace_module(self, parent_module, child_name, new_module, old_module): + setattr(parent_module, child_name, new_module) + new_module.weight = old_module.weight + if hasattr(old_module, "bias"): + if old_module.bias is not None: + new_module.bias = old_module.bias + + if getattr(old_module, "state", None) is not None: + new_module.state = old_module.state + new_module.to(old_module.weight.device) + + # dispatch to correct device + for name, module in new_module.named_modules(): + if "lora_" in name: + module.to(old_module.weight.device) + + if "gating" in name: + module.to(old_module.weight.device) + + if "ranknum" in name: + module.to(old_module.weight.device) + + def __getattr__(self, name: str): + """Forward missing attributes to the wrapped module.""" + try: + return super().__getattr__(name) # defer to nn.Module's logic + except AttributeError: + return getattr(self.model, name) + + def get_peft_config_as_dict(self, inference: bool = False): + config_dict = {} + for key, value in self.peft_config.items(): + config = {k: v.value if isinstance(v, Enum) else v for k, v in asdict(value).items()} + if inference: + config["inference_mode"] = True + config_dict[key] = config + return config + + def _set_adapter_layers(self, enabled=True): + for module in self.model.modules(): + if isinstance(module, MoeLoraLayer): + module.disable_adapters = False if enabled else True + + def enable_adapter_layers(self): + self._set_adapter_layers(enabled=True) + + def disable_adapter_layers(self): + self._set_adapter_layers(enabled=False) + + def set_adapter(self, adapter_name): + for module in self.model.modules(): + if isinstance(module, MoeLoraLayer): + if module.merged: + warnings.warn("Adapter cannot be set when the model is merged. Unmerging the model first.") + module.unmerge() + module.active_adapter = adapter_name + + def merge_adapter(self): + for module in self.model.modules(): + if isinstance(module, MoeLoraLayer): + module.merge() + + def unmerge_adapter(self): + for module in self.model.modules(): + if isinstance(module, MoeLoraLayer): + module.unmerge() + + @staticmethod + def _prepare_moelora_config(peft_config, model_config): + if peft_config.target_modules is None: + if model_config["model_type"] not in TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING: + raise ValueError("Please specify `target_modules` in `peft_config`") + peft_config.target_modules = TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING[model_config["model_type"]] + return peft_config + + def merge_and_unload(self): + r""" + This method merges the LoRa layers into the base model. This is needed if someone wants to use the base model + as a standalone model. + """ + if getattr(self.config, "model_type", None) == "gpt2": + raise ValueError("GPT2 models are not supported for merging LORA layers") + + if getattr(self.model, "is_loaded_in_8bit", False) or getattr(self.model, "is_loaded_in_4bit", False): + raise ValueError("Cannot merge LORA layers when the model is loaded in 8-bit mode") + + key_list = [key for key, _ in self.model.named_modules() if "lora" not in key] + for key in key_list: + try: + parent, target, target_name = _get_submodules(self.model, key) + except AttributeError: + continue + if isinstance(target, MoeLoraLayer): + if isinstance(target, nn.Embedding): + new_module = torch.nn.Embedding(target.in_features, target.out_features) + elif isinstance(target, nn.Conv2d): + new_module = torch.nn.Conv2d( + target.in_channels, + target.out_channels, + kernel_size=target.kernel_size, + stride=target.stride, + padding=target.padding, + dilation=target.dilation, + ) + else: + bias = target.bias is not None + new_module = torch.nn.Linear(target.in_features, target.out_features, bias=bias) + target.merge() + self._replace_module(parent, target_name, new_module, target) + + # save any additional trainable modules part of `modules_to_save` + if isinstance(target, ModulesToSaveWrapper): + setattr(parent, target_name, target.modules_to_save[target.active_adapter]) + + return self.model + + def add_weighted_adapter(self, adapters, weights, adapter_name): + if len({self.peft_config[adapter].r for adapter in adapters}) != 1: + raise ValueError("All adapters must have the same r value") + self.peft_config[adapter_name] = self.peft_config[adapters[0]] + self.peft_config[adapter_name].lora_alpha = self.peft_config[adapters[0]].r + self._find_and_replace(adapter_name) + mark_only_lora_as_trainable(self.model, self.peft_config[adapter_name].bias) + _freeze_adapter(self.model, adapter_name) + key_list = [key for key, _ in self.model.named_modules() if "lora" not in key] + for key in key_list: + _, target, _ = _get_submodules(self.model, key) + if isinstance(target, MoeLoraLayer): + if adapter_name in target.lora_A: + target.lora_A[adapter_name].weight.data = target.lora_A[adapter_name].weight.data * 0.0 + target.lora_B[adapter_name].weight.data = target.lora_B[adapter_name].weight.data * 0.0 + for adapter, weight in zip(adapters, weights): + if adapter not in target.lora_A: + continue + target.lora_A[adapter_name].weight.data += ( + target.lora_A[adapter].weight.data * weight * target.scaling[adapter] + ) + target.lora_B[adapter_name].weight.data += target.lora_B[adapter].weight.data * weight + + elif adapter_name in target.lora_embedding_A: + target.lora_embedding_A[adapter_name].data = target.lora_embedding_A[adapter_name].data * 0.0 + target.lora_embedding_B[adapter_name].data = target.lora_embedding_B[adapter_name].data * 0.0 + for adapter, weight in zip(adapters, weights): + if adapter not in target.lora_embedding_A: + continue + target.lora_embedding_A[adapter_name].data += ( + target.lora_embedding_A[adapter].data * weight * target.scaling[adapter] + ) + target.lora_embedding_B[adapter_name].data += target.lora_embedding_B[adapter].data * weight + + +# Below code is based on https://github.com/microsoft/LoRA/blob/main/loralib/layers.py +# and modified to work with PyTorch FSDP + + +# ------------------------------------------------------------------------------------------ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. +# ------------------------------------------------------------------------------------------ + + +# had to adapt it for `lora_only` to work +def mark_only_lora_as_trainable(model: nn.Module, bias: str = "none") -> None: + for n, p in model.named_parameters(): + if "lora_" not in n and "gating" not in n: + p.requires_grad = False + if bias == "none": + return + elif bias == "all": + for n, p in model.named_parameters(): + if "bias" in n: + p.requires_grad = True + elif bias == "lora_only": + for m in model.modules(): + if isinstance(m, MoeLoraLayer) and hasattr(m, "bias") and m.bias is not None: + m.bias.requires_grad = True + else: + raise NotImplementedError + + +class MoeLoraLayer: + def __init__(self, in_features: int, out_features: int, **kwargs): + self.r = {} + + self.num_moe = {} + + self.lora_alpha = {} + self.scaling = {} + self.lora_dropout = nn.ModuleDict({}) + self.lora_A = nn.ModuleDict({}) + self.lora_B = nn.ModuleDict({}) + + self.gating = nn.ModuleDict({}) + + # For Embedding layer + self.lora_embedding_A = nn.ParameterDict({}) + self.lora_embedding_B = nn.ParameterDict({}) + # Mark the weight as unmerged + self.merged = False + self.disable_adapters = False + self.in_features = in_features + self.out_features = out_features + self.kwargs = kwargs + + def update_layer(self, adapter_name, r, num_moe, gating, lora_alpha, lora_dropout, + init_lora_weights): + self.r[adapter_name] = r + + self.num_moe[adapter_name] = num_moe + + self.lora_alpha[adapter_name] = lora_alpha + + self.gating.update( + nn.ModuleDict({adapter_name: GATING_TO_MODEL_MAPPING[gating](num_moe=num_moe, dim=self.in_features)})) + self.gating[adapter_name].to(self.weight.device) + + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + lora_dropout_layer = nn.Identity() + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + if r > 0: + self.lora_A.update(nn.ModuleDict({adapter_name: nn.Linear(self.in_features, r, bias=False)})) # TODO + self.lora_B.update(nn.ModuleDict({adapter_name: nn.Linear(r, self.out_features, bias=False)})) + self.scaling[adapter_name] = lora_alpha / (r // num_moe) + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def update_layer_conv2d(self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights): + self.r[adapter_name] = r + self.lora_alpha[adapter_name] = lora_alpha + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + lora_dropout_layer = nn.Identity() + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + if r > 0: + kernel_size = self.kwargs["kernel_size"] + stride = self.kwargs["stride"] + padding = self.kwargs["padding"] + self.lora_A.update( + nn.ModuleDict({adapter_name: nn.Conv2d(self.in_features, r, kernel_size, stride, padding, bias=False)}) + ) + self.lora_B.update( + nn.ModuleDict({adapter_name: nn.Conv2d(r, self.out_features, (1, 1), (1, 1), bias=False)}) + ) + self.scaling[adapter_name] = lora_alpha / r + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def update_layer_embedding(self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights): + self.r[adapter_name] = r + self.lora_alpha[adapter_name] = lora_alpha + if lora_dropout > 0.0: + lora_dropout_layer = nn.Dropout(p=lora_dropout) + else: + lora_dropout_layer = nn.Identity() + + self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) + # Actual trainable parameters + if r > 0: + self.lora_embedding_A.update( + nn.ParameterDict({adapter_name: nn.Parameter(self.weight.new_zeros((r, self.in_features)))}) + ) + self.lora_embedding_B.update( + nn.ParameterDict({adapter_name: nn.Parameter(self.weight.new_zeros((self.out_features, r)))}) + ) + self.scaling[adapter_name] = lora_alpha / r + if init_lora_weights: + self.reset_lora_parameters(adapter_name) + self.to(self.weight.device) + + def reset_lora_parameters(self, adapter_name): + if adapter_name in self.lora_A.keys(): + # initialize A the same way as the default for nn.Linear and B to zero + nn.init.kaiming_uniform_(self.lora_A[adapter_name].weight, a=math.sqrt(5)) + nn.init.zeros_(self.lora_B[adapter_name].weight) + if adapter_name in self.lora_embedding_A.keys(): + # initialize a the same way as the default for nn.linear and b to zero + nn.init.zeros_(self.lora_embedding_A[adapter_name]) + nn.init.normal_(self.lora_embedding_B[adapter_name]) + + +class Linear(nn.Linear, MoeLoraLayer): + # Lora implemented in a dense layer + def __init__( + self, + adapter_name: str, + in_features: int, + out_features: int, + r: int = 0, + + # moe额外参数 + num_moe: int = 0, + gating: str = "", + global_user_embeds: List = [], + gate_weights: List = [], + + lora_alpha: int = 1, + lora_dropout: float = 0.0, + fan_in_fan_out: bool = False, + # Set this to True if the layer to replace stores weight like (fan_in, fan_out) + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + nn.Linear.__init__(self, in_features, out_features, **kwargs) + MoeLoraLayer.__init__(self, in_features=in_features, out_features=out_features) + # Freezing the pre-trained weight matrix冻结预训练参数 + self.weight.requires_grad = False + self.gating.requires_grad_ = True + self.fan_in_fan_out = fan_in_fan_out + if fan_in_fan_out: + self.weight.data = self.weight.data.T + nn.Linear.reset_parameters(self) + self.update_layer(adapter_name, r, num_moe, gating, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + self.global_user_embeds = global_user_embeds + self.gate_weights = gate_weights + + def merge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data += ( + transpose( + self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, + self.fan_in_fan_out, + ) + * self.scaling[self.active_adapter] + ) + self.merged = True + + def unmerge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data -= ( + transpose( + self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, + self.fan_in_fan_out, + ) + * self.scaling[self.active_adapter] + ) + self.merged = False + + def calculate_B(self, A_out): + batch_size, seq_len, n, r = A_out.size() + weight = self.lora_B[self.active_adapter].weight.t().reshape(n, r, -1) + return torch.einsum('ijkl, klm->ijkm', A_out, weight) + + + def forward(self, x: torch.Tensor, **kwargs): + flag = False + # user_embeds = self.global_user_embeds[0] + gate_weights = self.gate_weights[0] + previous_dtype = x.dtype + batch_size, seq_len, _ = x.size() + + try: + if self.active_adapter not in self.lora_A.keys(): + return F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + + A_out = self.lora_A[self.active_adapter]( + self.lora_dropout[self.active_adapter](x) + ).reshape(batch_size, seq_len, self.num_moe[self.active_adapter], -1) + B_out = self.calculate_B(A_out) + + # Gate = self.gating[self.active_adapter](user_embeds).unsqueeze(-1) + Gate = gate_weights.unsqueeze(-1) + + + result += ((B_out * Gate).sum(dim=-2) * self.scaling[self.active_adapter]) + + + gate_weights_squeezed = Gate.squeeze(-1) + gate_weights_split = gate_weights_squeezed.split(1, dim=0) + gate_weight_vectors = [x.squeeze() for x in gate_weights_split] + + else: + result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias) + + + result = result.to(previous_dtype) + + return result + except Exception as e: + print(f"An error occurred: {e}") + return torch.zeros_like(x) # 返回一个与输入张量相同形状的全零张量 + + +class Embedding(nn.Embedding, MoeLoraLayer): + # LoRA implemented in a Embedding layer + def __init__( + self, + adapter_name: str, + num_embeddings: int, + embedding_dim: int, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + nn.Embedding.__init__(self, num_embeddings, embedding_dim, **kwargs) + MoeLoraLayer.__init__(self, in_features=num_embeddings, out_features=embedding_dim) + + self.weight.requires_grad = False + + nn.Embedding.reset_parameters(self) + self.update_layer_embedding(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def unmerge(self, mode: bool = True): + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data -= ( + transpose( + self.lora_embedding_B[self.active_adapter] @ self.lora_embedding_A[self.active_adapter], True + ) + * self.scaling[self.active_adapter] + ) + self.merged = False + + def merge(self): + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + self.weight.data += ( + transpose( + self.lora_embedding_B[self.active_adapter] @ self.lora_embedding_A[self.active_adapter], True + ) + * self.scaling[self.active_adapter] + ) + self.merged = True + + def forward(self, x: torch.Tensor): + if self.disable_adapters: + if self.r[self.active.adapter] > 0 and self.merged: + self.weight.data -= ( + transpose( + self.lora_embedding_B[self.active_adapter].weight + @ self.lora_embedding_A[self.active_adapter].weight, + True, + ) + * self.scaling[self.active_adapter] + ) + self.merged = False + return nn.Embedding.forward(self, x) + + elif self.r[self.active_adapter] > 0 and not self.merged: + result = nn.Embedding.forward(self, x) + if self.r[self.active_adapter] > 0: + after_A = F.embedding( + x, + self.lora_embedding_A[self.active_adapter].T, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) + result += (after_A @ self.lora_embedding_B[self.active_adapter].T) * self.scaling[self.active_adapter] + return result + else: + return nn.Embedding.forward(self, x) + + +class Conv2d(nn.Conv2d, MoeLoraLayer): + # Lora implemented in a conv2d layer + def __init__( + self, + adapter_name: str, + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int]], + stride: Union[int, Tuple[int]] = 1, + padding: Union[int, Tuple[int]] = 0, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + nn.Conv2d.__init__(self, in_channels, out_channels, kernel_size, stride, padding) + MoeLoraLayer.__init__( + self, + in_features=in_channels, + out_features=out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding, + ) + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + nn.Conv2d.reset_parameters(self) + self.update_layer_conv2d(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def merge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if self.merged: + warnings.warn("Already merged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + # https://github.com/bmaltais/kohya_ss/blob/feb6728762a8f463d15ba936d189d4c3abfaa1ab/networks/lora.py#L117 + if self.weight.size()[2:4] == (1, 1): + # conv2d 1x1 + self.weight.data += ( + self.lora_B[self.active_adapter].weight.squeeze(3).squeeze(2) + @ self.lora_A[self.active_adapter].weight.squeeze(3).squeeze(2) + ).unsqueeze(2).unsqueeze(3) * self.scaling[self.active_adapter] + else: + # conv2d 3x3 + self.weight.data += ( + F.conv2d( + self.lora_A[self.active_adapter].weight.permute(1, 0, 2, 3), + self.lora_B[self.active_adapter].weight, + ).permute(1, 0, 2, 3) + * self.scaling[self.active_adapter] + ) + self.merged = True + + def unmerge(self): + if self.active_adapter not in self.lora_A.keys(): + return + if not self.merged: + warnings.warn("Already unmerged. Nothing to do.") + return + if self.r[self.active_adapter] > 0: + if self.weight.size()[2:4] == (1, 1): + # conv2d 1x1 + self.weight.data -= ( + self.lora_B[self.active_adapter].weight.squeeze(3).squeeze(2) + @ self.lora_A[self.active_adapter].weight.squeeze(3).squeeze(2) + ).unsqueeze(2).unsqueeze(3) * self.scaling[self.active_adapter] + else: + # conv2d 3x3 + self.weight.data += ( + F.conv2d( + self.lora_A[self.active_adapter].weight.permute(1, 0, 2, 3), + self.lora_B[self.active_adapter].weight, + ).permute(1, 0, 2, 3) + * self.scaling[self.active_adapter] + ) + self.merged = False + + def forward(self, x: torch.Tensor): + previous_dtype = x.dtype + + if self.active_adapter not in self.lora_A.keys(): + return F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + + result += ( + self.lora_B[self.active_adapter]( + self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x)) + ) + * self.scaling[self.active_adapter] + ) + else: + result = F.conv2d( + x, + self.weight, + bias=self.bias, + stride=self.stride, + padding=self.padding, + dilation=self.dilation, + groups=self.groups, + ) + + result = result.to(previous_dtype) + + return result + + +if is_bnb_available(): + + class Linear8bitLt(bnb.nn.Linear8bitLt, MoeLoraLayer): + # Lora implemented in a dense layer + def __init__( + self, + adapter_name: str, + in_features: int, + out_features: int, + r: int = 0, + + # moe额外参数 + num_moe: int = 0, + gating: str = "", + global_user_embeds: List = [], + loss_fn: str = "", + + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + kwargs.setdefault('bias', True) + bnb.nn.Linear8bitLt.__init__( + self, + in_features, + out_features, + # **kwargs + ) + MoeLoraLayer.__init__(self, in_features=in_features, out_features=out_features) + + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + init_lora_weights = kwargs.pop("init_lora_weights", True) + # self.update_layer(adapter_name, r, num_moe, gating, loss_fn, lora_alpha, lora_dropout, init_lora_weights) + # bnb.nn.Linear8bitLt.reset_parameters(self) + + self.update_layer(adapter_name, r, num_moe, gating, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + self.global_user_embeds = global_user_embeds + + def calculate_B(self, A_out): + # batch_size, seq_len, self.num_moe[self.active_adapter], -1 + batch_size, seq_len, n, r = A_out.size() + weight = self.lora_B[self.active_adapter].weight.t().reshape(n, r, -1) + return torch.einsum('ijkl, klm->ijkm', A_out, weight) + + def forward(self, x: torch.Tensor): + user_embeds = self.global_user_embeds[0] + result = super().forward(x) + + batch_size, seq_len, _ = x.size() + + if self.disable_adapters or self.active_adapter not in self.lora_A.keys(): + return result + elif self.r[self.active_adapter] > 0: + if not torch.is_autocast_enabled(): + expected_dtype = result.dtype + + if x.dtype != torch.float32: + x = x.float() + A_out = self.lora_A[self.active_adapter]( + self.lora_dropout[self.active_adapter](x) + ).reshape(batch_size, seq_len, self.num_moe[self.active_adapter], -1) + B_out = self.calculate_B(A_out) + Gate = self.gating[self.active_adapter](user_embeds).unsqueeze(-1) + output = ((B_out * Gate).sum(dim=-2).to(expected_dtype) * self.scaling[self.active_adapter]) + + else: + A_out = self.lora_A[self.active_adapter]( + self.lora_dropout[self.active_adapter](x) + ).reshape(batch_size, seq_len, self.num_moe[self.active_adapter], -1) + B_out = self.calculate_B(A_out) + Gate = self.gating[self.active_adapter](user_embeds).unsqueeze(-1) + output = ((B_out * Gate).sum(dim=-2) * self.scaling[self.active_adapter]) + + result += output + return result + + + if is_bnb_4bit_available(): + + class Linear4bit(bnb.nn.Linear4bit, MoeLoraLayer): + # Lora implemented in a dense layer + def __init__( + self, + adapter_name, + in_features, + out_features, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + **kwargs, + ): + bnb.nn.Linear4bit.__init__( + self, + in_features, + out_features, + bias=kwargs.get("bias", True), + compute_dtype=kwargs.get("compute_dtype", torch.float32), + compress_statistics=kwargs.get("compress_statistics", True), + quant_type=kwargs.get("quant_type", "nf4"), + ) + MoeLoraLayer.__init__(self, in_features=in_features, out_features=out_features) + + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + + init_lora_weights = kwargs.pop("init_lora_weights", True) + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def forward(self, x: torch.Tensor): + result = super().forward(x) + user_embeds = self.global_user_embeds[0] + + if self.disable_adapters or self.active_adapter not in self.lora_A.keys(): + return result + elif self.r[self.active_adapter] > 0: + result = result.clone() + if not torch.is_autocast_enabled(): + expected_dtype = result.dtype + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + batch_size, seq_len, _ = x.size() + A_out = self.lora_A[self.active_adapter]( + self.lora_dropout[self.active_adapter](x) + ).reshape(batch_size, seq_len, self.num_moe[self.active_adapter], -1) + B_out = self.calculate_B(A_out) + Gate = self.gating[self.active_adapter](user_embeds).unsqueeze(-1) + output = ((B_out * Gate).sum(dim=-2).to(expected_dtype) * self.scaling[self.active_adapter]) + else: + x = x.to(self.lora_A[self.active_adapter].weight.dtype) + batch_size, seq_len, _ = x.size() + A_out = self.lora_A[self.active_adapter]( + self.lora_dropout[self.active_adapter](x) + ).reshape(batch_size, seq_len, self.num_moe[self.active_adapter], -1) + B_out = self.calculate_B(A_out) + Gate = self.gating[self.active_adapter](user_embeds).unsqueeze(-1) + output = ((B_out * Gate).sum(dim=-2) * self.scaling[self.active_adapter]) + result += output + return result diff --git a/model/peft/tuners/p_tuning.py b/model/peft/tuners/p_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..4a272f357d13215bb08f1ab1f2f734a94e327529 --- /dev/null +++ b/model/peft/tuners/p_tuning.py @@ -0,0 +1,170 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import enum +import warnings +from dataclasses import dataclass, field +from typing import Union + +import torch + +from ..utils import PeftType, PromptLearningConfig + + +class PromptEncoderReparameterizationType(str, enum.Enum): + MLP = "MLP" + LSTM = "LSTM" + + +@dataclass +class PromptEncoderConfig(PromptLearningConfig): + """ + This is the configuration class to store the configuration of a [`PromptEncoder`]. + + Args: + encoder_reparameterization_type (Union[[`PromptEncoderReparameterizationType`], `str`]): + The type of reparameterization to use. + encoder_hidden_size (`int`): The hidden size of the prompt encoder. + encoder_num_layers (`int`): The number of layers of the prompt encoder. + encoder_dropout (`float`): The dropout probability of the prompt encoder. + """ + + encoder_reparameterization_type: Union[str, PromptEncoderReparameterizationType] = field( + default=PromptEncoderReparameterizationType.MLP, + metadata={"help": "How to reparameterize the prompt encoder"}, + ) + encoder_hidden_size: int = field( + default=None, + metadata={"help": "The hidden size of the prompt encoder"}, + ) + encoder_num_layers: int = field( + default=2, + metadata={"help": "The number of layers of the prompt encoder"}, + ) + encoder_dropout: float = field( + default=0.0, + metadata={"help": "The dropout of the prompt encoder"}, + ) + + def __post_init__(self): + self.peft_type = PeftType.P_TUNING + + +# Based on https://github.com/NVIDIA/NeMo/blob/main/nemo/collections/nlp/modules/common/prompt_encoder.py +# with some refactor +class PromptEncoder(torch.nn.Module): + """ + The prompt encoder network that is used to generate the virtual token embeddings for p-tuning. + + Args: + config ([`PromptEncoderConfig`]): The configuration of the prompt encoder. + + Example: + + ```py + >>> from peft import PromptEncoder, PromptEncoderConfig + + >>> config = PromptEncoderConfig( + ... peft_type="P_TUNING", + ... task_type="SEQ_2_SEQ_LM", + ... num_virtual_tokens=20, + ... token_dim=768, + ... num_transformer_submodules=1, + ... num_attention_heads=12, + ... num_layers=12, + ... encoder_reparameterization_type="MLP", + ... encoder_hidden_size=768, + ... ) + + >>> prompt_encoder = PromptEncoder(config) + ``` + + **Attributes**: + - **embedding** (`torch.nn.Embedding`) -- The embedding layer of the prompt encoder. + - **mlp_head** (`torch.nn.Sequential`) -- The MLP head of the prompt encoder if `inference_mode=False`. + - **lstm_head** (`torch.nn.LSTM`) -- The LSTM head of the prompt encoder if `inference_mode=False` and + `encoder_reparameterization_type="LSTM"`. + - **token_dim** (`int`) -- The hidden embedding dimension of the base transformer model. + - **input_size** (`int`) -- The input size of the prompt encoder. + - **output_size** (`int`) -- The output size of the prompt encoder. + - **hidden_size** (`int`) -- The hidden size of the prompt encoder. + - **total_virtual_tokens** (`int`): The total number of virtual tokens of the + prompt encoder. + - **encoder_type** (Union[[`PromptEncoderReparameterizationType`], `str`]): The encoder type of the prompt + encoder. + + + Input shape: (`batch_size`, `total_virtual_tokens`) + + Output shape: (`batch_size`, `total_virtual_tokens`, `token_dim`) + """ + + def __init__(self, config): + super().__init__() + self.token_dim = config.token_dim + self.input_size = self.token_dim + self.output_size = self.token_dim + self.hidden_size = config.encoder_hidden_size + self.total_virtual_tokens = config.num_virtual_tokens * config.num_transformer_submodules + self.encoder_type = config.encoder_reparameterization_type + + # embedding + self.embedding = torch.nn.Embedding(self.total_virtual_tokens, self.token_dim) + if not config.inference_mode: + if self.encoder_type == PromptEncoderReparameterizationType.LSTM: + lstm_dropout = config.encoder_dropout + num_layers = config.encoder_num_layers + # LSTM + self.lstm_head = torch.nn.LSTM( + input_size=self.input_size, + hidden_size=self.hidden_size, + num_layers=num_layers, + dropout=lstm_dropout, + bidirectional=True, + batch_first=True, + ) + + self.mlp_head = torch.nn.Sequential( + torch.nn.Linear(self.hidden_size * 2, self.hidden_size * 2), + torch.nn.ReLU(), + torch.nn.Linear(self.hidden_size * 2, self.output_size), + ) + + elif self.encoder_type == PromptEncoderReparameterizationType.MLP: + warnings.warn( + f"for {self.encoder_type}, the `encoder_num_layers` is ignored. Exactly 2 MLP layers are used." + ) + layers = [ + torch.nn.Linear(self.input_size, self.hidden_size), + torch.nn.ReLU(), + torch.nn.Linear(self.hidden_size, self.hidden_size), + torch.nn.ReLU(), + torch.nn.Linear(self.hidden_size, self.output_size), + ] + self.mlp_head = torch.nn.Sequential(*layers) + + else: + raise ValueError("Prompt encoder type not recognized. Please use one of MLP (recommended) or LSTM.") + + def forward(self, indices): + input_embeds = self.embedding(indices) + if self.encoder_type == PromptEncoderReparameterizationType.LSTM: + output_embeds = self.mlp_head(self.lstm_head(input_embeds)[0]) + elif self.encoder_type == PromptEncoderReparameterizationType.MLP: + output_embeds = self.mlp_head(input_embeds) + else: + raise ValueError("Prompt encoder type not recognized. Please use one of MLP (recommended) or LSTM.") + + return output_embeds diff --git a/model/peft/tuners/prefix_tuning.py b/model/peft/tuners/prefix_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..d18000e0fb919236d4a7a3f3f949aa90aef30340 --- /dev/null +++ b/model/peft/tuners/prefix_tuning.py @@ -0,0 +1,109 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from dataclasses import dataclass, field + +import torch + +from ..utils import PeftType, PromptLearningConfig + + +@dataclass +class PrefixTuningConfig(PromptLearningConfig): + """ + This is the configuration class to store the configuration of a [`PrefixEncoder`]. + + Args: + encoder_hidden_size (`int`): The hidden size of the prompt encoder. + prefix_projection (`bool`): Whether to project the prefix embeddings. + """ + + encoder_hidden_size: int = field( + default=None, + metadata={"help": "The hidden size of the encoder"}, + ) + prefix_projection: bool = field( + default=False, + metadata={"help": "Whether to project the prefix tokens"}, + ) + + def __post_init__(self): + self.peft_type = PeftType.PREFIX_TUNING + + +# Based on https://github.com/THUDM/P-tuning-v2/blob/main/model/prefix_encoder.py +# with some refactor +class PrefixEncoder(torch.nn.Module): + r""" + The `torch.nn` model to encode the prefix. + + Args: + config ([`PrefixTuningConfig`]): The configuration of the prefix encoder. + + Example: + + ```py + >>> from peft import PrefixEncoder, PrefixTuningConfig + + >>> config = PrefixTuningConfig( + ... peft_type="PREFIX_TUNING", + ... task_type="SEQ_2_SEQ_LM", + ... num_virtual_tokens=20, + ... token_dim=768, + ... num_transformer_submodules=1, + ... num_attention_heads=12, + ... num_layers=12, + ... encoder_hidden_size=768, + ... ) + >>> prefix_encoder = PrefixEncoder(config) + ``` + + **Attributes**: + - **embedding** (`torch.nn.Embedding`) -- The embedding layer of the prefix encoder. + - **transform** (`torch.nn.Sequential`) -- The two-layer MLP to transform the prefix embeddings if + `prefix_projection` is `True`. + - **prefix_projection** (`bool`) -- Whether to project the prefix embeddings. + + Input shape: (`batch_size`, `num_virtual_tokens`) + + Output shape: (`batch_size`, `num_virtual_tokens`, `2*layers*hidden`) + """ + + def __init__(self, config): + super().__init__() + self.prefix_projection = config.prefix_projection + token_dim = config.token_dim + num_layers = config.num_layers + encoder_hidden_size = config.encoder_hidden_size + num_virtual_tokens = config.num_virtual_tokens + if self.prefix_projection and not config.inference_mode: + # Use a two-layer MLP to encode the prefix + self.embedding = torch.nn.Embedding(num_virtual_tokens, token_dim) + self.transform = torch.nn.Sequential( + torch.nn.Linear(token_dim, encoder_hidden_size), + torch.nn.Tanh(), + torch.nn.Linear(encoder_hidden_size, num_layers * 2 * token_dim), + ) + else: + self.embedding = torch.nn.Embedding(num_virtual_tokens, num_layers * 2 * token_dim) + + def forward(self, prefix: torch.Tensor): + if self.prefix_projection: + prefix_tokens = self.embedding(prefix) + past_key_values = self.transform(prefix_tokens) + else: + past_key_values = self.embedding(prefix) + return past_key_values diff --git a/model/peft/tuners/prompt_tuning.py b/model/peft/tuners/prompt_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..6880ff7d0c7e2c5f375a19c85b62e2355ae2b1da --- /dev/null +++ b/model/peft/tuners/prompt_tuning.py @@ -0,0 +1,130 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import enum +import math +from dataclasses import dataclass, field +from typing import Optional, Union + +import torch + +from ..utils import PeftType, PromptLearningConfig + + +class PromptTuningInit(str, enum.Enum): + TEXT = "TEXT" + RANDOM = "RANDOM" + + +@dataclass +class PromptTuningConfig(PromptLearningConfig): + """ + This is the configuration class to store the configuration of a [`PromptEmbedding`]. + + Args: + prompt_tuning_init (Union[[`PromptTuningInit`], `str`]): The initialization of the prompt embedding. + prompt_tuning_init_text (`str`, *optional*): + The text to initialize the prompt embedding. Only used if `prompt_tuning_init` is `TEXT`. + tokenizer_name_or_path (`str`, *optional*): + The name or path of the tokenizer. Only used if `prompt_tuning_init` is `TEXT`. + """ + + prompt_tuning_init: Union[PromptTuningInit, str] = field( + default=PromptTuningInit.RANDOM, + metadata={"help": "How to initialize the prompt tuning parameters"}, + ) + prompt_tuning_init_text: Optional[str] = field( + default=None, + metadata={ + "help": "The text to use for prompt tuning initialization. Only used if prompt_tuning_init is `TEXT`" + }, + ) + tokenizer_name_or_path: Optional[str] = field( + default=None, + metadata={ + "help": "The tokenizer to use for prompt tuning initialization. Only used if prompt_tuning_init is `TEXT`" + }, + ) + + def __post_init__(self): + self.peft_type = PeftType.PROMPT_TUNING + + +class PromptEmbedding(torch.nn.Module): + """ + The model to encode virtual tokens into prompt embeddings. + + Args: + config ([`PromptTuningConfig`]): The configuration of the prompt embedding. + word_embeddings (`torch.nn.Module`): The word embeddings of the base transformer model. + + **Attributes**: + - **embedding** (`torch.nn.Embedding`) -- The embedding layer of the prompt embedding. + + Example: + + ```py + >>> from peft import PromptEmbedding, PromptTuningConfig + + >>> config = PromptTuningConfig( + ... peft_type="PROMPT_TUNING", + ... task_type="SEQ_2_SEQ_LM", + ... num_virtual_tokens=20, + ... token_dim=768, + ... num_transformer_submodules=1, + ... num_attention_heads=12, + ... num_layers=12, + ... prompt_tuning_init="TEXT", + ... prompt_tuning_init_text="Predict if sentiment of this review is positive, negative or neutral", + ... tokenizer_name_or_path="t5-base", + ... ) + + >>> # t5_model.shared is the word embeddings of the base model + >>> prompt_embedding = PromptEmbedding(config, t5_model.shared) + ``` + + Input Shape: (`batch_size`, `total_virtual_tokens`) + + Output Shape: (`batch_size`, `total_virtual_tokens`, `token_dim`) + """ + + def __init__(self, config, word_embeddings): + super().__init__() + + total_virtual_tokens = config.num_virtual_tokens * config.num_transformer_submodules + self.embedding = torch.nn.Embedding(total_virtual_tokens, config.token_dim) + if config.prompt_tuning_init == PromptTuningInit.TEXT: + from transformers import AutoTokenizer + + tokenizer = AutoTokenizer.from_pretrained(config.tokenizer_name_or_path) + init_text = config.prompt_tuning_init_text + init_token_ids = tokenizer(init_text)["input_ids"] + # Trim or iterate until num_text_tokens matches total_virtual_tokens + num_text_tokens = len(init_token_ids) + if num_text_tokens > total_virtual_tokens: + init_token_ids = init_token_ids[:total_virtual_tokens] + elif num_text_tokens < total_virtual_tokens: + num_reps = math.ceil(total_virtual_tokens / num_text_tokens) + init_token_ids = init_token_ids * num_reps + init_token_ids = init_token_ids[:total_virtual_tokens] + + word_embedding_weights = word_embeddings(torch.LongTensor(init_token_ids)).detach().clone() + word_embedding_weights = word_embedding_weights.to(torch.float32) + self.embedding.weight = torch.nn.Parameter(word_embedding_weights) + + def forward(self, indices): + # Just get embeddings + prompt_embeddings = self.embedding(indices) + return prompt_embeddings diff --git a/model/peft/tuners/test_moelora.py b/model/peft/tuners/test_moelora.py new file mode 100644 index 0000000000000000000000000000000000000000..38ec8997a1193c3301c491cc565645fd8e28ed03 --- /dev/null +++ b/model/peft/tuners/test_moelora.py @@ -0,0 +1,97 @@ +import torch +import unittest +import math +import re +import warnings +from dataclasses import asdict, dataclass, field +from enum import Enum +from typing import List, Optional, Tuple, Union +import itertools +import copy + +import torch +import torch.nn as nn +import torch.nn.functional as F +from transformers.pytorch_utils import Conv1D +from .gating import GATING_TO_MODEL_MAPPING + +from ..import_utils import is_bnb_4bit_available, is_bnb_available +from ..utils import ( + COMMON_LAYERS_PATTERN, + TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING, + ModulesToSaveWrapper, + PeftConfig, + PeftType, + _freeze_adapter, + _get_submodules, + transpose, +) + +if is_bnb_available(): + import bitsandbytes as bnb +from moelora import * + +class TestMoELoRA(unittest.TestCase): + def setUp(self): + self.model = MoELoRA() # Instantiate your MoELoRA model here + + def test_forward_no_adapters(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + + def test_forward_with_adapters(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + self.model.active_adapter = 'adapter1' # Set the active adapter + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + + def test_forward_with_global_user_embeds(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + self.model.active_adapter = 'adapter1' # Set the active adapter + self.model.global_user_embeds = [torch.randn(10, 30)] # Set the global_user_embeds + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + +if __name__ == '__main__': + unittest.main()import torch +import unittest + +class TestMoELoRA(unittest.TestCase): + def setUp(self): + self.model = MoELoRA() # Instantiate your MoELoRA model here + + def test_forward_no_adapters(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + + def test_forward_with_adapters(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + self.model.active_adapter = 'adapter1' # Set the active adapter + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + + def test_forward_with_global_user_embeds(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + self.model.active_adapter = 'adapter1' # Set the active adapter + self.model.global_user_embeds = [torch.randn(10, 30)] # Set the global_user_embeds + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + + def test_forward_with_global_user_embeds_exception(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + self.model.active_adapter = 'adapter1' # Set the active adapter + self.model.global_user_embeds = [torch.randn(5, 30)] # Set the global_user_embeds with incompatible shape + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + + def test_forward_no_global_user_embeds(self): + x = torch.randn(10, 20, 30) # Create a random input tensor + self.model.active_adapter = 'adapter1' # Set the active adapter + self.model.global_user_embeds = [] # Set an empty global_user_embeds + output = self.model.forward(x) + self.assertEqual(output.shape, (10, 20, 30)) # Assert the output shape is correct + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/model/peft/utils/__init__.py b/model/peft/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..50e5da620bd4292c9ef0d4140233bfc627cb11f7 --- /dev/null +++ b/model/peft/utils/__init__.py @@ -0,0 +1,42 @@ +# flake8: noqa +# There's no way to ignore "F401 '...' imported but unused" warnings in this +# module, but to preserve other warnings. So, don't check this module at all + +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .config import PeftConfig, PeftType, PromptLearningConfig, TaskType +from .other import ( + TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPING, + TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING, + TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING, + COMMON_LAYERS_PATTERN, + CONFIG_NAME, + WEIGHTS_NAME, + SAFETENSORS_WEIGHTS_NAME, + _set_trainable, + add_library_to_model_card, + bloom_model_postprocess_past_key_value, + prepare_model_for_int8_training, + prepare_model_for_kbit_training, + shift_tokens_right, + transpose, + _get_submodules, + _set_adapter, + _freeze_adapter, + ModulesToSaveWrapper, +) +from .hub_utils import hub_file_exists +from .save_and_load import get_peft_model_state_dict, set_peft_model_state_dict diff --git a/model/peft/utils/config.py b/model/peft/utils/config.py new file mode 100644 index 0000000000000000000000000000000000000000..ccbbd5fe8e91eb7e781ec1780a9add545a71d338 --- /dev/null +++ b/model/peft/utils/config.py @@ -0,0 +1,222 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import enum +import inspect +import json +import os +from dataclasses import asdict, dataclass, field +from typing import Optional, Union + +from huggingface_hub import hf_hub_download +from transformers.utils import PushToHubMixin + +from .other import CONFIG_NAME + + +class PeftType(str, enum.Enum): + PROMPT_TUNING = "PROMPT_TUNING" + P_TUNING = "P_TUNING" + PREFIX_TUNING = "PREFIX_TUNING" + LORA = "LORA" + ADALORA = "ADALORA" + ADAPTION_PROMPT = "ADAPTION_PROMPT" + MOELORA = "MOELORA" + + +class TaskType(str, enum.Enum): + SEQ_CLS = "SEQ_CLS" + SEQ_2_SEQ_LM = "SEQ_2_SEQ_LM" + CAUSAL_LM = "CAUSAL_LM" + TOKEN_CLS = "TOKEN_CLS" + QUESTION_ANS = "QUESTION_ANS" + + +@dataclass +class PeftConfigMixin(PushToHubMixin): + r""" + This is the base configuration class for PEFT adapter models. It contains all the methods that are common to all + PEFT adapter models. This class inherits from [`~transformers.utils.PushToHubMixin`] which contains the methods to + push your model to the Hub. The method `save_pretrained` will save the configuration of your adapter model in a + directory. The method `from_pretrained` will load the configuration of your adapter model from a directory. + + Args: + peft_type (Union[[`~peft.utils.config.PeftType`], `str`]): The type of Peft method to use. + """ + peft_type: Optional[PeftType] = field(default=None, metadata={"help": "The type of PEFT model."}) + + @property + def __dict__(self): + return asdict(self) + + def to_dict(self): + return self.__dict__ + + def save_pretrained(self, save_directory, **kwargs): + r""" + This method saves the configuration of your adapter model in a directory. + + Args: + save_directory (`str`): + The directory where the configuration will be saved. + kwargs (additional keyword arguments, *optional*): + Additional keyword arguments passed along to the [`~transformers.utils.PushToHubMixin.push_to_hub`] + method. + """ + if os.path.isfile(save_directory): + raise AssertionError(f"Provided path ({save_directory}) should be a directory, not a file") + + os.makedirs(save_directory, exist_ok=True) + + output_dict = self.__dict__ + output_path = os.path.join(save_directory, CONFIG_NAME) + + # save it + with open(output_path, "w") as writer: + writer.write(json.dumps(output_dict, indent=2, sort_keys=True)) + + @classmethod + def from_pretrained(cls, pretrained_model_name_or_path, subfolder=None, **kwargs): + r""" + This method loads the configuration of your adapter model from a directory. + + Args: + pretrained_model_name_or_path (`str`): + The directory or the Hub repository id where the configuration is saved. + kwargs (additional keyword arguments, *optional*): + Additional keyword arguments passed along to the child class initialization. + """ + path = ( + os.path.join(pretrained_model_name_or_path, subfolder) + if subfolder is not None + else pretrained_model_name_or_path + ) + + hf_hub_download_kwargs, class_kwargs, other_kwargs = cls._split_kwargs(kwargs) + + if os.path.isfile(os.path.join(path, CONFIG_NAME)): + config_file = os.path.join(path, CONFIG_NAME) + else: + try: + config_file = hf_hub_download( + pretrained_model_name_or_path, CONFIG_NAME, subfolder=subfolder, **hf_hub_download_kwargs + ) + except Exception: + raise ValueError(f"Can't find '{CONFIG_NAME}' at '{pretrained_model_name_or_path}'") + + loaded_attributes = cls.from_json_file(config_file) + + config = cls(**class_kwargs) + + for key, value in loaded_attributes.items(): + if hasattr(config, key): + setattr(config, key, value) + + return config + + @classmethod + def from_json_file(cls, path_json_file, **kwargs): + r""" + Loads a configuration file from a json file. + + Args: + path_json_file (`str`): + The path to the json file. + """ + with open(path_json_file, "r") as file: + json_object = json.load(file) + + return json_object + + @classmethod + def _split_kwargs(cls, kwargs): + hf_hub_download_kwargs = {} + class_kwargs = {} + other_kwargs = {} + + for key, value in kwargs.items(): + if key in inspect.signature(hf_hub_download).parameters: + hf_hub_download_kwargs[key] = value + elif key in list(cls.__annotations__): + class_kwargs[key] = value + else: + other_kwargs[key] = value + + return hf_hub_download_kwargs, class_kwargs, other_kwargs + + @classmethod + def _get_peft_type( + cls, + model_id, + subfolder: Optional[str] = None, + revision: Optional[str] = None, + cache_dir: Optional[str] = None, + ): + path = os.path.join(model_id, subfolder) if subfolder is not None else model_id + + if os.path.isfile(os.path.join(path, CONFIG_NAME)): + config_file = os.path.join(path, CONFIG_NAME) + else: + try: + config_file = hf_hub_download( + model_id, CONFIG_NAME, subfolder=subfolder, revision=revision, cache_dir=cache_dir + ) + except Exception: + raise ValueError(f"Can't find '{CONFIG_NAME}' at '{model_id}'") + + loaded_attributes = cls.from_json_file(config_file) + return loaded_attributes["peft_type"] + + +@dataclass +class PeftConfig(PeftConfigMixin): + """ + This is the base configuration class to store the configuration of a [`PeftModel`]. + + Args: + peft_type (Union[[`~peft.utils.config.PeftType`], `str`]): The type of Peft method to use. + task_type (Union[[`~peft.utils.config.TaskType`], `str`]): The type of task to perform. + inference_mode (`bool`, defaults to `False`): Whether to use the Peft model in inference mode. + """ + + base_model_name_or_path: str = field(default=None, metadata={"help": "The name of the base model to use."}) + revision: str = field(default=None, metadata={"help": "The specific model version to use."}) + peft_type: Union[str, PeftType] = field(default=None, metadata={"help": "Peft type"}) + task_type: Union[str, TaskType] = field(default=None, metadata={"help": "Task type"}) + inference_mode: bool = field(default=False, metadata={"help": "Whether to use inference mode"}) + + +@dataclass +class PromptLearningConfig(PeftConfig): + """ + This is the base configuration class to store the configuration of [`PrefixTuning`], [`PromptEncoder`], or + [`PromptTuning`]. + + Args: + num_virtual_tokens (`int`): The number of virtual tokens to use. + token_dim (`int`): The hidden embedding dimension of the base transformer model. + num_transformer_submodules (`int`): The number of transformer submodules in the base transformer model. + num_attention_heads (`int`): The number of attention heads in the base transformer model. + num_layers (`int`): The number of layers in the base transformer model. + """ + + num_virtual_tokens: int = field(default=None, metadata={"help": "Number of virtual tokens"}) + token_dim: int = field( + default=None, metadata={"help": "The hidden embedding dimension of the base transformer model"} + ) + num_transformer_submodules: Optional[int] = field( + default=None, metadata={"help": "Number of transformer submodules"} + ) + num_attention_heads: Optional[int] = field(default=None, metadata={"help": "Number of attention heads"}) + num_layers: Optional[int] = field(default=None, metadata={"help": "Number of transformer layers"}) diff --git a/model/peft/utils/hub_utils.py b/model/peft/utils/hub_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..625f4e490de4ef5e936e8786a73a9e4932b49389 --- /dev/null +++ b/model/peft/utils/hub_utils.py @@ -0,0 +1,29 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from huggingface_hub import get_hf_file_metadata, hf_hub_url +from huggingface_hub.utils import EntryNotFoundError + + +def hub_file_exists(repo_id: str, filename: str, revision: str = None, repo_type: str = None) -> bool: + r""" + Checks if a file exists in a remote Hub repository. + """ + url = hf_hub_url(repo_id=repo_id, filename=filename, repo_type=repo_type, revision=revision) + try: + get_hf_file_metadata(url) + return True + except EntryNotFoundError: + return False diff --git a/model/peft/utils/other.py b/model/peft/utils/other.py new file mode 100644 index 0000000000000000000000000000000000000000..971689dafb43f333c6ba57e1c0ae044623314fc7 --- /dev/null +++ b/model/peft/utils/other.py @@ -0,0 +1,271 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import os +import warnings + +import torch + + +# Add or edit model card to have `library_name: peft` +def add_library_to_model_card(output_dir): + if os.path.exists(os.path.join(output_dir, "README.md")): + with open(os.path.join(output_dir, "README.md"), "r") as f: + lines = f.readlines() + # check if the first line is `---` + if len(lines) > 0 and lines[0].startswith("---"): + for i, line in enumerate(lines[1:]): + # check if line starts with `library_name`, if yes, update it + if line.startswith("library_name"): + lines[i + 1] = "library_name: peft\n" + break + elif line.startswith("---"): + # insert `library_name: peft` before the last `---` + lines.insert(i + 1, "library_name: peft\n") + break + else: + lines = ["---\n", "library_name: peft\n", "---\n"] + lines + else: + lines = ["---\n", "library_name: peft\n", "---\n"] + # write the lines back to README.md + with open(os.path.join(output_dir, "README.md"), "w") as f: + f.writelines(lines) + + +# needed for prefix-tuning of bloom model +def bloom_model_postprocess_past_key_value(past_key_values): + past_key_values = torch.cat(past_key_values) + total_layers, batch_size, num_attention_heads, num_virtual_tokens, head_dim = past_key_values.shape + keys = past_key_values[: total_layers // 2] + keys = keys.transpose(2, 3).reshape( + total_layers // 2, batch_size * num_attention_heads, head_dim, num_virtual_tokens + ) + values = past_key_values[total_layers // 2 :] + values = values.reshape(total_layers // 2, batch_size * num_attention_heads, num_virtual_tokens, head_dim) + + return tuple(zip(keys, values)) + + +def prepare_model_for_kbit_training(model, use_gradient_checkpointing=True): + r""" + This method wraps the entire protocol for preparing a model before running a training. This includes: + 1- Cast the layernorm in fp32 2- making output embedding layer require grads 3- Add the upcasting of the lm + head to fp32 + + Args: + model, (`transformers.PreTrainedModel`): + The loaded model from `transformers` + """ + loaded_in_kbit = getattr(model, "is_loaded_in_8bit", False) or getattr(model, "is_loaded_in_4bit", False) + + for name, param in model.named_parameters(): + # freeze base model's layers + param.requires_grad = False + + # cast all non INT8 parameters to fp32 + for param in model.parameters(): + if (param.dtype == torch.float16) or (param.dtype == torch.bfloat16): + param.data = param.data.to(torch.float32) + + if loaded_in_kbit and use_gradient_checkpointing: + # For backward compatibility + if hasattr(model, "enable_input_require_grads"): + model.enable_input_require_grads() + else: + + def make_inputs_require_grad(module, input, output): + output.requires_grad_(True) + + model.get_input_embeddings().register_forward_hook(make_inputs_require_grad) + + # enable gradient checkpointing for memory efficiency + model.gradient_checkpointing_enable() + + return model + + +# For backward compatibility +def prepare_model_for_int8_training(*args, **kwargs): + warnings.warn( + "prepare_model_for_int8_training is deprecated and will be removed in a future version. Use prepare_model_for_kbit_training instead.", + FutureWarning, + ) + return prepare_model_for_kbit_training(*args, **kwargs) + + +# copied from transformers.models.bart.modeling_bart +def shift_tokens_right(input_ids: torch.Tensor, pad_token_id: int, decoder_start_token_id: int): + """ + Shift input ids one token to the right. + + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): input ids + pad_token_id (`int`): The id of the `padding` token. + decoder_start_token_id (`int`): The id of the `start` token. + """ + shifted_input_ids = input_ids.new_zeros(input_ids.shape) + shifted_input_ids[:, 1:] = input_ids[:, :-1].clone() + shifted_input_ids[:, 0] = decoder_start_token_id + + if pad_token_id is None: + raise ValueError("self.model.config.pad_token_id has to be defined.") + # replace possible -100 values in labels by `pad_token_id` + shifted_input_ids.masked_fill_(shifted_input_ids == -100, pad_token_id) + + return shifted_input_ids + + +class ModulesToSaveWrapper(torch.nn.Module): + def __init__(self, module_to_save, adapter_name): + super().__init__() + self.original_module = module_to_save + self.modules_to_save = torch.nn.ModuleDict({}) + self.update(adapter_name) + self.active_adapter = adapter_name + + def update(self, adapter_name): + self.modules_to_save.update(torch.nn.ModuleDict({adapter_name: copy.deepcopy(self.original_module)})) + + def forward(self, *args, **kwargs): + if self.active_adapter not in self.modules_to_save: + return self.original_module(*args, **kwargs) + return self.modules_to_save[self.active_adapter](*args, **kwargs) + + +def _get_submodules(model, key): + parent = model.get_submodule(".".join(key.split(".")[:-1])) + target_name = key.split(".")[-1] + target = model.get_submodule(key) + return parent, target, target_name + + +def _freeze_adapter(model, adapter_name): + for n, p in model.named_parameters(): + if adapter_name in n: + p.requires_grad = False + + +def _set_trainable(model, adapter_name): + key_list = [key for key, _ in model.named_modules()] + for key in key_list: + target_module_found = any(key.endswith(target_key) for target_key in model.modules_to_save) + if target_module_found: + parent, target, target_name = _get_submodules(model, key) + if isinstance(target, ModulesToSaveWrapper): + target.update(adapter_name) + else: + for param in target.parameters(): + param.requires_grad = True + setattr(parent, target_name, ModulesToSaveWrapper(target, adapter_name)) + + +def _set_adapter(model, adapter_name): + for module in model.modules(): + if isinstance(module, ModulesToSaveWrapper): + module.active_adapter = adapter_name + + +def fsdp_auto_wrap_policy(model): + import functools + import os + + from accelerate import FullyShardedDataParallelPlugin + from torch.distributed.fsdp.wrap import _or_policy, lambda_auto_wrap_policy, transformer_auto_wrap_policy + + from ..tuners import PrefixEncoder, PromptEmbedding, PromptEncoder + + def lambda_policy_fn(module): + if ( + len(list(module.named_children())) == 0 + and getattr(module, "weight", None) is not None + and module.weight.requires_grad + ): + return True + return False + + lambda_policy = functools.partial(lambda_auto_wrap_policy, lambda_fn=lambda_policy_fn) + transformer_wrap_policy = functools.partial( + transformer_auto_wrap_policy, + transformer_layer_cls=( + PrefixEncoder, + PromptEncoder, + PromptEmbedding, + FullyShardedDataParallelPlugin.get_module_class_from_name( + model, os.environ.get("FSDP_TRANSFORMER_CLS_TO_WRAP", "") + ), + ), + ) + + auto_wrap_policy = functools.partial(_or_policy, policies=[lambda_policy, transformer_wrap_policy]) + return auto_wrap_policy + + +def transpose(weight, fan_in_fan_out): + return weight.T if fan_in_fan_out else weight + + +TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING = { + "t5": ["q", "v"], + "mt5": ["q", "v"], + "bart": ["q_proj", "v_proj"], + "gpt2": ["c_attn"], + "bloom": ["query_key_value"], + "blip-2": ["q", "v", "q_proj", "v_proj"], + "opt": ["q_proj", "v_proj"], + "gptj": ["q_proj", "v_proj"], + "gpt_neox": ["query_key_value"], + "gpt_neo": ["q_proj", "v_proj"], + "bert": ["query", "value"], + "roberta": ["query", "value"], + "xlm-roberta": ["query", "value"], + "electra": ["query", "value"], + "deberta-v2": ["query_proj", "value_proj"], + "deberta": ["in_proj"], + "layoutlm": ["query", "value"], + "llama": ["q_proj", "v_proj"], + "chatglm": ["query_key_value"], + "gpt_bigcode": ["c_attn"], + "mpt": ["Wqkv"], +} + +COMMON_LAYERS_PATTERN = ["layers", "h", "block", "blocks"] + +TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING = { + "t5": ["q", "k", "v", "o", "wi", "wo"], + "mt5": ["q", "k", "v", "o", "wi_0", "wi_1", "wo"], + "bart": ["q_proj", "k_proj", "v_proj", "out_proj", "fc1", "fc2"], + # "gpt2": ["c_attn"], + # "bloom": ["query_key_value"], + "opt": ["q_proj", "k_proj", "v_proj", "out_proj", "fc1", "fc2"], + # "gptj": ["q_proj", "v_proj"], + # "gpt_neox": ["query_key_value"], + # "gpt_neo": ["q_proj", "v_proj"], + # "bert": ["query", "value"], + "roberta": ["query", "key", "value", "dense"], + # "xlm-roberta": ["query", "value"], + # "electra": ["query", "value"], + "deberta-v2": ["query_proj", "key_proj", "value_proj", "dense"], + # "deberta": ["in_proj"], + # "layoutlm": ["query", "value"], +} + +TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPING = { + "bloom": bloom_model_postprocess_past_key_value, +} + +WEIGHTS_NAME = "adapter_model.bin" +SAFETENSORS_WEIGHTS_NAME = "adapter_model.safetensors" +CONFIG_NAME = "adapter_config.json" diff --git a/model/peft/utils/save_and_load.py b/model/peft/utils/save_and_load.py new file mode 100644 index 0000000000000000000000000000000000000000..61b6f92e8aa5c1a9b6277fe0fac3f6c645baa0ea --- /dev/null +++ b/model/peft/utils/save_and_load.py @@ -0,0 +1,137 @@ +# coding=utf-8 +# Copyright 2023-present the HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .config import PeftType, PromptLearningConfig + + +def get_peft_model_state_dict(model, state_dict=None, adapter_name="default"): + """ + Get the state dict of the Peft model. + + Args: + model ([`PeftModel`]): The Peft model. When using torch.nn.DistributedDataParallel, DeepSpeed or FSDP, + the model should be the underlying model/unwrapped model (i.e. model.module). + state_dict (`dict`, *optional*, defaults to `None`): + The state dict of the model. If not provided, the state dict of the model + will be used. + """ + config = model.peft_config[adapter_name] + if state_dict is None: + state_dict = model.state_dict() + if config.peft_type in (PeftType.LORA, PeftType.ADALORA, PeftType.MOELORA): + # to_return = lora_state_dict(model, bias=model.peft_config.bias) + # adapted from `https://github.com/microsoft/LoRA/blob/main/loralib/utils.py` + # to be used directly with the state dict which is necessary when using DeepSpeed or FSDP + bias = config.bias + if bias == "none": + to_return = {k: state_dict[k] for k in state_dict if "lora_" in k or "gating" in k} + elif bias == "all": + to_return = {k: state_dict[k] for k in state_dict if "lora_" in k or "bias" in k or "gating" in k} + elif bias == "lora_only": + to_return = {} + for k in state_dict: + if "lora_" in k: + to_return[k] = state_dict[k] + bias_name = k.split("lora_")[0] + "bias" + if bias_name in state_dict: + to_return[bias_name] = state_dict[bias_name] + if "gating" in k: + to_return[k] = state_dict[k] + else: + raise NotImplementedError + to_return = {k: v for k, v in to_return.items() if (("lora_" in k and adapter_name in k) or ("bias" in k) or ("gating" in k))} + if config.peft_type == PeftType.ADALORA: + rank_pattern = config.rank_pattern + if rank_pattern is not None: + rank_pattern = {k.replace(f".{adapter_name}", ""): v for k, v in rank_pattern.items()} + config.rank_pattern = rank_pattern + to_return = model.resize_state_dict_by_rank_pattern(rank_pattern, to_return, adapter_name) + + elif config.peft_type == PeftType.ADAPTION_PROMPT: + to_return = {k: state_dict[k] for k in state_dict if k.split(".")[-1].startswith("adaption_")} + elif isinstance(config, PromptLearningConfig): + to_return = {} + if config.inference_mode: + prompt_embeddings = model.prompt_encoder[adapter_name].embedding.weight + else: + prompt_embeddings = model.get_prompt_embedding_to_save(adapter_name) + to_return["prompt_embeddings"] = prompt_embeddings + else: + raise NotImplementedError + if model.modules_to_save is not None: + for key, value in state_dict.items(): + if any(f"{module_name}.modules_to_save.{adapter_name}" in key for module_name in model.modules_to_save): + to_return[key.replace("modules_to_save.", "")] = value + + to_return = {k.replace(f".{adapter_name}", ""): v for k, v in to_return.items()} + return to_return + + +def set_peft_model_state_dict(model, peft_model_state_dict, adapter_name="default"): + """ + Set the state dict of the Peft model. + + Args: + model ([`PeftModel`]): The Peft model. + peft_model_state_dict (`dict`): The state dict of the Peft model. + """ + config = model.peft_config[adapter_name] + state_dict = {} + if model.modules_to_save is not None: + for key, value in peft_model_state_dict.items(): + if any(module_name in key for module_name in model.modules_to_save): + for module_name in model.modules_to_save: + if module_name in key: + key = key.replace(module_name, f"{module_name}.modules_to_save.{adapter_name}") + break + state_dict[key] = value + else: + state_dict = peft_model_state_dict + + if config.peft_type in (PeftType.LORA, PeftType.ADALORA, PeftType.MOELORA): + peft_model_state_dict = {} + for k, v in state_dict.items(): + if "lora_A" in k: + k = k.replace("lora_A", f"lora_A.{adapter_name}") + peft_model_state_dict[k] = v + # suffix = k.split("lora_")[1] + # if "." in suffix: + # suffix_to_replace = ".".join(suffix.split(".")[1:]) + # k = k.replace(suffix_to_replace, f"{adapter_name}.{suffix_to_replace}") + # else: + # k = f"{k}.{adapter_name}" + # peft_model_state_dict[k] = v + elif "lora_B" in k: + k = k.replace("lora_B", f"lora_B.{adapter_name}") + peft_model_state_dict[k] = v + elif "gating" in k: + k = k.replace("gating", f"gating.{adapter_name}") + peft_model_state_dict[k] = v + else: + peft_model_state_dict[k] = v + if config.peft_type == PeftType.ADALORA: + rank_pattern = config.rank_pattern + if rank_pattern is not None: + model.resize_modules_by_rank_pattern(rank_pattern, adapter_name) + elif isinstance(config, PromptLearningConfig) or config.peft_type == PeftType.ADAPTION_PROMPT: + peft_model_state_dict = state_dict + else: + raise NotImplementedError + load_result = model.load_state_dict(peft_model_state_dict, strict=False) + if isinstance(config, PromptLearningConfig): + model.prompt_encoder[adapter_name].embedding.load_state_dict( + {"weight": peft_model_state_dict["prompt_embeddings"]}, strict=True + ) + return load_result diff --git a/model/router/_init_.py b/model/router/_init_.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/model/router/cvr.py b/model/router/cvr.py new file mode 100644 index 0000000000000000000000000000000000000000..909b998d27c76344e1ee948c6e3f7878af668e6d --- /dev/null +++ b/model/router/cvr.py @@ -0,0 +1,73 @@ +import torch.nn as nn +import torch.nn.functional as F + + +class LambdaLayer(nn.Module): + def __init__(self, lambd): + super(LambdaLayer, self).__init__() + self.lambd = lambd + + def forward(self, x): + return self.lambd(x) + + +class Block(nn.Module): + expansion = 1 + + def __init__(self, in_planes, planes, conv_layer, stride=1): + super(Block, self).__init__() + self.conv1 = conv_layer(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) + self.bn1 = nn.BatchNorm2d(planes) + self.conv2 = conv_layer(planes, planes, kernel_size=3, stride=1, padding=1, bias=False) + self.bn2 = nn.BatchNorm2d(planes) + + self.shortcut = nn.Sequential() + if stride != 1 or in_planes != planes: + diff = planes - in_planes + self.shortcut = LambdaLayer( + lambda x: F.pad(x[:, :, ::2, ::2], (0, 0, 0, 0, int(diff * 0.5), int((diff + 1) * 0.5)), "constant", 0)) + def forward(self, x): + out = F.relu(self.bn1(self.conv1(x))) + out = self.bn2(self.conv2(out)) + out += self.shortcut(x) + out = F.relu(out) + return out + + +class Router(nn.Module): + def __init__(self, block, num_blocks, num_experts=2): + super(Router, self).__init__() + self.in_planes = 16 + self.conv_layer = nn.Conv2d + + self.conv1 = nn.Conv2d(3, self.in_planes, kernel_size=3, stride=1, padding=1, bias=False) + self.bn1 = nn.BatchNorm2d(self.in_planes) + self.layer1 = self._make_layer(block, 16, num_blocks[0], stride=1) + self.layer2 = self._make_layer(block, 32, num_blocks[1], stride=2) + self.layer3 = self._make_layer(block, 64, num_blocks[2], stride=2) + self.fc = nn.Linear(64, num_experts) + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + + def _make_layer(self, block, planes, num_blocks, stride): + planes = planes + strides = [stride] + [1] * (num_blocks - 1) + layers = [] + for stride in strides: + layers.append(block(self.in_planes, planes, self.conv_layer, stride)) + self.in_planes = planes * block.expansion + + return nn.Sequential(*layers) + + def forward(self, x): + out = F.relu(self.bn1(self.conv1(x))) + out = self.layer1(out) + out = self.layer2(out) + out = self.layer3(out) + out = self.avgpool(out) + out = out.view(out.size(0), -1) + out = self.fc(out) + return out + + +def build_router(**kwargs): + return Router(Block, [3, 3, 3], **kwargs) diff --git a/model/router/nlpr.py b/model/router/nlpr.py new file mode 100644 index 0000000000000000000000000000000000000000..1c1323c4d69bd70970afd2cbc6753e200494a224 --- /dev/null +++ b/model/router/nlpr.py @@ -0,0 +1,84 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class LambdaLayer(nn.Module): + def __init__(self, lambd): + super(LambdaLayer, self).__init__() + self.lambd = lambd + + def forward(self, x): + return self.lambd(x) + + +class ResidualBlock(nn.Module): + expansion = 1 + + def __init__(self, in_planes, planes, conv_layer, stride=1): + super(ResidualBlock, self).__init__() + self.conv1 = conv_layer(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) + self.bn1 = nn.BatchNorm1d(planes) + self.conv2 = conv_layer(planes, planes, kernel_size=3, stride=1, padding=1, bias=False) + self.bn2 = nn.BatchNorm1d(planes) + + self.shortcut = nn.Sequential() + if stride != 1 or in_planes != planes: + diff = planes - in_planes + self.shortcut = LambdaLayer( + lambda x: F.pad(x[:, :, ::2], (0, 0, int(diff * 0.5), int((diff + 1) * 0.5)), "constant", 0)) + + def forward(self, x): + out = F.relu(self.bn1(self.conv1(x))) + out = self.bn2(self.conv2(out)) + out += self.shortcut(x) + out = F.relu(out) + return out + + +class GateFunction(nn.Module): + def __init__(self, input_size, output_size): + super(GateFunction, self).__init__() + self.fc = nn.Linear(input_size, output_size) + + def forward(self, x): + return F.softmax(self.fc(x), dim=-1) + + +class NLPRecommendationRouter(nn.Module): + def __init__(self, block, num_blocks, input_size=64, num_experts=4): + super(NLPRecommendationRouter, self).__init__() + self.in_planes = 16 + self.conv_layer = nn.Conv1d + + self.conv1 = nn.Conv1d(1, self.in_planes, kernel_size=3, stride=1, padding=1, bias=False) + self.bn1 = nn.BatchNorm1d(self.in_planes) + self.layer1 = self._make_layer(block, 16, num_blocks[0], stride=1) + self.layer2 = self._make_layer(block, 32, num_blocks[1], stride=2) + self.layer3 = self._make_layer(block, 64, num_blocks[2], stride=2) + self.avgpool = nn.AdaptiveAvgPool1d(1) + + # Gate function + self.gate = GateFunction(input_size, num_experts) + + def _make_layer(self, block, planes, num_blocks, stride): + strides = [stride] + [1] * (num_blocks - 1) + layers = [] + for stride in strides: + layers.append(block(self.in_planes, planes, self.conv_layer, stride)) + self.in_planes = planes * block.expansion + return nn.Sequential(*layers) + + def forward(self, x): + out = F.relu(self.bn1(self.conv1(x))) + out = self.layer1(out) + out = self.layer2(out) + out = self.layer3(out) + out = self.avgpool(out) + out = out.view(out.size(0), -1) + out = self.gate(out) + return out.unsqueeze(1) + + +def build_router(**kwargs): + return NLPRecommendationRouter(ResidualBlock, [3, 3, 3], input_size=64, num_experts=4) \ No newline at end of file diff --git a/optims.py b/optims.py new file mode 100644 index 0000000000000000000000000000000000000000..3d7269a6b2b1b4fb737c718b37c558d5b340e8f5 --- /dev/null +++ b/optims.py @@ -0,0 +1,43 @@ +import math + +class LinearWarmupCosineLRScheduler: + def __init__( + self, + optimizer, + min_lr_list, + init_lr_list, + warmup_steps=0, + warmup_start_lr_list=None, + **kwargs + ): + self.optimizer = optimizer + + self.min_lr_list = min_lr_list + self.init_lr_list = init_lr_list + self.warmup_steps = warmup_steps + self.warmup_start_lr_list = warmup_start_lr_list if warmup_start_lr_list is not None else init_lr_list + + def step(self, cur_step, cur_epoch, max_step): + for i, param_group in enumerate(self.optimizer.param_groups): + if cur_epoch == 0 and cur_step < self.warmup_steps: + lr = self.warmup_lr_schedule(cur_step, self.warmup_start_lr_list[i], self.init_lr_list[i]) + else: + lr = self.cosine_lr_schedule(cur_step - self.warmup_steps, max_step - self.warmup_steps, self.init_lr_list[i], self.min_lr_list[i]) + param_group["lr"] = lr + + def cosine_lr_schedule(self, step, max_step, init_lr, min_lr): + """Decay the learning rate using cosine schedule""" + lr = (init_lr - min_lr) * 0.5 * (1 + math.cos(math.pi * step / max_step)) + min_lr + return lr + + def warmup_lr_schedule(self, step, init_lr, max_lr): + """Warmup the learning rate""" + lr = min(max_lr, init_lr + (max_lr - init_lr) * step / max(self.warmup_steps, 1)) + return lr + + def state_dict(self): + return {key: value for key, value in self.__dict__.items() if key != 'optimizer'} + + def load_state_dict(self, state_dict): + self.__dict__.update(state_dict) + \ No newline at end of file diff --git a/prompt/artist.txt b/prompt/artist.txt new file mode 100644 index 0000000000000000000000000000000000000000..e7beaf03498b817b65855e0d5cb77c3a7acf2e17 --- /dev/null +++ b/prompt/artist.txt @@ -0,0 +1,3 @@ +This user has listened to [HistoryHere] in the previous. Please predict the next music artist this user will listen to. The artist name candidates are [CansHere]. Choose only one artist from the candidates. The answer is +This user has listened to [HistoryHere] in the previous. Given the following 10 music artist names, [CansHere], recommend one artist for this user to listen to next. The artist name you recommend is +The listening history of this user is [HistoryHere]. Recommend the next music artist for this user to listen to from the following artist name set, [CansHere]. The recommendation should contain one artist's name only. The recommendation is \ No newline at end of file diff --git a/prompt/game.txt b/prompt/game.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b16b876205f4af50ac174b834299d70a3f354e8 --- /dev/null +++ b/prompt/game.txt @@ -0,0 +1,3 @@ +This user has played [HistoryHere] in the previous. Please predict the next game this user will play. The game title candidates are [CansHere]. Choose only one game from the candidates. The answer is +This user has played [HistoryHere] in the previous. Given the following 20 game titles, [CansHere], recommend one game for this user to play next. The game title you recommend is +The visit history of this user is [HistoryHere]. Recommend a next game for this user to play from the following game title set, [CansHere]. The recommendation should contain one game title only. The recommendation is \ No newline at end of file diff --git a/prompt/movie.txt b/prompt/movie.txt new file mode 100644 index 0000000000000000000000000000000000000000..d25b3c014c89a8f6611f1fc19c29cc311e571052 --- /dev/null +++ b/prompt/movie.txt @@ -0,0 +1,3 @@ +This user has watched [HistoryHere] in the previous. Please predict the next movie this user will watch. Choose the answer from the following 20 movie titles: [CansHere]. Answer: +This user has watched [HistoryHere] in the previous. Given the following 20 movie titles: [CansHere], recommend one movie for this user to watch next. The movie title you recommend is: +The visit history of this user is: [HistoryHere]. Recommend a next movie for this user to watch from the following movie title set: [CansHere]. The recommendation should contain one movie title only. Recommendation: \ No newline at end of file diff --git a/prompt/read.txt b/prompt/read.txt new file mode 100644 index 0000000000000000000000000000000000000000..cdead876f4ef3da393dca19fb1e75391e72eaaa4 --- /dev/null +++ b/prompt/read.txt @@ -0,0 +1,3 @@ +This user has readed [HistoryHere] in the previous. Please predict the next book this user will play. The book title candidates are [CansHere]. Choose only one book from the candidates. The answer is +This user has readed [HistoryHere] in the previous. Given the following 20 book titles, [CansHere], recommend one book for this user to play next. The book title you recommend is +The visit history of this user is [HistoryHere]. Recommend a next book for this user to read from the following book title set, [CansHere]. The recommendation should contain one book title only. The recommendation is \ No newline at end of file diff --git a/rec_model/Caser_movielens.pt b/rec_model/Caser_movielens.pt new file mode 100644 index 0000000000000000000000000000000000000000..36bafb00933b4bf8af44c1d31fb4848a8d884f9f --- /dev/null +++ b/rec_model/Caser_movielens.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:851820d56564a551b98a5977167de049d4bce53386065df4053568bb4dc56d71 +size 1237633 diff --git a/rec_model/Caser_steam.pt b/rec_model/Caser_steam.pt new file mode 100644 index 0000000000000000000000000000000000000000..7b652ab55ec253a0429e09a7a330d50b3eedc24a --- /dev/null +++ b/rec_model/Caser_steam.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b219811b7ff1e2b0521282aa6457c4277fc090ec364f0e40657b283f62285292 +size 2582158 diff --git a/rec_model/GRU_movielens.pt b/rec_model/GRU_movielens.pt new file mode 100644 index 0000000000000000000000000000000000000000..fb182d830e0e137b67a8f9468583fdc9151a8848 --- /dev/null +++ b/rec_model/GRU_movielens.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad5151035bc466d55efedc5620bb67b9ffcafb0fed22ff86ae3341ced490b54e +size 972921 diff --git a/rec_model/GRU_steam.pt b/rec_model/GRU_steam.pt new file mode 100644 index 0000000000000000000000000000000000000000..adfa32d9323fab375aa61bf97824ae5396b085c5 --- /dev/null +++ b/rec_model/GRU_steam.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd14c401a1529cb678f0f66fa586b26c9875653b91c95680b511f06b2125b3db +size 1952825 diff --git a/rec_model/SASRec_goodreads.pt b/rec_model/SASRec_goodreads.pt new file mode 100644 index 0000000000000000000000000000000000000000..e3baa55e0e31789f4f77c57b2a67e1af30493e73 --- /dev/null +++ b/rec_model/SASRec_goodreads.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f75c0b397e8d7146b10ebee3be909f03ebabb1179afc1faf6363aca49d8e1140 +size 2448251 diff --git a/rec_model/SASRec_movielens.pt b/rec_model/SASRec_movielens.pt new file mode 100644 index 0000000000000000000000000000000000000000..d53a5e2e77cefd412ff88baa2882c74295b56978 --- /dev/null +++ b/rec_model/SASRec_movielens.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6928a06778d0e5b64ead0641501f73f13beb2c61ca2d881ee15582630d101df9 +size 973163 diff --git a/rec_model/SASRec_steam.pt b/rec_model/SASRec_steam.pt new file mode 100644 index 0000000000000000000000000000000000000000..767187016d83deb3c988fd1782bb9a92e64731dd --- /dev/null +++ b/rec_model/SASRec_steam.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25c27ec31a611c0d02c2ed1e36f633d7a34c3ce5917b812215879b0d2bc237bc +size 1953067 diff --git a/rec_model/lastfm.pt b/rec_model/lastfm.pt new file mode 100644 index 0000000000000000000000000000000000000000..0c9e8015ae7a35eb98d8eeef029a819464166f50 --- /dev/null +++ b/rec_model/lastfm.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f94253543e0ca3b0bbd42b4f6b94f2c97c9fdfdd36c3b5ad3f6b576a806dd86 +size 2481963 diff --git a/rec_model/movielens.pt b/rec_model/movielens.pt new file mode 100644 index 0000000000000000000000000000000000000000..d53a5e2e77cefd412ff88baa2882c74295b56978 --- /dev/null +++ b/rec_model/movielens.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6928a06778d0e5b64ead0641501f73f13beb2c61ca2d881ee15582630d101df9 +size 973163 diff --git a/rec_model/steam.pt b/rec_model/steam.pt new file mode 100644 index 0000000000000000000000000000000000000000..ed507ca58de5cb39c3c4aa805512a8dff80e8291 --- /dev/null +++ b/rec_model/steam.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:752c0cd11a8646adca10025b5746dfcb8968967a6104546f6f869a3ebf26609b +size 1953067 diff --git a/recommender/A_SASRec_final_bce_llm.py b/recommender/A_SASRec_final_bce_llm.py new file mode 100644 index 0000000000000000000000000000000000000000..dc7c94999a4db5f1b97971a2913baae44687c124 --- /dev/null +++ b/recommender/A_SASRec_final_bce_llm.py @@ -0,0 +1,222 @@ +import numpy as np +import pandas as pd +import argparse +import torch +from torch import nn +import torch.nn.functional as F +import os +import logging +import time as Time +from collections import Counter +from SASRecModules_ori import * + +def extract_axis_1(data, indices): + res = [] + for i in range(data.shape[0]): + res.append(data[i, indices[i], :]) + res = torch.stack(res, dim=0).unsqueeze(1) + return res + +class GRU(nn.Module): + def __init__(self, hidden_size, item_num, state_size, gru_layers=1): + super(GRU, self).__init__() + self.hidden_size = hidden_size + self.item_num = item_num + self.state_size = state_size + self.item_embeddings = nn.Embedding( + num_embeddings=item_num + 1, + embedding_dim=self.hidden_size, + ) + nn.init.normal_(self.item_embeddings.weight, 0, 0.01) + self.gru = nn.GRU( + input_size=self.hidden_size, + hidden_size=self.hidden_size, + num_layers=gru_layers, + batch_first=True + ) + self.s_fc = nn.Linear(self.hidden_size, self.item_num) + + def forward(self, states, len_states): + # Supervised Head + emb = self.item_embeddings(states) + emb_packed = torch.nn.utils.rnn.pack_padded_sequence(emb, len_states, batch_first=True, enforce_sorted=False) + emb_packed, hidden = self.gru(emb_packed) + hidden = hidden.view(-1, hidden.shape[2]) + supervised_output = self.s_fc(hidden) + return supervised_output + + def forward_eval(self, states, len_states): + # Supervised Head + emb = self.item_embeddings(states) + emb_packed = torch.nn.utils.rnn.pack_padded_sequence(emb, len_states, batch_first=True, enforce_sorted=False) + emb_packed, hidden = self.gru(emb_packed) + hidden = hidden.view(-1, hidden.shape[2]) + supervised_output = self.s_fc(hidden) + + return supervised_output + + +class Caser(nn.Module): + def __init__(self, hidden_size, item_num, state_size, num_filters, filter_sizes, + dropout_rate): + super(Caser, self).__init__() + self.hidden_size = hidden_size + self.item_num = int(item_num) + self.state_size = state_size + self.filter_sizes = eval(filter_sizes) + self.num_filters = num_filters + self.dropout_rate = dropout_rate + self.item_embeddings = nn.Embedding( + num_embeddings=item_num + 1, + embedding_dim=self.hidden_size, + ) + + # init embedding + nn.init.normal_(self.item_embeddings.weight, 0, 0.01) + + # Horizontal Convolutional Layers + self.horizontal_cnn = nn.ModuleList( + [nn.Conv2d(1, self.num_filters, (i, self.hidden_size)) for i in self.filter_sizes]) + # Initialize weights and biases + for cnn in self.horizontal_cnn: + nn.init.xavier_normal_(cnn.weight) + nn.init.constant_(cnn.bias, 0.1) + + # Vertical Convolutional Layer + self.vertical_cnn = nn.Conv2d(1, 1, (self.state_size, 1)) + nn.init.xavier_normal_(self.vertical_cnn.weight) + nn.init.constant_(self.vertical_cnn.bias, 0.1) + + # Fully Connected Layer + self.num_filters_total = self.num_filters * len(self.filter_sizes) + final_dim = self.hidden_size + self.num_filters_total + self.s_fc = nn.Linear(final_dim, item_num) + + # dropout + self.dropout = nn.Dropout(self.dropout_rate) + + def forward(self, states, len_states): + input_emb = self.item_embeddings(states) + mask = torch.ne(states, self.item_num).float().unsqueeze(-1) + input_emb *= mask + input_emb = input_emb.unsqueeze(1) + pooled_outputs = [] + for cnn in self.horizontal_cnn: + h_out = nn.functional.relu(cnn(input_emb)) + h_out = h_out.squeeze() + p_out = nn.functional.max_pool1d(h_out, h_out.shape[2]) + pooled_outputs.append(p_out) + + h_pool = torch.cat(pooled_outputs, 1) + h_pool_flat = h_pool.view(-1, self.num_filters_total) + + v_out = nn.functional.relu(self.vertical_cnn(input_emb)) + v_flat = v_out.view(-1, self.hidden_size) + + out = torch.cat([h_pool_flat, v_flat], 1) + out = self.dropout(out) + supervised_output = self.s_fc(out) + + return supervised_output + + def forward_eval(self, states, len_states): + input_emb = self.item_embeddings(states) + mask = torch.ne(states, self.item_num).float().unsqueeze(-1) + input_emb *= mask + input_emb = input_emb.unsqueeze(1) + pooled_outputs = [] + for cnn in self.horizontal_cnn: + h_out = nn.functional.relu(cnn(input_emb)) + h_out = h_out.squeeze() + p_out = nn.functional.max_pool1d(h_out, h_out.shape[2]) + pooled_outputs.append(p_out) + + h_pool = torch.cat(pooled_outputs, 1) + h_pool_flat = h_pool.view(-1, self.num_filters_total) + + v_out = nn.functional.relu(self.vertical_cnn(input_emb)) + v_flat = v_out.view(-1, self.hidden_size) + + out = torch.cat([h_pool_flat, v_flat], 1) + out = self.dropout(out) + supervised_output = self.s_fc(out) + + return supervised_output + + +class SASRec(nn.Module): + def __init__(self, hidden_size, item_num, state_size, dropout, device, num_heads=1): + super().__init__() + self.state_size = state_size + self.hidden_size = hidden_size + self.item_num = int(item_num) + self.dropout = nn.Dropout(dropout) + self.device = device + self.item_embeddings = nn.Embedding( + num_embeddings=item_num + 1, + embedding_dim=hidden_size, + ) + nn.init.normal_(self.item_embeddings.weight, 0, 1) + self.positional_embeddings = nn.Embedding( + num_embeddings=state_size, + embedding_dim=hidden_size + ) + self.emb_dropout = nn.Dropout(dropout) + self.ln_1 = nn.LayerNorm(hidden_size) + self.ln_2 = nn.LayerNorm(hidden_size) + self.ln_3 = nn.LayerNorm(hidden_size) + self.mh_attn = MultiHeadAttention(hidden_size, hidden_size, num_heads, dropout) + self.feed_forward = PositionwiseFeedForward(hidden_size, hidden_size, dropout) + self.s_fc = nn.Linear(hidden_size, item_num) + + def forward(self, states, len_states): + inputs_emb = self.item_embeddings(states) + inputs_emb += self.positional_embeddings(torch.arange(self.state_size).to(self.device)) + seq = self.emb_dropout(inputs_emb) + mask = torch.ne(states, self.item_num).float().unsqueeze(-1).to(self.device) + seq *= mask + seq_normalized = self.ln_1(seq) + mh_attn_out = self.mh_attn(seq_normalized, seq) + ff_out = self.feed_forward(self.ln_2(mh_attn_out)) + ff_out *= mask + ff_out = self.ln_3(ff_out) + state_hidden = extract_axis_1(ff_out, len_states - 1) + supervised_output = self.s_fc(state_hidden).squeeze() + return supervised_output + + def forward_eval(self, states, len_states): + inputs_emb = self.item_embeddings(states) + inputs_emb += self.positional_embeddings(torch.arange(self.state_size).to(self.device)) + seq = self.emb_dropout(inputs_emb) + mask = torch.ne(states, self.item_num).float().unsqueeze(-1).to(self.device) + seq *= mask + seq_normalized = self.ln_1(seq) + mh_attn_out = self.mh_attn(seq_normalized, seq) + ff_out = self.feed_forward(self.ln_2(mh_attn_out)) + ff_out *= mask + ff_out = self.ln_3(ff_out) + state_hidden = extract_axis_1(ff_out, len_states - 1) + supervised_output = self.s_fc(state_hidden).squeeze() + return supervised_output + + def cacul_h(self, states, len_states): + device = self.device + states = states.to(device) + inputs_emb = self.item_embeddings(states) + inputs_emb += self.positional_embeddings(torch.arange(self.state_size).to(self.device)) + seq = self.emb_dropout(inputs_emb) + mask = torch.ne(states, self.item_num).float().unsqueeze(-1).to(self.device) + seq *= mask + seq_normalized = self.ln_1(seq) + mh_attn_out = self.mh_attn(seq_normalized, seq) + ff_out = self.feed_forward(self.ln_2(mh_attn_out)) + ff_out *= mask + ff_out = self.ln_3(ff_out) + state_hidden = extract_axis_1(ff_out, len_states - 1) + # print("state_hidden.size", state_hidden.size()) + return state_hidden + + def cacu_x(self, x): + x = self.item_embeddings(x) + + return x diff --git a/recommender/__init__.py b/recommender/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..f1b15f87b265590ade9141801d5c1c0b1d9a731c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,150 @@ +accelerate==0.18.0 +aiofiles==23.1.0 +aiohttp==3.8.4 +aiosignal==1.3.1 +altair==4.2.2 +anyio==3.6.2 +appdirs==1.4.4 +asttokens==2.2.1 +async-timeout==4.0.2 +attrs==22.2.0 +backcall==0.2.0 +backports.functools-lru-cache==1.6.5 +bitsandbytes==0.37.2 +black==23.3.0 +certifi==2023.7.22 +charset-normalizer==3.1.0 +click==8.1.3 +cmake==3.26.1 +comm==0.1.3 +contourpy==1.0.7 +cycler==0.11.0 +datasets==2.10.1 +debugpy==1.6.6 +decorator==5.1.1 +dill==0.3.6 +docker-pycreds==0.4.0 +entrypoints==0.4 +executing==1.2.0 +fastapi==0.95.0 +ffmpy==0.3.0 +filelock==3.10.7 +fire==0.5.0 +fonttools==4.39.3 +frozenlist==1.3.3 +fsspec==2023.3.0 +gitdb==4.0.10 +GitPython==3.1.31 +gradio==3.23.0 +h11==0.14.0 +httpcore==0.16.3 +httpx==0.23.3 +huggingface-hub==0.13.3 +idna==3.4 +importlib-metadata==6.8.0 +ipykernel==6.22.0 +ipython==8.11.0 +jedi==0.18.2 +Jinja2==3.1.2 +joblib==1.2.0 +jsonschema==4.17.3 +jupyter_client==8.1.0 +jupyter_core==5.3.0 +kiwisolver==1.4.4 +linkify-it-py==2.0.0 +lit==16.0.0 +markdown-it-py==2.2.0 +MarkupSafe==2.1.2 +matplotlib==3.7.1 +matplotlib-inline==0.1.6 +mdit-py-plugins==0.3.3 +mdurl==0.1.2 +mpmath==1.3.0 +multidict==6.0.4 +multiprocess==0.70.14 +mypy-extensions==1.0.0 +nest-asyncio==1.5.6 +networkx==3.0 +numpy==1.24.2 +nvidia-cublas-cu11==11.10.3.66 +nvidia-cuda-cupti-cu11==11.7.101 +nvidia-cuda-nvrtc-cu11==11.7.99 +nvidia-cuda-runtime-cu11==11.7.99 +nvidia-cudnn-cu11==8.5.0.96 +nvidia-cufft-cu11==10.9.0.58 +nvidia-curand-cu11==10.2.10.91 +nvidia-cusolver-cu11==11.4.0.1 +nvidia-cusparse-cu11==11.7.4.91 +nvidia-nccl-cu11==2.14.3 +nvidia-nvtx-cu11==11.7.91 +orjson==3.8.9 +packaging==23.0 +pandas==1.5.3 +parso==0.8.3 +pathspec==0.11.1 +pathtools==0.1.2 +peft==0.3.0 +pexpect==4.8.0 +pickleshare==0.7.5 +Pillow==9.4.0 +pip==23.2.1 +platformdirs==3.10.0 +prompt-toolkit==3.0.38 +protobuf==4.22.1 +psutil==5.9.4 +ptyprocess==0.7.0 +pure-eval==0.2.2 +pyarrow==11.0.0 +pydantic==1.10.7 +pydub==0.25.1 +Pygments==2.14.0 +pyparsing==3.0.9 +pyrsistent==0.19.3 +python-dateutil==2.8.2 +python-multipart==0.0.6 +pytz==2023.3 +PyYAML==6.0 +pyzmq==25.0.2 +regex==2023.3.23 +requests==2.28.2 +responses==0.18.0 +rfc3986==1.5.0 +scikit-learn==1.2.2 +scipy==1.10.1 +seaborn==0.12.2 +semantic-version==2.10.0 +sentencepiece==0.1.97 +sentry-sdk==1.19.1 +setproctitle==1.3.2 +setuptools==68.1.2 +six==1.16.0 +smmap==5.0.0 +sniffio==1.3.0 +stack-data==0.6.2 +starlette==0.26.1 +sympy==1.11.1 +termcolor==2.2.0 +threadpoolctl==3.1.0 +tokenize-rt==5.0.0 +tokenizers==0.13.2 +tomli==2.0.1 +toolz==0.12.0 +torch==2.0.0 +tornado==6.2 +tqdm==4.65.0 +traitlets==5.9.0 +transformers==4.28.0 +triton==2.0.0 +typing_extensions==4.5.0 +uc-micro-py==1.0.1 +urllib3==1.26.15 +uvicorn==0.21.1 +wandb==0.14.1 +wcwidth==0.2.6 +websockets==10.4 +wheel==0.41.2 +xxhash==3.2.0 +yarl==1.8.2 +zipp==3.16.2 +pytorch_lightning==1.8.6 +bitsandbytes==0.37.2 \ No newline at end of file diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..15467ecba6f2cfe22b5994659498cbca8b13de7e --- /dev/null +++ b/setup.sh @@ -0,0 +1,29 @@ +#!/bin/bash +uv sync --offline +cp debug/utils.py .venv/lib/python3.10/site-packages/transformers/generation/utils.py +cp debug/modeling_llama.py .venv/lib/python3.10/site-packages/transformers/models/llama/modeling_llama.py + +export LLM_PATH=meta-llama/Llama-2-7b-hf + +# 获取/usr/local下所有cuda-目录(末尾可能带/,需要去掉) +cuda_dirs=(/usr/local/cuda-*/) +if [ ${#cuda_dirs[@]} -eq 0 ]; then + echo "未在 /usr/local 找到任何 cuda 文件夹" + exit 1 +fi + +# 去除末尾的斜杠,并利用sort -V按版本排序,选取最后一个作为最新版本 +latest_cuda=$(for dir in "${cuda_dirs[@]}"; do echo "${dir%/}"; done | sort -V | tail -n 1) + +echo "最新的 CUDA 文件夹为: $latest_cuda" + +# 构造新的LD_LIBRARY_PATH +# 依次加入以下路径: +# 1. ${latest_cuda}/lib64/stubs +# 2. ${latest_cuda}/lib64 +# 3. ${latest_cuda}/cudnn/lib +export CUDA_HOME="${latest_cuda}" +export PATH="${latest_cuda}/bin:${PATH}" +export LD_LIBRARY_PATH="${latest_cuda}/lib64/stubs:${latest_cuda}/lib64:${latest_cuda}/cudnn/lib:${LD_LIBRARY_PATH}" + +sh train_movielens.sh diff --git a/test_lastfm.sh b/test_lastfm.sh new file mode 100644 index 0000000000000000000000000000000000000000..c0d31dd71e4aa66f263a3aa8a1ae1befca018d02 --- /dev/null +++ b/test_lastfm.sh @@ -0,0 +1,21 @@ +python main.py \ +--mode test \ +--router share \ +--gating Dense \ +--batch_size 8 \ +--accumulate_grad_batches 16 \ +--dataset lastfm_data \ +--data_dir data/ref/lastfm \ +--cans_num 20 \ +--prompt_path ./prompt/artist.txt \ +--rec_embed SASRec \ +--llm_tuning moelora \ +--llm_path $LLM_PATH \ +--rec_model_path ./rec_model/lastfm.pt \ +--ckpt_path ./checkpoints/lastfm.ckpt \ +--output_dir ./output/lastfm/ \ +--log_dir lastfm_logs \ +--lr_warmup_start_lr 7e-6 \ +--lr 7e-4 \ +--lr_decay_min_lr 7e-6 \ +--max_epochs 5 diff --git a/test_movielens.sh b/test_movielens.sh new file mode 100644 index 0000000000000000000000000000000000000000..e058b23fe77f98fb5dc7f2d636b5e8d1556c3de7 --- /dev/null +++ b/test_movielens.sh @@ -0,0 +1,21 @@ +python main.py \ +--mode test \ +--router share \ +--gating Dense \ +--batch_size 8 \ +--accumulate_grad_batches 16 \ +--dataset movielens_data \ +--data_dir data/ref/movielens \ +--cans_num 20 \ +--prompt_path ./prompt/movie.txt \ +--rec_embed SASRec \ +--llm_tuning moelora \ +--llm_path $LLM_PATH \ +--rec_model_path ./rec_model/movielens.pt \ +--ckpt_path ./checkpoints/movielens.ckpt \ +--output_dir ./output/movielens/ \ +--log_dir movielens_logs \ +--lr_warmup_start_lr 8e-6 \ +--lr 8e-4 \ +--lr_decay_min_lr 8e-6 \ +--max_epochs 5 diff --git a/test_steam.sh b/test_steam.sh new file mode 100644 index 0000000000000000000000000000000000000000..6b45bb0e5d088da0383dbf7363732ee89bccc8f5 --- /dev/null +++ b/test_steam.sh @@ -0,0 +1,21 @@ +python main.py \ +--mode test \ +--router share \ +--gating Dense \ +--batch_size 4 \ +--accumulate_grad_batches 32 \ +--dataset steam_data \ +--data_dir data/ref/steam \ +--cans_num 20 \ +--prompt_path ./prompt/game.txt \ +--rec_embed SASRec \ +--llm_tuning moelora \ +--llm_path $LLM_PATH \ +--rec_model_path ./rec_model/steam.pt \ +--ckpt_path ./checkpoints/steam.ckpt \ +--output_dir ./output/steam/ \ +--log_dir steam_logs \ +--lr_warmup_start_lr 5e-6 \ +--lr 5e-4 \ +--lr_decay_min_lr 5e-6 \ +--max_epochs 5 diff --git a/train_lastfm.sh b/train_lastfm.sh new file mode 100644 index 0000000000000000000000000000000000000000..f0e105a332b0e9f6356c894718fb1db9ba1c89e9 --- /dev/null +++ b/train_lastfm.sh @@ -0,0 +1,21 @@ +python main.py \ +--mode train \ +--router share \ +--gating Dense \ +--batch_size 8 \ +--accumulate_grad_batches 16 \ +--dataset lastfm_data \ +--data_dir data/ref/lastfm \ +--cans_num 20 \ +--prompt_path ./prompt/artist.txt \ +--rec_embed SASRec \ +--llm_tuning moelora \ +--llm_path $LLM_PATH \ +--rec_model_path ./rec_model/lastfm.pt \ +--ckpt_dir ./checkpoints/lastfm/ \ +--output_dir ./output/lastfm/ \ +--log_dir lastfm_logs \ +--lr_warmup_start_lr 7e-6 \ +--lr 7e-4 \ +--lr_decay_min_lr 7e-6 \ +--max_epochs 5 diff --git a/train_movielens.sh b/train_movielens.sh new file mode 100644 index 0000000000000000000000000000000000000000..bf116422de045dee0ae66095ce86223e4f4c741d --- /dev/null +++ b/train_movielens.sh @@ -0,0 +1,21 @@ +python main.py \ +--mode train \ +--router share \ +--gating Dense \ +--batch_size 1 \ +--accumulate_grad_batches 4 \ +--dataset movielens_data \ +--data_dir data/ref/movielens \ +--cans_num 20 \ +--prompt_path ./prompt/movie.txt \ +--rec_embed SASRec \ +--llm_tuning moelora \ +--llm_path $LLM_PATH \ +--rec_model_path ./rec_model/movielens.pt \ +--ckpt_dir ./checkpoints/movielens/ \ +--output_dir ./output/movielens/ \ +--log_dir movielens_logs \ +--lr_warmup_start_lr 8e-6 \ +--lr 8e-4 \ +--lr_decay_min_lr 8e-6 \ +--max_epochs 5 diff --git a/train_steam.sh b/train_steam.sh new file mode 100644 index 0000000000000000000000000000000000000000..2a72dd39d39576620080ec36c5ef7f6b2b56c694 --- /dev/null +++ b/train_steam.sh @@ -0,0 +1,21 @@ +python main.py \ +--mode train \ +--router share \ +--gating Dense \ +--batch_size 4 \ +--accumulate_grad_batches 32 \ +--dataset steam_data \ +--data_dir data/ref/steam \ +--cans_num 20 \ +--prompt_path ./prompt/game.txt \ +--rec_embed SASRec \ +--llm_tuning moelora \ +--llm_path $LLM_PATH \ +--rec_model_path ./rec_model/steam.pt \ +--ckpt_dir ./checkpoints/steam/ \ +--output_dir ./output/steam/ \ +--log_dir steam_logs \ +--lr_warmup_start_lr 5e-6 \ +--lr 5e-4 \ +--lr_decay_min_lr 5e-6 \ +--max_epochs 5 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000000000000000000000000000000000..f42566f6ca565a73ddb446b5097f7dd10b4476e9 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2698 @@ +version = 1 +revision = 1 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version >= '3.12' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and sys_platform != 'linux'", + "python_full_version < '3.11' and sys_platform == 'linux'", + "python_full_version < '3.11' and sys_platform != 'linux'", +] + +[[package]] +name = "accelerate" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/16/d361c7716dc7b46c8f1ee77040b09d22e01f9b36f5159a139aed877a4bef/accelerate-0.18.0.tar.gz", hash = "sha256:1dd36fd972de4a6d0cffe5e4d6d30622fd853765f773b5582cf0796deefe1016", size = 199320 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/87/25dd46811431cfc5e8d6ba8c80758cb3131574b271fbf06cf1b691dba8d4/accelerate-0.18.0-py3-none-any.whl", hash = "sha256:41a84ac94407d7dcf030caf0cdadc70496594aec27ea680207bdb15b95f8a602", size = 215296 }, +] + +[[package]] +name = "aiofiles" +version = "23.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/a0/07be94aecba162ed5147359f9883e82afd2ac13aed33678a008fc8c36f8b/aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635", size = 15614 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/76/635aa4f210d46ca105bfedd42d41f649b91d3e58422912726fc5e7965442/aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2", size = 14855 }, +] + +[[package]] +name = "aiohttp" +version = "3.8.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiosignal" }, + { name = "async-timeout" }, + { name = "attrs" }, + { name = "charset-normalizer" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/fd/1ff4da09ca29d8933fda3f3514980357e25419ce5e0f689041edb8f17dab/aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c", size = 7338512 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/18/43720f71f5496544e69f8723534d8b5fa6de8b1ad2f64a5d7e797c4ee6e7/aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1", size = 512619 }, + { url = "https://files.pythonhosted.org/packages/8a/92/1ce3215bcde9cb1da929bf78742269ed2371e5c22190e2886df4bc0251ca/aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a", size = 358131 }, + { url = "https://files.pythonhosted.org/packages/bf/9c/f2fc160f21fd3ea98f00da1f285bb6b24c53863ee30e67901f92b8a8f6c6/aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b", size = 336858 }, + { url = "https://files.pythonhosted.org/packages/6b/33/68ba7406db6ea62f34cfacdb86eecbef1e3fc81f5f8335f0c8e11157ddbc/aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3", size = 1004069 }, + { url = "https://files.pythonhosted.org/packages/c7/b8/e886ff5e85698200d8b9667908a6f0e0439dc4fd165c4875b6efbbfeedd1/aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc", size = 1019148 }, + { url = "https://files.pythonhosted.org/packages/c9/6e/c68d4618e2f15248deddc992ce35d979b52df9a9b8ecbc00ae9ed83c6316/aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd", size = 1073573 }, + { url = "https://files.pythonhosted.org/packages/81/97/90debed02e5be15d4e63fb96ba930e35b66d4e518fa7065dd442345a448b/aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5", size = 1000618 }, + { url = "https://files.pythonhosted.org/packages/b1/f2/81258cc72112956bca0bcf9f539cd6f503e1a631f5bf9307ae3cf21e05a5/aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e", size = 971166 }, + { url = "https://files.pythonhosted.org/packages/3a/42/57dc93de564725208a1ea729a717f2608f0091a11e34ecd2e23863b9ef35/aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd", size = 1017966 }, + { url = "https://files.pythonhosted.org/packages/88/5f/4fec6a1238fda86716374910aa5a1a4953eca4cf30b582c94efce9058729/aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6", size = 985792 }, + { url = "https://files.pythonhosted.org/packages/25/b4/4373590c8bd438ccca4c916bb6a65dc3366e4f030a17359f4adb0ff605ce/aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9", size = 1036137 }, + { url = "https://files.pythonhosted.org/packages/5c/c5/26cd1522e373484b1648da913be6f084ce4d7473ecebe503533a3bb85536/aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949", size = 1084638 }, + { url = "https://files.pythonhosted.org/packages/29/6e/a15e39b2ae4305336bfc00540bde991fff73c60e7e8390b9e82a6ec485f2/aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea", size = 1013223 }, + { url = "https://files.pythonhosted.org/packages/66/90/1c0ff493317bae426c1aec5da9cbcd9baea4a8d526e4beae892896aefa64/aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1", size = 304642 }, + { url = "https://files.pythonhosted.org/packages/8e/cd/f8f8d801fa5c0cd1d6259fa71c9394437c5c14f8936aeff6f6c3233fd596/aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f", size = 319844 }, + { url = "https://files.pythonhosted.org/packages/84/18/86e01032e305637d991b23b37bb39170ebaf8b8c4d0ea458b75f4302ed86/aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4", size = 505614 }, + { url = "https://files.pythonhosted.org/packages/91/71/99cd9ebe197cbebf46ba1f00573120802ace2869e1f63ff0b00acc5b4982/aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4", size = 355149 }, + { url = "https://files.pythonhosted.org/packages/08/30/3dafa445e7f6358aa1c5ffde987ca4eba6bd7b9038e07ec01732933312fb/aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef", size = 332872 }, + { url = "https://files.pythonhosted.org/packages/88/41/2a8453255ebb0864d81745d24bee03fff71b7b76ed2f846126a6f5930ee4/aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f", size = 1035384 }, + { url = "https://files.pythonhosted.org/packages/fc/51/962b938a296eaf08d1cfa80ad5d42670b15aa868f897c0e71ea1cf9d1f0e/aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e", size = 1045448 }, + { url = "https://files.pythonhosted.org/packages/33/a7/c2304859f11531f6be5c464e3d8cdd85cbc196f0754e0c450ef76c297c7c/aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f", size = 1102557 }, + { url = "https://files.pythonhosted.org/packages/a0/e4/a383cb4b68324b39f7d95cdfebdc8a66a88201c3646a87a00140d778c5ba/aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05", size = 1026820 }, + { url = "https://files.pythonhosted.org/packages/68/28/e46516d7ca64146e50e595e0364530e4080da0d9f7640b43b687836ebd2f/aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654", size = 985493 }, + { url = "https://files.pythonhosted.org/packages/e6/4a/ad8fde32ba6bab15c15eaf770f10a10d0bfe8dd575fc96981ad1b615f509/aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a", size = 1046399 }, + { url = "https://files.pythonhosted.org/packages/d9/b8/5225fbcca70348708eaf939d6821f21cbbfa12290d6314b02608a94cc38c/aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb", size = 1004400 }, + { url = "https://files.pythonhosted.org/packages/ab/9d/3bdb23a925d7ba67acc8a6158191fe8874b1dda6745bb67ee40f493480e4/aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531", size = 1065370 }, + { url = "https://files.pythonhosted.org/packages/8a/06/be76e45900b729964a595246b1a9cd7b7d22ca015203b4b74847b4424ee9/aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b", size = 1112366 }, + { url = "https://files.pythonhosted.org/packages/40/4d/49cfd9cd450196601facd6f1f6ea551856dcd41b2061851c06c66885cca2/aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24", size = 1038406 }, + { url = "https://files.pythonhosted.org/packages/c8/6d/96781308f03ad27d849524053f63285cd53dc178b9018e8db148ed46a8c6/aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d", size = 304029 }, + { url = "https://files.pythonhosted.org/packages/c5/22/6bd9f9a90807ef11e4c4a3ec19099e24f2b6f4040ee568f71ed0e5fdb6d1/aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc", size = 317232 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617 }, +] + +[[package]] +name = "altair" +version = "4.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "entrypoints" }, + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "toolz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/bf/781b607da4c1a2a7211cd570bd7e22e0accd4deaf1074c32ac7344a09339/altair-4.2.2.tar.gz", hash = "sha256:39399a267c49b30d102c10411e67ab26374156a84b1aeb9fcd15140429ba49c5", size = 740430 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/62/47452306e84d4d2e67f9c559380aeb230f5e6ca84fafb428dd36b96a99ba/altair-4.2.2-py3-none-any.whl", hash = "sha256:8b45ebeaf8557f2d760c5c77b79f02ae12aee7c46c27c06014febab6f849bc87", size = 813630 }, +] + +[[package]] +name = "anyio" +version = "3.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/94/6928d4345f2bc1beecbff03325cad43d320717f51ab74ab5a571324f4f5a/anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421", size = 140378 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/2b/b4c0b7a3f3d61adb1a1e0b78f90a94e2b6162a043880704b7437ef297cad/anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3", size = 80622 }, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "asttokens" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/e3/b0b4f32162621126fbdaba636c152c6b6baec486c99f48686e66343d638f/asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3", size = 60486 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/e1/64679d9d0759db5b182222c81ff322c2fe2c31e156a59afd6e9208c960e5/asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c", size = 26898 }, +] + +[[package]] +name = "async-timeout" +version = "4.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/6e/9678f7b2993537452710ffb1750c62d2c26df438aa621ad5fa9d1507a43a/async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15", size = 8221 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/c1/8991e7c5385b897b8c020cdaad718c5b087a6626d1d11a23e1ea87e325a7/async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c", size = 5763 }, +] + +[[package]] +name = "attrs" +version = "22.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/31/3f468da74c7de4fcf9b25591e682856389b3400b4b62f201e65f15ea3e07/attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99", size = 215900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/6e/6f83bf616d2becdf333a1640f1d463fef3150e2e926b7010cb0f81c95e88/attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", size = 60018 }, +] + +[[package]] +name = "backcall" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/40/764a663805d84deee23043e1426a9175567db89c8b3287b5c2ad9f71aa93/backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", size = 18041 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/1c/ff6546b6c12603d8dd1070aa3c3d273ad4c07f5771689a7b69a550e8c951/backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255", size = 11157 }, +] + +[[package]] +name = "backports-functools-lru-cache" +version = "1.6.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/e9/2585a2b3de3b246ad90370a3a3d19b82b857784975559b44122a4cb5ceb7/backports.functools_lru_cache-1.6.5.tar.gz", hash = "sha256:e7efcdd8cf92279bcb09fdb9b31e984ffdc96fc9f21e22ff20538884cb99b97d", size = 10518 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5e/3a1b7ee2726c5c3b50e1bbafb5f2963b9bff3279b4423428c2b8063a1600/backports.functools_lru_cache-1.6.5-py2.py3-none-any.whl", hash = "sha256:3b8f1c6537651f130706488e61f3275b010002676432e9e7638a9e0fc1b40668", size = 5974 }, +] + +[[package]] +name = "bitsandbytes" +version = "0.44.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/60/102e403e05dd58c3ea745d42108880f11a957e4aa369e282c9b69c4dc44a/bitsandbytes-0.44.0-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:f31b32ace5d2da0fc7f55b8ed205364298769daaa34d61a45e1f7f2bfd1b3622", size = 122419922 }, + { url = "https://files.pythonhosted.org/packages/6d/d4/bff9d0bbe899a35749bc66eb83bda0345aa2b91621b1b3400ed58810c0d7/bitsandbytes-0.44.0-py3-none-win_amd64.whl", hash = "sha256:fb3dae427e2c07ecc2bd847e4bb49941093b88480d85ba207d5ac4db8d3ff42f", size = 121451909 }, +] + +[[package]] +name = "certifi" +version = "2023.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/98/c2ff18671db109c9f10ed27f5ef610ae05b73bd876664139cf95bd1429aa/certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", size = 159517 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/dd/2234eab22353ffc7d94e8d13177aaa050113286e93e7b40eae01fbf7c3d9/certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9", size = 158334 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/d7/8d757f8bd45be079d76309248845a04f09619a7b17d6dfc8c9ff6433cac2/charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", size = 95987 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/a2/9031ba4a008e11a21d7b7aa41751290d2f2035a2f14ecb6e589771a17c47/charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", size = 202016 }, + { url = "https://files.pythonhosted.org/packages/67/df/660e9665ace7ad711e275194a86cb757fb4d4e513fae5ff3d39573db4984/charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", size = 124833 }, + { url = "https://files.pythonhosted.org/packages/c6/ab/43ea052756b2f2dcb6a131897811c0e2704b0288f090336217d3346cd682/charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", size = 123014 }, + { url = "https://files.pythonhosted.org/packages/6d/59/59a3f4d8a59ee270da77f9e954a0e284c9d6884d39ec69d696d9aa5ff2f2/charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", size = 195883 }, + { url = "https://files.pythonhosted.org/packages/69/22/66351781e668158feef71c5e3b059a79ecc9efc3ef84a45888b0f3a933d5/charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", size = 209435 }, + { url = "https://files.pythonhosted.org/packages/72/90/667a6bc6abe42fc10adf4cd2c1e1c399d78e653dbac4c8018350843d4ab7/charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", size = 199153 }, + { url = "https://files.pythonhosted.org/packages/cc/f6/21a66e524658bd1dd7b89ac9d1ee8f7823f2d9701a2fbc458ab9ede53c63/charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", size = 199292 }, + { url = "https://files.pythonhosted.org/packages/bb/dc/58fdef3ab85e8e7953a8b89ef1d2c06938b8ad88d9617f22967e1a90e6b8/charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", size = 200728 }, + { url = "https://files.pythonhosted.org/packages/c2/35/dfb4032f5712747d3dcfdd19d0768f6d8f60910ae24ed066ecbf442be013/charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", size = 192709 }, + { url = "https://files.pythonhosted.org/packages/f2/d7/6ee92c11eda3f3c9cac1e059901092bfdf07388be7d2e60ac627527eee62/charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", size = 194349 }, + { url = "https://files.pythonhosted.org/packages/23/13/cf5d7bb5bc95f120df64d6c470581189df51d7f011560b2a06a395b7a120/charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", size = 205122 }, + { url = "https://files.pythonhosted.org/packages/74/f1/d0b8385b574f7e086fb6709e104b696707bd3742d54a6caf0cebbb7e975b/charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", size = 195332 }, + { url = "https://files.pythonhosted.org/packages/f4/0a/8c03913ed1eca9d831db0c28759edb6ce87af22bb55dbc005a52525a75b6/charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", size = 192813 }, + { url = "https://files.pythonhosted.org/packages/2e/25/3eab2b38fef9ae59f7b4e9c1e62eb50609d911867e5acabace95fe25c0b1/charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", size = 89472 }, + { url = "https://files.pythonhosted.org/packages/05/f3/86b5fcb5c8fe8b4231362918a7c4d8f549c56561c5fdb495a3c5b41c6862/charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", size = 97074 }, + { url = "https://files.pythonhosted.org/packages/e1/7c/398600268fc98b7e007f5a716bd60903fff1ecff75e45f5700212df5cd76/charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", size = 199439 }, + { url = "https://files.pythonhosted.org/packages/0a/67/8d3d162ec6641911879651cdef670c3c6136782b711d7f8e82e2fffe06e0/charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", size = 123737 }, + { url = "https://files.pythonhosted.org/packages/85/e8/18d408d8fe29a56012c10d6b15960940b83f06620e9d7481581cdc6d9901/charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", size = 121686 }, + { url = "https://files.pythonhosted.org/packages/9e/62/a1e0a8f8830c92014602c8a88a1a20b8a68d636378077381f671e6e1cec9/charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", size = 193978 }, + { url = "https://files.pythonhosted.org/packages/12/12/c5c39f5a149cd6788d2e40cea5618bae37380e2754fcdf53dc9e01bdd33a/charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", size = 207518 }, + { url = "https://files.pythonhosted.org/packages/d7/4c/37ad75674e8c6bc22ab01bef673d2d6e46ee44203498c9a26aa23959afe5/charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", size = 197713 }, + { url = "https://files.pythonhosted.org/packages/18/36/7ae10a3dd7f9117b61180671f8d1e4802080cca88ad40aaabd3dad8bab0e/charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", size = 197270 }, + { url = "https://files.pythonhosted.org/packages/16/58/19fd2f62e6ff44ba0db0cd44b584790555e2cde09293149f4409d654811b/charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", size = 198541 }, + { url = "https://files.pythonhosted.org/packages/c9/8c/a76dd9f2c8803eb147e1e715727f5c3ba0ef39adaadf66a7b3698c113180/charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", size = 190663 }, + { url = "https://files.pythonhosted.org/packages/21/16/1b0d8fdcb81bbf180976af4f867ce0f2244d303ab10d452fde361dec3b5c/charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", size = 192306 }, + { url = "https://files.pythonhosted.org/packages/5d/2b/4d8c80400c04ae3c8dbc847de092e282b5c7b17f8f9505d68bb3e5815c71/charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", size = 202834 }, + { url = "https://files.pythonhosted.org/packages/e5/aa/9d2d60d6a566423da96c15cd11cbb88a70f9aff9a4db096094ee19179cab/charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", size = 193463 }, + { url = "https://files.pythonhosted.org/packages/56/24/5f2dedcf3d0673931b6200c410832ae44b376848bc899dbf1fa6c91c4ebe/charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", size = 190959 }, + { url = "https://files.pythonhosted.org/packages/bc/08/7e7c97399806366ca515a049c3a1e4b644a6a2048bed16e5e67bfaafd0aa/charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", size = 89241 }, + { url = "https://files.pythonhosted.org/packages/ad/83/994bfca99e29f1bab66b9248e739360ee70b5aae0a5ee488cd776501edbc/charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", size = 96688 }, + { url = "https://files.pythonhosted.org/packages/ef/81/14b3b8f01ddaddad6cdec97f2f599aa2fa466bd5ee9af99b08b7713ccd29/charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", size = 46166 }, +] + +[[package]] +name = "click" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/87/84326af34517fca8c58418d148f2403df25303e02736832403587318e9e8/click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", size = 331147 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48", size = 96588 }, +] + +[[package]] +name = "cmake" +version = "3.26.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/58/7e8a67c5d080c92491e17d7e6ad6269920eedcb3b63b76cd40a84931f691/cmake-3.26.1.tar.gz", hash = "sha256:4e0eb3c03dcf2d459f78d96cc85f7482476aeb1ae5ada65150b1db35c0f70cc7", size = 35253 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/52/2cbd61daebdf18dd76d531c29c91c280d4811d714ba91b8a4beeef39e8dc/cmake-3.26.1-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:d8a7e0cc8677677a732aff3e3fd0ad64eeff43cac772614b03c436912247d0d8", size = 45571626 }, + { url = "https://files.pythonhosted.org/packages/61/0c/a8a5a4241ccf70d87ee33aa32ccd24d6d4320d0a585337b4b51e693c1325/cmake-3.26.1-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:f2f721f5aebe304c281ee4b1d2dfbf7f4a52fca003834b2b4a3ba838aeded63c", size = 23840662 }, + { url = "https://files.pythonhosted.org/packages/55/49/7183cf8efa98e74543589c0674f1856e927ed61a3cfb995e58811ad854f2/cmake-3.26.1-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:63a012b72836702eadfe4fba9642aeb17337f26861f4768e837053f40e98cb46", size = 23099375 }, + { url = "https://files.pythonhosted.org/packages/60/ad/cc88440346b3ae8d4c2155f374e4c847af986b6909f896db700507b0ef58/cmake-3.26.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2b72be88b7bfaa6ae59566cbb9d6a5553f19b2a8d14efa6ac0cf019a29860a1b", size = 23349105 }, + { url = "https://files.pythonhosted.org/packages/51/ac/1ebe6ccc02d52b40dc523662c3355ca36ef1824ed1a8a27f4e2872e52313/cmake-3.26.1-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1278354f7210e22458aa9137d46a56da1f115a7b76ad2733f0bf6041fb40f1dc", size = 24963075 }, + { url = "https://files.pythonhosted.org/packages/cf/8c/fd85a3fb989e738fbccd2a98fba815346b111bcf10e954ec36cad67abaa8/cmake-3.26.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:de96a5522917fba0ab0da2d01d9dd9462fa80f365218bf27162d539c2335758f", size = 26546209 }, + { url = "https://files.pythonhosted.org/packages/b6/cd/4a107c900735f5ae5d8feae5342d80a213fd5541d798c70b635039a07a80/cmake-3.26.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:449928ad7dfcd41e4dcff64c7d44f86557883c70577666a19e79e22d783bbbd0", size = 23165676 }, + { url = "https://files.pythonhosted.org/packages/b0/93/74245e24426bd870ea56006be302805ed0bddb50e52edd700e5ddbd259bb/cmake-3.26.1-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19fa3e457afecf2803265f71652ef17c3f1d317173c330ba46767a0853d38fa0", size = 24000698 }, + { url = "https://files.pythonhosted.org/packages/94/86/7786771a65d7f99fb1739503c81edf764d0d50760076c7f39edab3dfdf4d/cmake-3.26.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:43360650d60d177d979e4ad0a5f31afa286e6d88f5350f7a38c29d94514900eb", size = 24135905 }, + { url = "https://files.pythonhosted.org/packages/ee/8a/391cb48c26ad325ec0de595a3592304280105c23497a4c6cf79caa80ee42/cmake-3.26.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:16aac10363bc926da5109a59ef8fe46ddcd7e3d421de61f871b35524eef2f1ae", size = 27125870 }, + { url = "https://files.pythonhosted.org/packages/14/bc/4298f04ed36cab9d254af825cd7c021535de565e8758285878e9eeb56c1c/cmake-3.26.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:e460ba5070be4dcac9613cb526a46db4e5fa19d8b909a8d8d5244c6cc3c777e1", size = 27893363 }, + { url = "https://files.pythonhosted.org/packages/cd/e6/dc366cfec16151547236205bd88063118a89c5573ba9334afe9727374772/cmake-3.26.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:fd2ecc0899f7939a014bd906df85e8681bd63ce457de3ab0b5d9e369fa3bdf79", size = 24154195 }, + { url = "https://files.pythonhosted.org/packages/ff/8b/d55ce095bc2a31ce0a820e8b50260def18d9a2f1e312632e8ae02ec5af88/cmake-3.26.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:22781a23e274ba9bf380b970649654851c1b4b9d83b65fec12ee2e2e03b6ffc4", size = 25493124 }, + { url = "https://files.pythonhosted.org/packages/02/dd/8d1366a417c51928c0c19991b8c6803c63abc7c1fd07f5ab7639a344ec3b/cmake-3.26.1-py2.py3-none-win32.whl", hash = "sha256:7b4e81de30ac1fb2f1eb5287063e140b53f376fd9ed7e2060c1c7b5917bd5f83", size = 29597676 }, + { url = "https://files.pythonhosted.org/packages/47/08/4445a965f6fcbdda42556fe999d0465d1c288c4d2743e076704adcf7ea44/cmake-3.26.1-py2.py3-none-win_amd64.whl", hash = "sha256:90845b6c87a25be07e9220f67dd7f6c891c6ec14d764d37335218d97f9ea4520", size = 32993308 }, + { url = "https://files.pythonhosted.org/packages/e0/62/44e120a0cae43775c2aca6b0e7d9f5a6def8296599d65f0b8f0030506ab0/cmake-3.26.1-py2.py3-none-win_arm64.whl", hash = "sha256:43bd96327e2631183bb4829ba20cb810e20b4b0c68f852fcd7082fbb5359d57c", size = 29597681 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "comm" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/1a/9937a10f8fd6d9f0f72fa0ab520cec7e50c534b215f8fd2d28e0f0a7f9a7/comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e", size = 5628 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/f3/b88d7e1dadf741550c56b70d7ce62673354fddb68e143d193ceb80224208/comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37", size = 6597 }, +] + +[[package]] +name = "contourpy" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/9b/6edb9d3e334a70a212f66a844188fcb57ddbd528cbc3b1fe7abfc317ddd7/contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e", size = 13361449 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/de/28740ce2298fee83d7ce2c935a122c8f38e46b6a904e7533ef32e7206e96/contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d", size = 452986 }, + { url = "https://files.pythonhosted.org/packages/55/31/be8029093f8b1181f59f4d1f0438a7c60babaf6230947edb387e09ed5c1e/contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab", size = 244158 }, + { url = "https://files.pythonhosted.org/packages/ec/56/7736333adc941087b0f86db37b0dffce83fd4e35400ab86ce1bf0690d04f/contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6", size = 229713 }, + { url = "https://files.pythonhosted.org/packages/8d/cc/c8e32001298b50331348312ac2a965279ddf1c20d25e68ca596fd8a7aaa2/contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803", size = 283714 }, + { url = "https://files.pythonhosted.org/packages/02/4d/009c25f6a3f27dab8fabd5e0f9eeb2bc2697bfcf533e9d07ee825d7fae22/contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8", size = 304684 }, + { url = "https://files.pythonhosted.org/packages/ec/59/5eac40e348a7bf803cea221bcd27f74a49cb81667b400fdfbb680e86e7bb/contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0", size = 300258 }, + { url = "https://files.pythonhosted.org/packages/31/d7/247a889a9c425197aeac5e31286f3050dee63aa3466c939aa302cdb2b6cb/contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6", size = 783119 }, + { url = "https://files.pythonhosted.org/packages/f2/de/7ddc513caca0e287434cd389855a5d2e185c22685fb1dc6789169dd858be/contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd", size = 868934 }, + { url = "https://files.pythonhosted.org/packages/82/5b/5eaf7098f38f1b98ed56993e87dd34a5c64e6abff6d4f11394ca2091e600/contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69", size = 811970 }, + { url = "https://files.pythonhosted.org/packages/cc/89/fae9ae6d8e9d1149bed7b0377a4ee77a40293bdd8b681212ab4af2c3fbb2/contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3", size = 143802 }, + { url = "https://files.pythonhosted.org/packages/b6/b8/6894c9e851f7442ebbc054537f56021c9ebc0691799ac4b92e380f3a2712/contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80", size = 162981 }, + { url = "https://files.pythonhosted.org/packages/a7/40/0aed6d92734ffad008a841b43723ca0216292df27b706de0afbf7a84dff4/contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71", size = 452995 }, + { url = "https://files.pythonhosted.org/packages/fa/56/ab73a8bab463df907ac2c2249bfee428900e2b88e28ccf5ab059c106e07c/contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5", size = 244201 }, + { url = "https://files.pythonhosted.org/packages/c4/27/90f82ec9667b3b4fceced99e11c3519879e949ecb74ff976567cf1e5ba7d/contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414", size = 229710 }, + { url = "https://files.pythonhosted.org/packages/03/a4/0119e530f7926377d283ed742b120ef5cf3f37f7c5aef5e77cfc59ebabfc/contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2", size = 284151 }, + { url = "https://files.pythonhosted.org/packages/d3/b1/e0151100124d28729622bf714462c76b2bce38e136215d9236863d130eb9/contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02", size = 304744 }, + { url = "https://files.pythonhosted.org/packages/b6/4b/18a8a0c4d4f935d3711fe1325d4f0b5277886bcef01ced6ecc45074c3f19/contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae", size = 299995 }, + { url = "https://files.pythonhosted.org/packages/b1/5e/9da7dd3f5916f63b7cacb5d13a2eff294b3041cfbae5bc296991df8aa784/contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc", size = 783117 }, + { url = "https://files.pythonhosted.org/packages/72/2e/4d50b842a8747776dcd172f9c19514800844d1e67dd1dfdb41c1f74a8b58/contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac", size = 868866 }, + { url = "https://files.pythonhosted.org/packages/09/c4/72ffdbea5f0f2a89e544b5e91793548488b892855c170f89f4b2d8d0597e/contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566", size = 811829 }, + { url = "https://files.pythonhosted.org/packages/33/2e/1338f7b7ba17815c00507d0ace2804e37eb85a8c340fd64da5e38690c6d1/contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0", size = 143635 }, + { url = "https://files.pythonhosted.org/packages/f3/a9/3640440269719283a250df109a7f91b48d657bf9c0ceb5fe950eb894ecf7/contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350", size = 162967 }, +] + +[[package]] +name = "cycler" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/45/a7caaacbfc2fa60bee42effc4bcc7d7c6dbe9c349500e04f65a861c15eb9/cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f", size = 18784 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/f9/695d6bedebd747e5eb0fe8fad57b72fdf25411273a39791cde838d5a8f51/cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", size = 6389 }, +] + +[[package]] +name = "datasets" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "dill" }, + { name = "fsspec", extra = ["http"] }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "responses" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/b5/14023d28948fb10e1e7224ad7abfbde870a3687c28573c07566028c03adc/datasets-2.10.1.tar.gz", hash = "sha256:e2764c90aa3af96450a9747a934b8893b121f79f58d89e123cb1a7046bb8e81e", size = 528594 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/17/5825fdf034ff1a315becdbb9b6fe5a2bd9d8e724464535f18809593bf9c2/datasets-2.10.1-py3-none-any.whl", hash = "sha256:bfde7253b31abfd075f9ad55961b13c135a5a9295cea04ae86c47b9c0e0466fd", size = 469037 }, +] + +[[package]] +name = "debugpy" +version = "1.6.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/b4/dee6aae40c3ff7a4c3b27f1611f64ab8570a07add5f82321414d9ced4fec/debugpy-1.6.6.zip", hash = "sha256:b9c2130e1c632540fbf9c2c88341493797ddf58016e7cba02e311de9b0a96b67", size = 4666432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/fe/1b1bb61a51c2dd83660c4f3ac685534a65197354be9abe6862c21f38d846/debugpy-1.6.6-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:0ea1011e94416e90fb3598cc3ef5e08b0a4dd6ce6b9b33ccd436c1dffc8cd664", size = 1713743 }, + { url = "https://files.pythonhosted.org/packages/1f/19/345c21f6b62acf556c39e4358a22b0ad868fecb462c1041c13513d229b33/debugpy-1.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dff595686178b0e75580c24d316aa45a8f4d56e2418063865c114eef651a982e", size = 3003128 }, + { url = "https://files.pythonhosted.org/packages/8e/dd/969b0a865c1b28de92cc30ba00aabdf1a2d76ab437b3d91674d504da83c2/debugpy-1.6.6-cp310-cp310-win32.whl", hash = "sha256:87755e173fcf2ec45f584bb9d61aa7686bb665d861b81faa366d59808bbd3494", size = 4809204 }, + { url = "https://files.pythonhosted.org/packages/d9/8c/8421813ae3e7354bb811a27537e446f4f178e234de446da26ae317c7d580/debugpy-1.6.6-cp310-cp310-win_amd64.whl", hash = "sha256:72687b62a54d9d9e3fb85e7a37ea67f0e803aaa31be700e61d2f3742a5683917", size = 4835715 }, + { url = "https://files.pythonhosted.org/packages/f9/35/325e53d2a75b28777c28e790f84ea1ee45e1ecc00ae76550a53872a541f9/debugpy-1.6.6-py2.py3-none-any.whl", hash = "sha256:be596b44448aac14eb3614248c91586e2bc1728e020e82ef3197189aae556115", size = 4871717 }, +] + +[[package]] +name = "decorator" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, +] + +[[package]] +name = "dill" +version = "0.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/e7/364a09134e1062d4d5ff69b853a56cf61c223e0afcc6906b6832bcd51ea8/dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373", size = 179026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0", size = 110515 }, +] + +[[package]] +name = "docker-pycreds" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/e6/d1f6c00b7221e2d7c4b470132c931325c8b22c51ca62417e300f5ce16009/docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", size = 8754 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/e8/f6bd1eee09314e7e6dee49cbe2c5e22314ccdb38db16c9fc72d2fa80d054/docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49", size = 8982 }, +] + +[[package]] +name = "entrypoints" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/8d/a7121ffe5f402dc015277d2d31eb82d2187334503a011c18f2e78ecbb9b2/entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4", size = 13974 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/a8/365059bbcd4572cbc41de17fd5b682be5868b218c3c5479071865cab9078/entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f", size = 5294 }, +] + +[[package]] +name = "executing" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/ac/89ff37d8594b0eef176b7cec742ac868fef853b8e18df0309e3def9f480b/executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107", size = 654544 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/3c/bc3819dd8b1a1588c9215a87271b6178cc5498acaa83885211f5d4d9e693/executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc", size = 24360 }, +] + +[[package]] +name = "fastapi" +version = "0.95.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/a0/122f89a38bb42260bc65ec37ebce40457ea0731a0949af43a4c7a6dbadfd/fastapi-0.95.0.tar.gz", hash = "sha256:99d4fdb10e9dd9a24027ac1d0bd4b56702652056ca17a6c8721eec4ad2f14e18", size = 9778574 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/91/5412a4c845d1b88cfded182b0e5553e3498a38e5a65a8e9b02e3aaf47dd5/fastapi-0.95.0-py3-none-any.whl", hash = "sha256:daf73bbe844180200be7966f68e8ec9fd8be57079dff1bacb366db32729e6eb5", size = 57062 }, +] + +[[package]] +name = "ffmpy" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/e2/947df4b3d666bfdd2b0c6355d215c45d2d40f929451cb29a8a2995b29788/ffmpy-0.3.0.tar.gz", hash = "sha256:757591581eee25b4a50ac9ffb9b58035a2794533db47e0512f53fb2d7b6f9adc", size = 4841 } + +[[package]] +name = "filelock" +version = "3.10.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/65/5dfde43d5e4d7d31a2392bf4aa20e464b8aa0601f34fd9b050781291f666/filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105", size = 10481 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/89/3c51e2896bf666fdda7e776f3421f1bfec843c34311c0a3486c90452a04d/filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536", size = 10045 }, +] + +[[package]] +name = "fire" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, + { name = "termcolor" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/ed/3b9a10605163f48517931083aee8364d4d6d3bb1aa9b75eb0a4a5e9fbfc1/fire-0.5.0.tar.gz", hash = "sha256:a6b0d49e98c8963910021f92bba66f65ab440da2982b78eb1bbf95a0a34aacc6", size = 88282 } + +[[package]] +name = "fonttools" +version = "4.39.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/d7/ab05ae34dd57dd657e492d95ce7ec6bfebfb3bfcdc7316660ac5a13fcfee/fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7", size = 5187265 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/07/1c7547e27f559ec078801d522cc4d5127cdd4ef8e831c8ddcd9584668a07/fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb", size = 1009099 }, +] + +[[package]] +name = "frozenlist" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/10/d629476346112b85c912527b9080944fd2c39a816c2225413dbc0bb6fcc0/frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a", size = 66571 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/08/2e192aa0a8e4741da0284559e983d22f02d12ca2cc18598948b99414c4b6/frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4", size = 61164 }, + { url = "https://files.pythonhosted.org/packages/d7/4c/ada057ae7c93a60239945b9ef1ed1ad0a01fcdb7924e93efeb9932391768/frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0", size = 35975 }, + { url = "https://files.pythonhosted.org/packages/23/2f/2f2b21b5c45bdd17d4ea40648a9681a8a1fd32d4d50e56f77fb8fff6cb97/frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530", size = 34534 }, + { url = "https://files.pythonhosted.org/packages/9f/89/6e073bbc2f48acbba807a30c09908408f556ba4c488bd3ff5be8e5cf0818/frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7", size = 148133 }, + { url = "https://files.pythonhosted.org/packages/41/f1/03124919e61f2e46a13d51ccc5148fee54a80a5cb18b0e7a638e955d9705/frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99", size = 155019 }, + { url = "https://files.pythonhosted.org/packages/df/a5/34eb83e73106b056454b6dee05d736ae462671e813212bfee2241f554f1b/frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483", size = 151686 }, + { url = "https://files.pythonhosted.org/packages/33/73/1dcadea68aaa904c9278f67e334bb88591c05a52a122536c41021d2a9ff5/frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd", size = 142308 }, + { url = "https://files.pythonhosted.org/packages/49/0e/c57ad9178618cf81be0fbb8430f17cf05423403143819d3631c7c09744c2/frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf", size = 149571 }, + { url = "https://files.pythonhosted.org/packages/fd/b8/9ed4ed37b2c3269660a86a10a09b2fe49dbbd6973ac684804ece7b51b63f/frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816", size = 151599 }, + { url = "https://files.pythonhosted.org/packages/d2/fb/7421f3af6932d34a5856742324cda86a3434601eec5852cf62bfcea0c4a8/frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0", size = 145468 }, + { url = "https://files.pythonhosted.org/packages/d4/8a/5dc2e402311f67f6e8e76a01fd506d85ead034bf6e06c44c08e293deebcb/frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce", size = 157687 }, + { url = "https://files.pythonhosted.org/packages/bd/06/5184652df91c1948393bcb7978b7bdaca731b3201bbae2e8597136cdaba1/frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f", size = 155482 }, + { url = "https://files.pythonhosted.org/packages/2b/64/cc02fb54dd400fb33e5a4318debbcc38558f0fdbb97de77c0c51ee94122e/frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420", size = 152497 }, + { url = "https://files.pythonhosted.org/packages/8d/0a/33cf0eef25ea53faf75e3f8992a9a9c25a00a7c02fcfb7221e1d6a40b771/frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642", size = 30595 }, + { url = "https://files.pythonhosted.org/packages/39/29/1b35650abaea3ad54a031757645e2f8a5d2b5971bf94b7cde4daebbdbb47/frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1", size = 33309 }, + { url = "https://files.pythonhosted.org/packages/2d/39/82eb234c1a80c4d2d7b071173d7b01f79e93f285d072f4370b019849c9b4/frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7", size = 60735 }, + { url = "https://files.pythonhosted.org/packages/58/d2/2a991a3f49054f51e7cf30c4f5ce6f9fcd6df0fcf781db46d5af8d0c24ad/frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678", size = 35840 }, + { url = "https://files.pythonhosted.org/packages/09/cf/3a150d94c772a44cfc83fb1fcd5c59164047c00d20490ebcc33105bda39a/frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6", size = 34289 }, + { url = "https://files.pythonhosted.org/packages/01/a3/a3c18bfd7bd2a56831b985140f98eb6dda684a2d8b2a54b1077b45c7f9d9/frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8", size = 153264 }, + { url = "https://files.pythonhosted.org/packages/a9/3a/f5905a1a9eaff25745f3eeb25ecb6ba4d3be101ad6fa3e6d3d084f18dc2d/frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb", size = 159371 }, + { url = "https://files.pythonhosted.org/packages/fa/a1/d0822eb2f827f209c8fcf19ff1c9eb30ae08e25b710cf432b1013ea23429/frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91", size = 157191 }, + { url = "https://files.pythonhosted.org/packages/13/40/0d0ff24ac7289fc7af004df73e6a06e0e90fca88ca6e515bf61b06905df7/frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b", size = 145856 }, + { url = "https://files.pythonhosted.org/packages/f1/bc/fbd3300dc8219a7de5d2b6b4e0fff4b884da66046c15bb223696c0c05aa0/frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4", size = 154331 }, + { url = "https://files.pythonhosted.org/packages/51/1b/1d6dc83f1b30e6bbbf062d5df60037b954c7cd9f3cdb21d1e603bfcca819/frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48", size = 154699 }, + { url = "https://files.pythonhosted.org/packages/7f/0b/0309aaa07910bdde804decf6827883feadcec55146e3c0e708758c74b406/frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d", size = 147699 }, + { url = "https://files.pythonhosted.org/packages/60/45/14e6898edb6872c64014b432cf2f5408ffd317e72ee2b29426303bbc66e2/frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6", size = 160515 }, + { url = "https://files.pythonhosted.org/packages/c9/cb/d62c14c4354fdd593182efe25af33af086a54126a518dba0f9496fdbed89/frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4", size = 158812 }, + { url = "https://files.pythonhosted.org/packages/55/71/5fb91c250a1fa82a38f8b1ce2b3016f44b1c210c4d0c4b2e39c7e53e42b7/frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81", size = 155396 }, + { url = "https://files.pythonhosted.org/packages/da/38/06f3d82def80a49390b148414f19c23ae9c2920033ac0bad8f7c5cab494a/frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8", size = 30359 }, + { url = "https://files.pythonhosted.org/packages/30/d5/6fdf60f2a3af80dd824357d70d06f13e8c1c756eec2778b66dca4e28a3da/frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32", size = 32639 }, +] + +[[package]] +name = "fsspec" +version = "2023.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/8f/f5956204717fd12010a27d8b9deb0d32cb19049e92ac2dc8e8439d06bff1/fsspec-2023.3.0.tar.gz", hash = "sha256:24e635549a590d74c6c18274ddd3ffab4753341753e923408b1904eaabafe04d", size = 145439 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/65/887925f1549fcb6ac3abb23a747c10f5ab083e8471fe568768b18bdb15b2/fsspec-2023.3.0-py3-none-any.whl", hash = "sha256:bf57215e19dbfa4fe7edae53040cc1deef825e3b1605cca9a8d2c2fadd2328a0", size = 145407 }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, + { name = "requests" }, +] + +[[package]] +name = "gitdb" +version = "4.0.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/47/dc98f3d5d48aa815770e31490893b92c5f1cd6c6cf28dd3a8ae0efffac14/gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a", size = 394284 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/a6/35f83efec687615c711fe0a09b67e58f6d1254db27b1013119de46f450bd/gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7", size = 62735 }, +] + +[[package]] +name = "gitpython" +version = "3.1.31" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/11/2b0f60686dbda49028cec8c66bd18a5e82c96d92eef4bc34961e35bb3762/GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573", size = 195822 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/8a/d1e02cc111d65b0346f70abb83c51f8593e7134bf694a4a56d1a470caaf7/GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d", size = 184332 }, +] + +[[package]] +name = "gradio" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "aiohttp" }, + { name = "altair" }, + { name = "fastapi" }, + { name = "ffmpy" }, + { name = "fsspec" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "jinja2" }, + { name = "markdown-it-py", extra = ["linkify"] }, + { name = "markupsafe" }, + { name = "matplotlib" }, + { name = "mdit-py-plugins" }, + { name = "numpy" }, + { name = "orjson" }, + { name = "pandas" }, + { name = "pillow" }, + { name = "pydantic" }, + { name = "pydub" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "semantic-version" }, + { name = "typing-extensions" }, + { name = "uvicorn" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/5d/e06e1de0ed16783bc55ee78d0fab710658beb42eb51b3c2fd3dfcb59fad4/gradio-3.23.0.tar.gz", hash = "sha256:bfb9f59d799271029e6309207c7f42ed8adb297dcb8bbe31c83c3ebf32dbe193", size = 16536726 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/78/aff7c2d3c39a5b242c43f3be9cde2b19c600544a6a47e90fa81bd819ee44/gradio-3.23.0-py3-none-any.whl", hash = "sha256:1f637f80e4b740892c3cc5ec559158afe2b6b97f0a18eca588c235ddedddc7ec", size = 15777597 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "0.16.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "h11" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/42/5c456b02816845d163fab0f32936b6a5b649f3f915beff6f819f4f6c90b2/httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb", size = 54929 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/7e/ef97af4623024e8159993b3114ce208de4f677098ae058ec5882a1bf7605/httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0", size = 69561 }, +] + +[[package]] +name = "httpx" +version = "0.23.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "httpcore" }, + { name = "rfc3986", extra = ["idna2008"] }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/50/04d5e8ee398a10c767a341a25f59ff8711ae3adf0143c7f8b45fc560d72d/httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9", size = 77527 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/a2/0260c0f5d73bdf06e8d3fc1013a82b9f0633dc21750c9e3f3cb1dba7bb8c/httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6", size = 71472 }, +] + +[[package]] +name = "huggingface-hub" +version = "0.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/c6/bc3e71647d0fcc757eb04fe2e5ea70fe6394cf3b21159f268f5a10cb805b/huggingface_hub-0.13.3.tar.gz", hash = "sha256:1f95f65c5e7aa76728701402f55b697ee8a8b50234adda91fbdbb81038fbcd21", size = 169688 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/f3/15bb83b510b26b97888b111ae3faa61fee1a5de2f922dbfbd4f72ccc675e/huggingface_hub-0.13.3-py3-none-any.whl", hash = "sha256:f73a298a55028575334f9670d86b8171a4dd890b320315f3ad28a20b9eb3b5bc", size = 199834 }, +] + +[[package]] +name = "idna" +version = "3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/e1/43beb3d38dba6cb420cefa297822eac205a277ab43e5ba5d5c46faf96438/idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", size = 183077 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", size = 61538 }, +] + +[[package]] +name = "ilora" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "accelerate" }, + { name = "aiofiles" }, + { name = "aiohttp" }, + { name = "aiosignal" }, + { name = "altair" }, + { name = "anyio" }, + { name = "appdirs" }, + { name = "asttokens" }, + { name = "async-timeout" }, + { name = "attrs" }, + { name = "backcall" }, + { name = "backports-functools-lru-cache" }, + { name = "bitsandbytes" }, + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "cmake" }, + { name = "comm" }, + { name = "contourpy" }, + { name = "cycler" }, + { name = "datasets" }, + { name = "debugpy" }, + { name = "decorator" }, + { name = "dill" }, + { name = "entrypoints" }, + { name = "executing" }, + { name = "fastapi" }, + { name = "ffmpy" }, + { name = "filelock" }, + { name = "fire" }, + { name = "fonttools" }, + { name = "frozenlist" }, + { name = "fsspec" }, + { name = "gitdb" }, + { name = "gitpython" }, + { name = "gradio" }, + { name = "h11" }, + { name = "httpcore" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "idna" }, + { name = "importlib-metadata" }, + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jedi" }, + { name = "jinja2" }, + { name = "joblib" }, + { name = "jsonschema" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "kiwisolver" }, + { name = "linkify-it-py" }, + { name = "lit" }, + { name = "markdown-it-py" }, + { name = "markupsafe" }, + { name = "matplotlib" }, + { name = "matplotlib-inline" }, + { name = "mdit-py-plugins" }, + { name = "mdurl" }, + { name = "mpmath" }, + { name = "multidict" }, + { name = "multiprocess" }, + { name = "nest-asyncio" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "nvidia-cublas-cu11" }, + { name = "nvidia-cuda-cupti-cu11" }, + { name = "nvidia-cuda-nvrtc-cu11" }, + { name = "nvidia-cuda-runtime-cu11" }, + { name = "nvidia-cudnn-cu11" }, + { name = "nvidia-cufft-cu11" }, + { name = "nvidia-curand-cu11" }, + { name = "nvidia-cusolver-cu11" }, + { name = "nvidia-cusparse-cu11" }, + { name = "nvidia-nccl-cu11" }, + { name = "nvidia-nvtx-cu11" }, + { name = "orjson" }, + { name = "pandas" }, + { name = "parso" }, + { name = "pathspec" }, + { name = "pathtools" }, + { name = "peft" }, + { name = "pexpect" }, + { name = "pickleshare" }, + { name = "pillow" }, + { name = "prompt-toolkit" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "ptyprocess" }, + { name = "pure-eval" }, + { name = "pyarrow" }, + { name = "pydantic" }, + { name = "pydub" }, + { name = "pygments" }, + { name = "pyparsing" }, + { name = "pyrsistent" }, + { name = "python-dateutil" }, + { name = "python-multipart" }, + { name = "pytorch-lightning" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "pyzmq" }, + { name = "regex" }, + { name = "requests" }, + { name = "responses" }, + { name = "rfc3986" }, + { name = "safetensors" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "seaborn" }, + { name = "semantic-version" }, + { name = "sentencepiece" }, + { name = "sentry-sdk" }, + { name = "setproctitle" }, + { name = "setuptools" }, + { name = "six" }, + { name = "smmap" }, + { name = "sniffio" }, + { name = "stack-data" }, + { name = "starlette" }, + { name = "sympy" }, + { name = "termcolor" }, + { name = "threadpoolctl" }, + { name = "tokenize-rt" }, + { name = "tokenizers" }, + { name = "toolz" }, + { name = "torch" }, + { name = "tornado" }, + { name = "tqdm" }, + { name = "traitlets" }, + { name = "transformers" }, + { name = "triton" }, + { name = "typing-extensions" }, + { name = "uc-micro-py" }, + { name = "urllib3" }, + { name = "uvicorn" }, + { name = "wandb" }, + { name = "wcwidth" }, + { name = "wheel" }, + { name = "xxhash" }, + { name = "yarl" }, +] + +[package.metadata] +requires-dist = [ + { name = "accelerate", specifier = "==0.18.0" }, + { name = "aiofiles", specifier = "==23.1.0" }, + { name = "aiohttp", specifier = "==3.8.4" }, + { name = "aiosignal", specifier = "==1.3.1" }, + { name = "altair", specifier = "==4.2.2" }, + { name = "anyio", specifier = "==3.6.2" }, + { name = "appdirs", specifier = "==1.4.4" }, + { name = "asttokens", specifier = "==2.2.1" }, + { name = "async-timeout", specifier = "==4.0.2" }, + { name = "attrs", specifier = "==22.2.0" }, + { name = "backcall", specifier = "==0.2.0" }, + { name = "backports-functools-lru-cache", specifier = "==1.6.5" }, + { name = "bitsandbytes", specifier = "==0.44.0" }, + { name = "certifi", specifier = "==2023.7.22" }, + { name = "charset-normalizer", specifier = "==3.1.0" }, + { name = "cmake", specifier = "==3.26.1" }, + { name = "comm", specifier = "==0.1.3" }, + { name = "contourpy", specifier = "==1.0.7" }, + { name = "cycler", specifier = "==0.11.0" }, + { name = "datasets", specifier = "==2.10.1" }, + { name = "debugpy", specifier = "==1.6.6" }, + { name = "decorator", specifier = "==5.1.1" }, + { name = "dill", specifier = "==0.3.6" }, + { name = "entrypoints", specifier = "==0.4" }, + { name = "executing", specifier = "==1.2.0" }, + { name = "fastapi", specifier = "==0.95.0" }, + { name = "ffmpy", specifier = "==0.3.0" }, + { name = "filelock", specifier = "==3.10.7" }, + { name = "fire", specifier = "==0.5.0" }, + { name = "fonttools", specifier = "==4.39.3" }, + { name = "frozenlist", specifier = "==1.3.3" }, + { name = "fsspec", specifier = "==2023.3.0" }, + { name = "gitdb", specifier = "==4.0.10" }, + { name = "gitpython", specifier = "==3.1.31" }, + { name = "gradio", specifier = "==3.23.0" }, + { name = "h11", specifier = "==0.14.0" }, + { name = "httpcore", specifier = "==0.16.3" }, + { name = "httpx", specifier = "==0.23.3" }, + { name = "huggingface-hub", specifier = "==0.13.3" }, + { name = "idna", specifier = "==3.4" }, + { name = "importlib-metadata", specifier = "==6.8.0" }, + { name = "ipykernel", specifier = "==6.22.0" }, + { name = "ipython", specifier = "==8.11.0" }, + { name = "jedi", specifier = "==0.18.2" }, + { name = "jinja2", specifier = "==3.1.2" }, + { name = "joblib", specifier = "==1.2.0" }, + { name = "jsonschema", specifier = "==4.17.3" }, + { name = "jupyter-client", specifier = "==8.1.0" }, + { name = "jupyter-core", specifier = "==5.3.0" }, + { name = "kiwisolver", specifier = "==1.4.4" }, + { name = "linkify-it-py", specifier = "==2.0.0" }, + { name = "lit", specifier = "==16.0.0" }, + { name = "markdown-it-py", specifier = "==2.2.0" }, + { name = "markupsafe", specifier = "==2.1.2" }, + { name = "matplotlib", specifier = "==3.7.1" }, + { name = "matplotlib-inline", specifier = "==0.1.6" }, + { name = "mdit-py-plugins", specifier = "==0.3.3" }, + { name = "mdurl", specifier = "==0.1.2" }, + { name = "mpmath", specifier = "==1.3.0" }, + { name = "multidict", specifier = "==6.0.4" }, + { name = "multiprocess", specifier = "==0.70.14" }, + { name = "nest-asyncio", specifier = "==1.5.6" }, + { name = "networkx", specifier = "==3.0" }, + { name = "numpy", specifier = "==1.24.2" }, + { name = "nvidia-cublas-cu11", specifier = "==11.10.3.66" }, + { name = "nvidia-cuda-cupti-cu11", specifier = "==11.7.101" }, + { name = "nvidia-cuda-nvrtc-cu11", specifier = "==11.7.99" }, + { name = "nvidia-cuda-runtime-cu11", specifier = "==11.7.99" }, + { name = "nvidia-cudnn-cu11", specifier = "==8.5.0.96" }, + { name = "nvidia-cufft-cu11", specifier = "==10.9.0.58" }, + { name = "nvidia-curand-cu11", specifier = "==10.2.10.91" }, + { name = "nvidia-cusolver-cu11", specifier = "==11.4.0.1" }, + { name = "nvidia-cusparse-cu11", specifier = "==11.7.4.91" }, + { name = "nvidia-nccl-cu11", specifier = "==2.14.3" }, + { name = "nvidia-nvtx-cu11", specifier = "==11.7.91" }, + { name = "orjson", specifier = "==3.8.9" }, + { name = "pandas", specifier = "==1.5.3" }, + { name = "parso", specifier = "==0.8.3" }, + { name = "pathspec", specifier = "==0.11.1" }, + { name = "pathtools", specifier = "==0.1.2" }, + { name = "peft", specifier = "==0.3.0" }, + { name = "pexpect", specifier = "==4.8.0" }, + { name = "pickleshare", specifier = "==0.7.5" }, + { name = "pillow", specifier = "==9.4.0" }, + { name = "prompt-toolkit", specifier = "==3.0.38" }, + { name = "protobuf", specifier = "==4.22.1" }, + { name = "psutil", specifier = "==5.9.4" }, + { name = "ptyprocess", specifier = "==0.7.0" }, + { name = "pure-eval", specifier = "==0.2.2" }, + { name = "pyarrow", specifier = "==11.0.0" }, + { name = "pydantic", specifier = "==1.10.7" }, + { name = "pydub", specifier = "==0.25.1" }, + { name = "pygments", specifier = "==2.14.0" }, + { name = "pyparsing", specifier = "==3.0.9" }, + { name = "pyrsistent", specifier = "==0.19.3" }, + { name = "python-dateutil", specifier = "==2.8.2" }, + { name = "python-multipart", specifier = "==0.0.6" }, + { name = "pytorch-lightning", specifier = "==1.8.6" }, + { name = "pytz", specifier = "==2023.3" }, + { name = "pyyaml", specifier = "==6.0" }, + { name = "pyzmq", specifier = "==25.0.2" }, + { name = "regex", specifier = "==2023.3.23" }, + { name = "requests", specifier = "==2.28.2" }, + { name = "responses", specifier = "==0.18.0" }, + { name = "rfc3986", specifier = "==1.5.0" }, + { name = "safetensors", specifier = ">=0.5.3" }, + { name = "scikit-learn", specifier = "==1.2.2" }, + { name = "scipy", specifier = "==1.10.1" }, + { name = "seaborn", specifier = "==0.12.2" }, + { name = "semantic-version", specifier = "==2.10.0" }, + { name = "sentencepiece", specifier = "==0.1.97" }, + { name = "sentry-sdk", specifier = "==1.19.1" }, + { name = "setproctitle", specifier = "==1.3.2" }, + { name = "setuptools", specifier = "==68.1.2" }, + { name = "six", specifier = "==1.16.0" }, + { name = "smmap", specifier = "==5.0.0" }, + { name = "sniffio", specifier = "==1.3.0" }, + { name = "stack-data", specifier = "==0.6.2" }, + { name = "starlette", specifier = "==0.26.1" }, + { name = "sympy", specifier = "==1.11.1" }, + { name = "termcolor", specifier = "==2.2.0" }, + { name = "threadpoolctl", specifier = "==3.1.0" }, + { name = "tokenize-rt", specifier = "==5.0.0" }, + { name = "tokenizers", specifier = "==0.13.2" }, + { name = "toolz", specifier = "==0.12.0" }, + { name = "torch", specifier = "==2.0.0" }, + { name = "tornado", specifier = "==6.2" }, + { name = "tqdm", specifier = "==4.65.0" }, + { name = "traitlets", specifier = "==5.9.0" }, + { name = "transformers", specifier = "==4.28.0" }, + { name = "triton", specifier = "==2.0.0" }, + { name = "typing-extensions", specifier = "==4.5.0" }, + { name = "uc-micro-py", specifier = "==1.0.1" }, + { name = "urllib3", specifier = "==1.26.15" }, + { name = "uvicorn", specifier = "==0.21.1" }, + { name = "wandb", specifier = "==0.14.1" }, + { name = "wcwidth", specifier = "==0.2.6" }, + { name = "wheel", specifier = "==0.41.2" }, + { name = "xxhash", specifier = "==3.2.0" }, + { name = "yarl", specifier = "==1.8.2" }, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/44/ae06b446b8d8263d712a211e959212083a5eda2bf36d57ca7415e03f6f36/importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743", size = 53494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", size = 22933 }, +] + +[[package]] +name = "ipykernel" +version = "6.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/18/a773c8f970269988c56678c7b8739b106c5557e419864481c90949db3754/ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421", size = 151303 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/1b/260b3e4d2f633c1c9019e25a977a9e82341d0713ad8fb60e01b97b7559a4/ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6", size = 149991 }, +] + +[[package]] +name = "ipython" +version = "8.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "backcall" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'win32'" }, + { name = "pickleshare" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/e1/7c277c1dd0b0520bf07070c3921ff1986a2eb3db704ad91f0ac46fb42d8f/ipython-8.11.0.tar.gz", hash = "sha256:735cede4099dbc903ee540307b9171fbfef4aa75cfcacc5a273b2cda2f02be04", size = 5462176 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/91/23e08c442657cf493598b0222008437c9e0aef0709a8fd65a5d5d68ffa21/ipython-8.11.0-py3-none-any.whl", hash = "sha256:5b54478e459155a326bf5f42ee4f29df76258c0279c36f21d71ddb560f88b156", size = 793316 }, +] + +[[package]] +name = "jedi" +version = "0.18.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/02/afd43c5066de05f6b3188f3aa74136a3289e6c30e7a45f351546cab0928c/jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612", size = 1225011 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/60/4acda63286ef6023515eb914543ba36496b8929cb7af49ecce63afde09c6/jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e", size = 1568138 }, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/ff/75c28576a1d900e87eb6335b063fab47a8ef3c8b4d88524c4bf78f670cce/Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", size = 268239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61", size = 133101 }, +] + +[[package]] +name = "joblib" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dd/a5435a6902d6315241c48a5343e6e6675b007e05d3738ed97a7a47864e53/joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018", size = 313200 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/d4/3b4c8e5a30604df4c7518c562d4bf0502f2fa29221459226e140cf846512/joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385", size = 297969 }, +] + +[[package]] +name = "jsonschema" +version = "4.17.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "pyrsistent" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/3d/ca032d5ac064dff543aa13c984737795ac81abc9fb130cd2fcff17cfabc7/jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", size = 297785 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/97/c698bd9350f307daad79dd740806e1a59becd693bd11443a0f531e3229b3/jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6", size = 90379 }, +] + +[[package]] +name = "jupyter-client" +version = "8.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/3d/a65f5f54ebaa2ad32eec08fc8ba471608dbb4a0cb0e91dc8d58ac3bdc3d4/jupyter_client-8.1.0.tar.gz", hash = "sha256:3fbab64100a0dcac7701b1e0f1a4412f1ccb45546ff2ad9bc4fcbe4e19804811", size = 335241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/6c/96771d6b3ce94da927f7688be821899f169306f16023dd0af5ef55f71a52/jupyter_client-8.1.0-py3-none-any.whl", hash = "sha256:d5b8e739d7816944be50f81121a109788a3d92732ecf1ad1e4dadebc948818fe", size = 102943 }, +] + +[[package]] +name = "jupyter-core" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/d3/b80e7179e9615f5a7f055edc55eb665fa2534f11a4599349db3bab6fdeb5/jupyter_core-5.3.0.tar.gz", hash = "sha256:6db75be0c83edbf1b7c9f91ec266a9a24ef945da630f3120e1a0046dc13713fc", size = 83909 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/1e/92a67f333b9335f04ce409799c030dcfb291712658b9d9d13997f7c91e5a/jupyter_core-5.3.0-py3-none-any.whl", hash = "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d", size = 93205 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/5c/272a7dd49a1914f35cd8d6d9f386defa8b047f6fbd06badd6b77b3ba24e7/kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955", size = 97093 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/b7/f6386940bec20b842a097697a0396a0941cbc5262d4b619dee2cc123502b/kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6", size = 121891 }, + { url = "https://files.pythonhosted.org/packages/eb/db/b7ebaa2d35f9fb55f3ff8328b5e9dc049f6524dca737cea13e6235ab191d/kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c", size = 65475 }, + { url = "https://files.pythonhosted.org/packages/ee/c2/99b2d61dc246844498e68571c589e37ed7a866a4914cb2da2d66d141b596/kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3", size = 63227 }, + { url = "https://files.pythonhosted.org/packages/a9/fd/049c39c4c501775f5439ba8e08bf298d5af828b99c703e265c5150311ccd/kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938", size = 1635046 }, + { url = "https://files.pythonhosted.org/packages/79/0f/5cc4ca3df66c49817944b9a1c7343ba70aefffc868ddf651d7839cc5dffd/kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d", size = 1617970 }, + { url = "https://files.pythonhosted.org/packages/c7/cf/40d5c5d4f91b2d5cb3aadad9a1074964749a19e1054cef3d491cfa73a25e/kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09", size = 1399184 }, + { url = "https://files.pythonhosted.org/packages/cb/56/a7c407d437f82eb92954b618bbc71af28a3d88634901f69500d186209a85/kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de", size = 1511139 }, + { url = "https://files.pythonhosted.org/packages/b7/e0/ee57a00f6bf411e54cf0521eceab306d1c606c5a640ee1b54951d2bd41b7/kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32", size = 1415539 }, + { url = "https://files.pythonhosted.org/packages/cf/93/52792dd319af16897c248e5e053a806ef83648212e66ec3738aaf7238094/kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408", size = 45855 }, + { url = "https://files.pythonhosted.org/packages/68/20/2ce1186ef4edf47281faf58f6dd72a1fcd2be1fc66514bd2d220097bdcd1/kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004", size = 55263 }, + { url = "https://files.pythonhosted.org/packages/ed/bf/7994af5c838c761b4998044dfabecce8c9f428479e32fe77edc7336dcfd2/kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6", size = 121811 }, + { url = "https://files.pythonhosted.org/packages/b7/9d/b9d5c0412d46defef863f365b8ab8817b660e1f05385c0ed670deab0aa49/kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2", size = 65479 }, + { url = "https://files.pythonhosted.org/packages/89/84/b63b6ada3b349605cf97e28b71bdf37dbf74207c5c56e0a03e583226edc0/kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca", size = 63121 }, + { url = "https://files.pythonhosted.org/packages/70/85/2c6f6c2de0820c97d49ffa7e183ace21f02a683cd0d6fa98f58762e597f6/kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69", size = 1332632 }, + { url = "https://files.pythonhosted.org/packages/43/67/634a9c3854e4f908ff5ffd48ea51b1ca3e096ce79ffdd91ebdcd07d6d64b/kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514", size = 1425065 }, + { url = "https://files.pythonhosted.org/packages/ae/a1/5259f35063488465c433ddf70b000ba8eff024093849934b09d3bdc8fb2a/kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494", size = 1539355 }, + { url = "https://files.pythonhosted.org/packages/92/be/d8b1ff785ef6ab899e6934e3e458580761beb561727ece19f83f96767de6/kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5", size = 1468895 }, + { url = "https://files.pythonhosted.org/packages/ac/e6/823a136cefcf0592338827f54cb73642c2ea580acd8a7d5dbf8f32437848/kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51", size = 1424584 }, + { url = "https://files.pythonhosted.org/packages/78/df/13ab40e58fa093243f9732cfe2880fc84cee6963f75a889789a682bc1c50/kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da", size = 1846284 }, + { url = "https://files.pythonhosted.org/packages/48/36/b8605e1559c97522950658302fd7371affac055c554d45ba1c4665b29724/kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4", size = 1946287 }, + { url = "https://files.pythonhosted.org/packages/cb/ab/a94286c03f19851cfabeba28dde406ba29ca048d77d3342f7699268af649/kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626", size = 1900425 }, + { url = "https://files.pythonhosted.org/packages/c5/52/3f96b6761fc70fb3e2fc8189fc1bc1ced3350321e6690189a1b3c6463bc8/kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750", size = 1852588 }, + { url = "https://files.pythonhosted.org/packages/69/6c/8597155d3755337c7e39a7aaf54a07de0ad2572b109d904aeb70b4ab6f36/kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4", size = 1869687 }, + { url = "https://files.pythonhosted.org/packages/96/61/79804e00f7e8b5c54f5fce84740896a18142b5e85152c44d565c0d763f05/kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e", size = 45854 }, + { url = "https://files.pythonhosted.org/packages/63/33/a52b723c5e6f1a7b0d73d68761f05ba217519da3ec264ef32dbead9e68ec/kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686", size = 55395 }, +] + +[[package]] +name = "lightning-utilities" +version = "0.11.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "setuptools" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/ab/0c421d19e316420a2d54a2da5ae4a4dcd557928ccf7953dbbe4b4eee34d6/lightning_utilities-0.11.8.tar.gz", hash = "sha256:8dfbdc6c52f9847efc948dc462ab8bebb4f4e9a43bd69c82c1b1da484dac20e6", size = 28614 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/5d/4c4672025c23a305231a81bf492f65aa3ea0965a89f9ca369a9ee7d47fd9/lightning_utilities-0.11.8-py3-none-any.whl", hash = "sha256:a57edb34a44258f0c61eed8b8b88926766e9052f5e60bbe69e4871a2b2bfd970", size = 26816 }, +] + +[[package]] +name = "linkify-it-py" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "uc-micro-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/8d/abb58e1ed268d5ef787bf95c7e42d0f95f3aa7f9cd41ff990c25fcc8ed0c/linkify-it-py-2.0.0.tar.gz", hash = "sha256:476464480906bed8b2fa3813bf55566282e55214ad7e41b7d1c2b564666caf2f", size = 23060 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/1a/2280e2eb892162ef5c0480a131d1d176b61f5f24abdce8dd9862454f7d14/linkify_it_py-2.0.0-py3-none-any.whl", hash = "sha256:1bff43823e24e507a099e328fc54696124423dd6320c75a9da45b4b754b748ad", size = 19752 }, +] + +[[package]] +name = "lit" +version = "16.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/d8/acc8162b58aa44e899f6d4a4607650290624db71564e9b168716900510af/lit-16.0.0.tar.gz", hash = "sha256:3c4ac372122a1de4a88deb277b956f91b7209420a0bef683b1ab2d2b16dabe11", size = 144969 } + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/c0/59bd6d0571986f72899288a95d9d6178d0eebd70b6650f1bb3f0da90f8f7/markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1", size = 67120 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/25/2d88e8feee8e055d015343f9b86e370a1ccbec546f2865c98397aaef24af/markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30", size = 84466 }, +] + +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py" }, +] + +[[package]] +name = "markupsafe" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/7e/68018b70268fb4a2a605e2be44ab7b4dd7ce7808adae6c5ef32e34f4b55a/MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d", size = 19080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/b2/6f4d5cac75ba6fe9f17671304fe339ea45a73c5609b5f5e652aa79c915c8/MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7", size = 17750 }, + { url = "https://files.pythonhosted.org/packages/34/19/64b0abc021b22766e86efee32b0e2af684c4b731ce8ac1d519c791800c13/MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036", size = 13620 }, + { url = "https://files.pythonhosted.org/packages/5e/f6/8eb8a5692c1986b6e863877b0b8a83628aff14e5fbfaf11d9522b532bd9d/MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1", size = 26398 }, + { url = "https://files.pythonhosted.org/packages/3d/66/2f636ba803fd6eb4cee7b3106ae02538d1e84a7fb7f4f8775c6528a87d31/MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323", size = 25592 }, + { url = "https://files.pythonhosted.org/packages/30/3e/0a69a24adb38df83e2f6989c38d68627a5f27181c82ecaa1fd03d1236dca/MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601", size = 25264 }, + { url = "https://files.pythonhosted.org/packages/93/ca/1c3ae0c6a5712d4ba98610cada03781ea0448436b17d1dcd4759115b15a1/MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1", size = 30404 }, + { url = "https://files.pythonhosted.org/packages/96/92/a873b4a7fa20c2e30bffe883bb560330f3b6ce03aaf278f75f96d161935b/MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff", size = 29517 }, + { url = "https://files.pythonhosted.org/packages/f9/aa/ebcd114deab08f892b1d70badda4436dbad1747f9e5b72cffb3de4c7129d/MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65", size = 29799 }, + { url = "https://files.pythonhosted.org/packages/78/e6/91c9a20a943ea231c59024e181c4c5480097daf132428f2272670974637f/MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603", size = 16424 }, + { url = "https://files.pythonhosted.org/packages/02/2c/18d55e5df6a9ea33709d6c33e08cb2e07d39e20ad05d8c6fbf9c9bcafd54/MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156", size = 16981 }, + { url = "https://files.pythonhosted.org/packages/e3/a9/e366665c7eae59c9c9d34b747cd5a3994847719a2304e0c8dec8b604dd98/MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013", size = 17765 }, + { url = "https://files.pythonhosted.org/packages/e6/ff/d2378ca3cb3ac4a37af767b820b0f0bf3f5e9193a6acce0eefc379425c1c/MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a", size = 13638 }, + { url = "https://files.pythonhosted.org/packages/0a/88/78cb3d95afebd183d8b04442685ab4c70cfc1138b850ba20e2a07aff2f53/MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd", size = 28791 }, + { url = "https://files.pythonhosted.org/packages/5a/94/d056bf5dbadf7f4b193ee2a132b3d49ffa1602371e3847518b2982045425/MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6", size = 27993 }, + { url = "https://files.pythonhosted.org/packages/79/e2/b818bf277fa6b01244943498cb2127372c01dde5eff7682837cc72740618/MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d", size = 27531 }, + { url = "https://files.pythonhosted.org/packages/cf/c1/d7596976a868fe3487212a382cc121358a53dc8e8d85ff2ee2c3d3b40f04/MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1", size = 33766 }, + { url = "https://files.pythonhosted.org/packages/04/cf/9464c3c41b7cdb8df660cda75676697e7fb49ce1be7691a1162fc88da078/MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc", size = 32493 }, + { url = "https://files.pythonhosted.org/packages/1f/20/76f6337f1e7238a626ab34405ddd634636011b2ff947dcbd8995f16a7776/MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0", size = 33089 }, + { url = "https://files.pythonhosted.org/packages/19/00/3b8eb0093c885576a1ce7f2263e7b8c01e55b9977433f8246f57cd81b0be/MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625", size = 16438 }, + { url = "https://files.pythonhosted.org/packages/ea/60/2400ba59cf2465fa136487ee7299f52121a9d04b2cf8539ad43ad10e70e8/MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3", size = 16989 }, +] + +[[package]] +name = "matplotlib" +version = "3.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/65/d6e00376dbdb6c227d79a2d6ec32f66cfb163f0cd924090e3133a4f85a11/matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882", size = 38003777 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/6d/3817522ca223796703b68ffd38577582f2dc7a0c0dd410d1803e36b5e1db/matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1", size = 8312504 }, + { url = "https://files.pythonhosted.org/packages/86/2b/a04f22015a03025a8c9c0363c4ecfd89eb45fc3af545ff838e02ac58b39d/matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353", size = 7428278 }, + { url = "https://files.pythonhosted.org/packages/1d/24/72b0b7069d268b22c40f42d973f4b4971debd0f9ddc0fbf4753d5f0a2469/matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500", size = 7331795 }, + { url = "https://files.pythonhosted.org/packages/8a/d3/35c62c9f64ddef5f25763580a10cb1ff4a19dc1a2bf940ad06dbb10b248d/matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea", size = 11346027 }, + { url = "https://files.pythonhosted.org/packages/13/0d/a3c01d8dd48957029f5ea5eac3d778fdedefaef43533597def65e29e5414/matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4", size = 11450383 }, + { url = "https://files.pythonhosted.org/packages/89/f3/84a9a6613ab0d89931d785f13fa2606e03f07252875acc8ebf5b676fa3c5/matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556", size = 11571945 }, + { url = "https://files.pythonhosted.org/packages/a8/14/83b722ae5bec25cd1b44067d2165952aa0943af287ea06f2e1e594220805/matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24", size = 7333567 }, + { url = "https://files.pythonhosted.org/packages/07/76/fde990f131450f08eb06e50814b98d347b14d7916c0ec31cba0a65a9be2b/matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba", size = 7627337 }, + { url = "https://files.pythonhosted.org/packages/23/7c/3e9366cf2259785de934d0bb5a7e03828e23cd722439d1c78abc4b7d89eb/matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61", size = 8312537 }, + { url = "https://files.pythonhosted.org/packages/0e/61/255b0ab4fd319bb8274bde67eeb8b56e52c4d1b66123a6ed3de2b835d108/matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476", size = 7428297 }, + { url = "https://files.pythonhosted.org/packages/5d/7e/0647f19705d819d2249df96625d83ff5de2e913a247610b753c504b7bfd0/matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba", size = 7331760 }, + { url = "https://files.pythonhosted.org/packages/e0/2e/a9fc4c317bc8cc679d344dd881b97f67580b38e6eedc645c3623d6c5d139/matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332", size = 11349722 }, + { url = "https://files.pythonhosted.org/packages/1e/5c/bae8d15f7dec470ee0269d503132678e5ce4abd1306b70b180d66ede13d5/matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6", size = 11453879 }, + { url = "https://files.pythonhosted.org/packages/51/d8/ba69105b4b72aace5d3501af1b0886b248fa5363519df04dc17577578bab/matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0", size = 11575586 }, + { url = "https://files.pythonhosted.org/packages/3a/4e/83499803b641c40e33c118b461a7c110bfa8cc6b3be10a2dc174232522dd/matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304", size = 7333693 }, + { url = "https://files.pythonhosted.org/packages/fb/8c/391e3c105edb7e193bb163ed48988135228d0b5ce3143e1cbec2350e23c8/matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7", size = 7627227 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/50/3af8c0362f26108e54d58c7f38784a3bdae6b9a450bab48ee8482d737f44/matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304", size = 7790 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/51/c34d7a1d528efaae3d8ddb18ef45a41f284eacf9e514523b191b7d0872cc/matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", size = 9408 }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/2f/58f06f27e97c9aba61220aee827e0eeef9a89116c76ca7ea1d373c187b8e/mdit-py-plugins-0.3.3.tar.gz", hash = "sha256:5cfd7e7ac582a594e23ba6546a2f406e94e42eb33ae596d0734781261c251260", size = 38199 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/eb/c358112e8265f827cf8228eda36cf2a720ad933f5ca66f47f808edf4bb34/mdit_py_plugins-0.3.3-py3-none-any.whl", hash = "sha256:36d08a29def19ec43acdcd8ba471d3ebab132e7879d442760d963f19913e04b9", size = 50478 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + +[[package]] +name = "multidict" +version = "6.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/15/bd620f7a6eb9aa5112c4ef93e7031bcd071e0611763d8e17706ef8ba65e0/multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49", size = 51304 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/e4/ea5687129b0cb781aba596bd08abb2aca3c8051e41aabf989c966e93af04/multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8", size = 48600 }, + { url = "https://files.pythonhosted.org/packages/fc/54/8e025ae4e31d899e4528a570941eb7048512392b454acccf69c2dccfcb0d/multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171", size = 29092 }, + { url = "https://files.pythonhosted.org/packages/eb/97/05b51bd39ba10ad7ae6530ae05e050a1cac91d42dcafd40c40d388e057b4/multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7", size = 29232 }, + { url = "https://files.pythonhosted.org/packages/d0/21/d737fe1cac90fb89b0959194d12747024ea95d52032daef9d2ac3cf18ce0/multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b", size = 116588 }, + { url = "https://files.pythonhosted.org/packages/f5/cf/416f84a8c7954c571881b01c839312ec81e222b3986c8baedc57f476cc1b/multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547", size = 122044 }, + { url = "https://files.pythonhosted.org/packages/8f/f9/e14b11f78b937d2a5982593d5a238058679bd120979b2c5b94ea8ba125fc/multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569", size = 117432 }, + { url = "https://files.pythonhosted.org/packages/56/b5/ac112889bfc68e6cf4eda1e4325789b166c51c6cd29d5633e28fb2c2f966/multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93", size = 114509 }, + { url = "https://files.pythonhosted.org/packages/42/b6/61cb83e174e77e4e2607f60f26ff8e975eb7961e143fa01682b8c3acb201/multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98", size = 108507 }, + { url = "https://files.pythonhosted.org/packages/b0/6d/03a5b702a0ad4d3aa4cf101acd8758ff8438fef0311bf90e7c72a80152ef/multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0", size = 138547 }, + { url = "https://files.pythonhosted.org/packages/25/1f/b10a0abdfc33069b6c92935cff81b97dd7d034149b05025a92326972b371/multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988", size = 131645 }, + { url = "https://files.pythonhosted.org/packages/96/9a/96830785d7eb3c72782fda15572ea9ed31fd67a071eab0ffad6859458e4d/multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc", size = 143342 }, + { url = "https://files.pythonhosted.org/packages/1a/5a/e31fc5799b6d8929da4db92cc166d9257e7f85b4d6c7245143c0dae29413/multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0", size = 139212 }, + { url = "https://files.pythonhosted.org/packages/e1/2b/e2b9ff85a5f973c7636d07e58ede554262a75b435eb6fe53e67ec4749953/multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5", size = 134785 }, + { url = "https://files.pythonhosted.org/packages/bd/50/7beeed47a950011ea0abf50541fecd67d6880719ac0e797b3dc214d6f102/multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8", size = 25663 }, + { url = "https://files.pythonhosted.org/packages/24/d1/56b6d5eb964161c55a8a7ad53fe4c93a694e44d04fd1405f3c1b98de5627/multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc", size = 28131 }, + { url = "https://files.pythonhosted.org/packages/bb/ec/ea3435f339cfad0d0a5e9e533a362d230325029deea9cdba6730fcfc1e00/multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03", size = 48546 }, + { url = "https://files.pythonhosted.org/packages/3c/b3/1c8b525a7243c395a73d0ba35f4625333315c5261d01acc3bcde852a9548/multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3", size = 29055 }, + { url = "https://files.pythonhosted.org/packages/59/28/e50cc24c56609d11f7232606f73981620e94e3445791d9501e21c4c73a61/multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba", size = 29212 }, + { url = "https://files.pythonhosted.org/packages/27/ce/2207d548200d42c3a0b3cb11b8957f4d29f82f95977ae2cc8276a7d719e5/multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9", size = 120078 }, + { url = "https://files.pythonhosted.org/packages/4d/1f/83656180657d0d359b12866b9af77dbb58f46cb5f454301d2c37ec97a9e1/multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982", size = 125577 }, + { url = "https://files.pythonhosted.org/packages/e4/41/ade43649e3c35178a81827eb960a7480842fe36c51d4a16a2a68e396e0d6/multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe", size = 120706 }, + { url = "https://files.pythonhosted.org/packages/9d/5a/34bd606569178ad8a931ea4d59cda926b046cfa4c01b0191c2e04cfd44c2/multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710", size = 117391 }, + { url = "https://files.pythonhosted.org/packages/fc/5b/0a4205a1248fb152f596a03c971c6ef1585d0c98e56b6886dc35d084e366/multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c", size = 111378 }, + { url = "https://files.pythonhosted.org/packages/5f/eb/2023167c9533d62e2afcba7acb0dc98420bcf9fc27eff5a83c2bbd013b65/multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4", size = 141033 }, + { url = "https://files.pythonhosted.org/packages/e4/18/79a66879c57c37a2a721ca1aea18953f0f291ea8a8e7334fe5091a4c3111/multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a", size = 133669 }, + { url = "https://files.pythonhosted.org/packages/d5/eb/22de4f5935f4d754b0f53d323643a1b4b7fa796e02bf3a0df7dec150269f/multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c", size = 145889 }, + { url = "https://files.pythonhosted.org/packages/b4/7a/3f0b0e533fd1b73662723cb45869f4d32df643458d78c2fa7b946be98494/multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed", size = 141694 }, + { url = "https://files.pythonhosted.org/packages/5c/4d/976b2e5fadc2b6e5e6208fb1566669460adde3f41d7622db3afa90fb2dbf/multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461", size = 137257 }, + { url = "https://files.pythonhosted.org/packages/47/a4/69f7255bc1398caa2c1eecf4c937d3ed6ae483327f39f8b1115b578905bb/multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636", size = 25666 }, + { url = "https://files.pythonhosted.org/packages/3d/22/35539dddb1971eb8dc88bb19d22d636eb9efe1ad7549d2f319a7951cbbe7/multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0", size = 28131 }, +] + +[[package]] +name = "multiprocess" +version = "0.70.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/ab/9aafc121c6a3d2470ccdf28f99897e88d324c948893b30e46cb359f595e3/multiprocess-0.70.14.tar.gz", hash = "sha256:3eddafc12f2260d27ae03fe6069b12570ab4764ab59a75e81624fac453fbf46a", size = 1498053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/0c/c26b346b41bb1f81ac921fa10074a9595c22e5f99cc89c0410fc4efd5df3/multiprocess-0.70.14-py310-none-any.whl", hash = "sha256:7dc1f2f6a1d34894c8a9a013fbc807971e336e7cc3f3ff233e61b9dc679b3b5c", size = 134316 }, + { url = "https://files.pythonhosted.org/packages/f1/00/c1b90843cb80e6a1911f480e92a92b1258efcdd32ed4fe87449703416fc4/multiprocess-0.70.14-py37-none-any.whl", hash = "sha256:93a8208ca0926d05cdbb5b9250a604c401bed677579e96c14da3090beb798193", size = 115684 }, + { url = "https://files.pythonhosted.org/packages/13/95/8b875a678c6f9db81809dd5d6032e9f8628426e37f6aa6b7d404ba582de1/multiprocess-0.70.14-py38-none-any.whl", hash = "sha256:6725bc79666bbd29a73ca148a0fb5f4ea22eed4a8f22fce58296492a02d18a7b", size = 132003 }, + { url = "https://files.pythonhosted.org/packages/6a/f4/fbeb03ef7abdda54db4a6a75c971b88ab73d724ff09e3275cc1e99f1c946/multiprocess-0.70.14-py39-none-any.whl", hash = "sha256:63cee628b74a2c0631ef15da5534c8aedbc10c38910b9c8b18dcd327528d1ec7", size = 132855 }, +] + +[[package]] +name = "nest-asyncio" +version = "1.5.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/76/64c51c1cbe704ad79ef6ec82f232d1893b9365f2ff194111787dc91b004f/nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290", size = 7444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/1a/6dd9ec31cfdb34cef8fea0055b593ee779a6f63c8e8038ad90d71b7f53c0/nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8", size = 5215 }, +] + +[[package]] +name = "networkx" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/f9/d45c9ecf50a6b67a200e0bbd324201b5cd777dfc0e6c8f6d1620ce5a7ada/networkx-3.0.tar.gz", hash = "sha256:9a9992345353618ae98339c2b63d8201c381c2944f38a2ab49cb45a4c667e412", size = 1987075 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/eb/929b1a04b1778f4dd606c739c93c134306e4a31012e31e184c8308f3d985/networkx-3.0-py3-none-any.whl", hash = "sha256:58058d66b1818043527244fab9d41a51fcd7dcc271748015f3c181b8a90c8e2e", size = 2043929 }, +] + +[[package]] +name = "numpy" +version = "1.24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/a9/6704bb5e1d1d778d3a6ee1278a8d8134f0db160e09d52863a24edb58eab5/numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22", size = 10906862 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/fd/217e9bf573f710827416e1e6f56a6355b90c2ce7fbf8b83d5729d5b2e0b6/numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d", size = 19788158 }, + { url = "https://files.pythonhosted.org/packages/8e/32/2bd17fccc5decf3b904888f4f86b89e367a009273c665cbbbbfe515b43df/numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5", size = 13852558 }, + { url = "https://files.pythonhosted.org/packages/34/dc/7470dde137734e311c5203d0a5854e03da12d7bef60784937efcbb1f8c08/numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253", size = 13993375 }, + { url = "https://files.pythonhosted.org/packages/c5/21/275cfa7731ee2e121b1bf85ddb21b8712fe2f409f02a8b61521af6e4993d/numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978", size = 17279469 }, + { url = "https://files.pythonhosted.org/packages/e7/3d/0c52834c6c8f9e35b71e7a7202ca35bec639984aaea60056c763ade26f67/numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9", size = 12427216 }, + { url = "https://files.pythonhosted.org/packages/fa/df/53e8c0c8ccecf360b827a3d2b1b6060644c635c3149a9d6415a6fe4ccf44/numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0", size = 14839720 }, + { url = "https://files.pythonhosted.org/packages/1b/a7/9582b169194a05642fcd05026b2e55fa7539230bfc28de7e13f116b0cd0b/numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a", size = 19774860 }, + { url = "https://files.pythonhosted.org/packages/01/04/a8b0bb5ffd6b36cb9ff9b67ca6966d55c4a9fdb40ace81a2b33d1559c3b7/numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0", size = 13838116 }, + { url = "https://files.pythonhosted.org/packages/8b/1a/34ba69424c19e4c3bd5d393d58ec5b8ff85711e77209a2d43563bf7fb178/numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281", size = 13989742 }, + { url = "https://files.pythonhosted.org/packages/b6/d7/b208a4a534732e4a978003768ac7b8c14fcd4ca5b1653ce4fb4c2826f3a4/numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910", size = 17276093 }, + { url = "https://files.pythonhosted.org/packages/fa/72/979b755c09696de035d835a78df94b079e3e51ea967efa0c800cff608847/numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95", size = 12420296 }, + { url = "https://files.pythonhosted.org/packages/17/57/82c3a9321f5dbcbdbe407476ea93dc4fabcadc819fd9baddf3511ddd5833/numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04", size = 14832391 }, +] + +[[package]] +name = "nvidia-cublas-cu11" +version = "11.10.3.66" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, + { name = "wheel" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/41/fdeb62b5437996e841d83d7d2714ca75b886547ee8017ee2fe6ea409d983/nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded", size = 317097917 }, + { url = "https://files.pythonhosted.org/packages/7a/08/57e6b6481af73590259a9600c32a68eb853966e354fca147cde17ed9ea27/nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e", size = 311065222 }, +] + +[[package]] +name = "nvidia-cuda-cupti-cu11" +version = "11.7.101" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, + { name = "wheel" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/9d/dd0cdcd800e642e3c82ee3b5987c751afd4f3fb9cc2752517f42c3bc6e49/nvidia_cuda_cupti_cu11-11.7.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:e0cfd9854e1f2edaa36ca20d21cd0bdd5dcfca4e3b9e130a082e05b33b6c5895", size = 11845698 }, + { url = "https://files.pythonhosted.org/packages/8b/4e/f314475cc4740b6138daf9c6496b165bab1f07c161bd4ac5e69285ab07d6/nvidia_cuda_cupti_cu11-11.7.101-py3-none-win_amd64.whl", hash = "sha256:7cc5b8f91ae5e1389c3c0ad8866b3b016a175e827ea8f162a672990a402ab2b0", size = 8461264 }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu11" +version = "11.7.99" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/25/922c5996aada6611b79b53985af7999fc629aee1d5d001b6a22431e18fec/nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03", size = 21011023 }, + { url = "https://files.pythonhosted.org/packages/ea/8d/0709ba16c2831c17ec1c2ea1eeb89ada11ffa8d966d773cce0a7463b22bb/nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7", size = 21010447 }, + { url = "https://files.pythonhosted.org/packages/9e/10/c9fc448f33d439981d6a74b693526871c4ef13e8d81a7b4de12e3a12a1b9/nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3", size = 17040212 }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu11" +version = "11.7.99" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, + { name = "wheel" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/92/89cf558b514125d2ebd8344dd2f0533404b416486ff681d5434a5832a019/nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31", size = 849253 }, + { url = "https://files.pythonhosted.org/packages/32/2c/d89ea2b4051fbabff8d2edda8c735dabae6d5d1b8d5215f9749d38dcdb72/nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7", size = 991354 }, +] + +[[package]] +name = "nvidia-cudnn-cu11" +version = "8.5.0.96" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu11" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/30/66d4347d6e864334da5bb1c7571305e501dcb11b9155971421bb7bb5315f/nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7", size = 557141533 }, + { url = "https://files.pythonhosted.org/packages/db/69/4d28d4706946f89fffe3f87373a079ae95dc17f9c0fcd840fe570c67e36b/nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108", size = 557140881 }, +] + +[[package]] +name = "nvidia-cufft-cu11" +version = "10.9.0.58" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/79/b912a77e38e41f15a0581a59f5c3548d1ddfdda3225936fb67c342719e7a/nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux1_x86_64.whl", hash = "sha256:222f9da70c80384632fd6035e4c3f16762d64ea7a843829cb278f98b3cb7dd81", size = 168405414 }, + { url = "https://files.pythonhosted.org/packages/71/7a/a2ad9951d57c3cc23f4fa6d84b146afd9f375ffbc744b38935930ac4393f/nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux2014_aarch64.whl", hash = "sha256:34b7315104e615b230dc3c2d1861f13bff9ec465c5d3b4bb65b4986d03a1d8d4", size = 111231060 }, + { url = "https://files.pythonhosted.org/packages/64/c8/133717b43182ba063803e983e7680a94826a9f4ff5734af0ca315803f1b3/nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e21037259995243cc370dd63c430d77ae9280bedb68d5b5a18226bfc92e5d748", size = 168405419 }, + { url = "https://files.pythonhosted.org/packages/f8/b4/e432a74f8db0e84f734dc14d36c0e529225132bf7e239da21f55893351a6/nvidia_cufft_cu11-10.9.0.58-py3-none-win_amd64.whl", hash = "sha256:c4d316f17c745ec9c728e30409612eaf77a8404c3733cdf6c9c1569634d1ca03", size = 172237004 }, +] + +[[package]] +name = "nvidia-curand-cu11" +version = "10.2.10.91" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, + { name = "wheel" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/11/af78d54b2420e64a4dd19e704f5bb69dcb5a6a3138b4465d6a48cdf59a21/nvidia_curand_cu11-10.2.10.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:eecb269c970fa599a2660c9232fa46aaccbf90d9170b96c462e13bcb4d129e2c", size = 54628716 }, + { url = "https://files.pythonhosted.org/packages/45/76/b98f30e058c9bbd9a56eb9b1102b9aab775704bad9286bf8e3998147e2e9/nvidia_curand_cu11-10.2.10.91-py3-none-win_amd64.whl", hash = "sha256:f742052af0e1e75523bde18895a9ed016ecf1e5aa0ecddfcc3658fd11a1ff417", size = 54342083 }, +] + +[[package]] +name = "nvidia-cusolver-cu11" +version = "11.4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu11" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/77/66149e3153b19312fb782ea367f3f950123b93916a45538b573fe373570a/nvidia_cusolver_cu11-11.4.0.1-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:72fa7261d755ed55c0074960df5904b65e2326f7adce364cbe4945063c1be412", size = 102594907 }, + { url = "https://files.pythonhosted.org/packages/25/4b/272f9aa7838e545b47878e4aec4f09b0fecf17dbd312cf5c5dc398b0637f/nvidia_cusolver_cu11-11.4.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:700b781bfefd57d161443aff9ace1878584b93e0b2cfef3d6e9296d96febbf99", size = 102592389 }, + { url = "https://files.pythonhosted.org/packages/ee/42/f682b0b001562d16664bd7b015165cf2c2d392a8d0506472f28b2833953e/nvidia_cusolver_cu11-11.4.0.1-py3-none-win_amd64.whl", hash = "sha256:00f70b256add65f8c1eb3b6a65308795a93e7740f6df9e273eccbba770d370c4", size = 100095353 }, +] + +[[package]] +name = "nvidia-cusparse-cu11" +version = "11.7.4.91" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, + { name = "wheel" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/6f/6d032cc1bb7db88a989ddce3f4968419a7edeafda362847f42f614b1f845/nvidia_cusparse_cu11-11.7.4.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:a3389de714db63321aa11fbec3919271f415ef19fda58aed7f2ede488c32733d", size = 173182291 }, + { url = "https://files.pythonhosted.org/packages/15/3e/d32da819d918b0b9ef3fa89ed8238d2c3b8e315ac32441229783a4b0c4ce/nvidia_cusparse_cu11-11.7.4.91-py3-none-win_amd64.whl", hash = "sha256:304a01599534f5186a8ed1c3756879282c72c118bc77dd890dc1ff868cad25b9", size = 172505954 }, +] + +[[package]] +name = "nvidia-nccl-cu11" +version = "2.14.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/92/914cdb650b6a5d1478f83148597a25e90ea37d739bd563c5096b0e8a5f43/nvidia_nccl_cu11-2.14.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:5e5534257d1284b8e825bc3a182c6f06acd6eb405e9f89d49340e98cd8f136eb", size = 177099966 }, +] + +[[package]] +name = "nvidia-nvtx-cu11" +version = "11.7.91" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, + { name = "wheel" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/d5/09493ff0e64fd77523afbbb075108f27a13790479efe86b9ffb4587671b5/nvidia_nvtx_cu11-11.7.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:b22c64eee426a62fc00952b507d6d29cf62b4c9df7a480fcc417e540e05fd5ac", size = 98579 }, + { url = "https://files.pythonhosted.org/packages/cc/e1/37b5a5da8ec3594890356e9d60617feb36cfea1223ac511a78c615870916/nvidia_nvtx_cu11-11.7.91-py3-none-win_amd64.whl", hash = "sha256:dfd7fcb2a91742513027d63a26b757f38dd8b07fecac282c4d132a9d373ff064", size = 65886 }, +] + +[[package]] +name = "orjson" +version = "3.8.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/23/36e24fccddf107d26b548a771f49747dd98a33515e2ccfa2ecabb79e0ea3/orjson-3.8.9.tar.gz", hash = "sha256:c40bece58c11cb09aff17424d21b41f6f767d2b1252b2f745ec3ff29cce6a240", size = 657071 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/a3/1662fcf936499fa422c0ea4c10372a7377c1b8948e6364b1954ae35cf021/orjson-3.8.9-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:5d029843eae7b6cbd6468b63517b8b61471afed6572162171d8b6471b6dbf41f", size = 140804 }, + { url = "https://files.pythonhosted.org/packages/37/75/2057e0fc9fa319601ce78d6682bf9877ed51628f4366d70c860d404fe208/orjson-3.8.9-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:405933c05490efb209d0f940d8ef1403d2932a97e47010a26d2694e9dd49f84d", size = 488559 }, + { url = "https://files.pythonhosted.org/packages/ef/62/4a42c8de83426356b258ae8a98af71d3c3c63184c6b289e7d13dcc89a955/orjson-3.8.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:183de66eff4d41c330a3006f210ab0bce7affe398da6f6eda9579b67245a34ff", size = 263143 }, + { url = "https://files.pythonhosted.org/packages/8e/64/314b174747a1a8f46c836d05708ec58a8d028d5dd7a1b552afe05efb805d/orjson-3.8.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb4081fe340ed1df42dddfd055e1d50479cb0ccb976d13e6b5e8667a07fec6f4", size = 150055 }, + { url = "https://files.pythonhosted.org/packages/8c/6c/dd902a14ccd2812a4967a83bb6d7948971db3d747b9e4310a7f0e9796ba3/orjson-3.8.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d11593a2e736055dd7b9587dbf89cd1cbe4a42a70e70f186e51aee7e1b38902e", size = 154207 }, + { url = "https://files.pythonhosted.org/packages/ba/ff/80d02012aab3596e88c62263f7503f4f66b6bf91fe01ab38082007266c53/orjson-3.8.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e20649359e28f34d01b2570e4650a076f439a959bae3a8bbe7f5923ad80f54e8", size = 274652 }, + { url = "https://files.pythonhosted.org/packages/1a/29/977982fcbce6fbcf0da925133561e28c82a6e9f32bfe0b66645a96d0654d/orjson-3.8.9-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c02ece4f36a160c83efe74adfba5f189c7c7702361f02b809ab73744923ee139", size = 144107 }, + { url = "https://files.pythonhosted.org/packages/5e/c2/21d6565969bd1fea73ed3537c529761299f807a7db8cc2719642f74b9df7/orjson-3.8.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f0e19801836cf1b30f333d475b05d79051b8ae8639a8e2422fb5f64e82676ae7", size = 323886 }, + { url = "https://files.pythonhosted.org/packages/af/0d/aceb2f2ad1d0fcd975b64294dc288f4a07b98f4d124887f5fbd4eed9a3a6/orjson-3.8.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d4850fe5650cead3c0f8822192e381cee9d4c3b8162eb082c86c927124572dc6", size = 317626 }, + { url = "https://files.pythonhosted.org/packages/48/c7/e99c2d78f8bd673bd1a1d9793ac3fa94ffe1600cbb1123904d019603e67c/orjson-3.8.9-cp310-none-win_amd64.whl", hash = "sha256:5fd4193f260d9d30112b5e379d0870b54dc88040807c93cbe8d67bfea148ba5a", size = 202082 }, + { url = "https://files.pythonhosted.org/packages/5e/fd/056461d464ff1ddd0a246ad3b5a2772b53968a63780b4ad796c0bf3226fa/orjson-3.8.9-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:70eae063ad8d7405dc63873760567b600fc10728ba0da24a69d49c1a5d318d6d", size = 140805 }, + { url = "https://files.pythonhosted.org/packages/9d/f1/c4d574192c9e2871fbff459c7255a6d86d959375c373f1862a499e66b628/orjson-3.8.9-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:251653437632583d02203e6b118b72b99c04425175853f35340f4bac7034a36e", size = 488562 }, + { url = "https://files.pythonhosted.org/packages/c3/17/4062ebf45c8477bdc24813acaddec734c357b892d6b3a8ae9c422a04748c/orjson-3.8.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ea833751f017ba321c277e7425b51c0b1a18a2c60f8c9c0f4c6c4d7e16cbd6c", size = 263142 }, + { url = "https://files.pythonhosted.org/packages/ed/ec/02293181e97d45754b0a1211f7f5b94763f3b65c7bde21ad03f9e1c8cb01/orjson-3.8.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8563c2cdeb923b82a5cc5bfc76c28c786777428263ee39292d928e9687165fb4", size = 150055 }, + { url = "https://files.pythonhosted.org/packages/0d/9c/a98ff8f3672195c306e49c427303003e3319fc8b49589bc36a8c01988ef1/orjson-3.8.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f33e9ea45b4c9457eedca0c40f38cf5732c91b0fb68f091ac59e6ea68e03eb2", size = 154208 }, + { url = "https://files.pythonhosted.org/packages/74/5f/8f6902c2e45779a1c248e3cc65f77f968c9f9da0d2a9e82af6fe7997dc44/orjson-3.8.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855dee152daecb7de7b4cd7069d7854e11aa291687bffe8433156af0a224417e", size = 274652 }, + { url = "https://files.pythonhosted.org/packages/0e/10/2e70dee59fc6054bfab035686c1edc08b7115483b72a7a814e4a33e50fe5/orjson-3.8.9-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:74fa9e02589339defc9d3662de9e7eef51d8f9f3a7f6304b43b18b39d7bbf10f", size = 144107 }, + { url = "https://files.pythonhosted.org/packages/00/8e/e3b5eff5c871ba6f6704a50280ba15661882c2e2b0fc741371f7b02cc795/orjson-3.8.9-cp311-none-win_amd64.whl", hash = "sha256:6c5b10ba1e62df8f96cbc37f6d5ae9acb3f6475926dea8b1b6a1a60f201a64f7", size = 202084 }, +] + +[[package]] +name = "packaging" +version = "23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/d5/aca8ff6f49aa5565df1c826e7bf5e85a6df852ee063600c1efa5b932968c/packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97", size = 126241 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/35/a31aed2993e398f6b09a790a181a7927eb14610ee8bbf02dc14d31677f1c/packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", size = 42678 }, +] + +[[package]] +name = "pandas" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/ee/146cab1ff6d575b54ace8a6a5994048380dc94879b0125b25e62edcb9e52/pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1", size = 5203060 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/cd/34f6b0780301be81be804d7aa71d571457369e6131e2b330af2b0fed1aad/pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406", size = 18619230 }, + { url = "https://files.pythonhosted.org/packages/5f/34/b7858bb7d6d6bf4d9df1dde777a11fcf3ff370e1d1b3956e3d0fcca8322c/pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572", size = 11982991 }, + { url = "https://files.pythonhosted.org/packages/b8/6c/005bd604994f7cbede4d7bf030614ef49a2213f76bc3d738ecf5b0dcc810/pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996", size = 10927131 }, + { url = "https://files.pythonhosted.org/packages/27/c7/35b81ce5f680f2dac55eac14d103245cd8cf656ae4a2ff3be2e69fd1d330/pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354", size = 11368188 }, + { url = "https://files.pythonhosted.org/packages/49/e2/79e46612dc25ebc7603dc11c560baa7266c90f9e48537ecf1a02a0dd6bff/pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23", size = 12062104 }, + { url = "https://files.pythonhosted.org/packages/d9/cd/f27c2992cbe05a3e39937f73a4be635a9ec149ec3ca4467d8cf039718994/pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328", size = 10362473 }, + { url = "https://files.pythonhosted.org/packages/e2/24/a26af514113fd5eca2d8fe41ba4f22f70dfe6afefde4a6beb6a203570935/pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc", size = 18387750 }, + { url = "https://files.pythonhosted.org/packages/53/c9/d2f910dace7ef849b626980d0fd033b9cded36568949c8d560c9630ad2e0/pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d", size = 11868668 }, + { url = "https://files.pythonhosted.org/packages/b0/be/1843b9aff84b98899663e7cad9f45513dfdd11d69cb5bd85c648aaf6a8d4/pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc", size = 10814036 }, + { url = "https://files.pythonhosted.org/packages/63/8d/c2bd356b9d4baf1c5cf8d7e251fb4540e87083072c905430da48c2bb31eb/pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae", size = 11374218 }, + { url = "https://files.pythonhosted.org/packages/56/73/3351beeb807dca69fcc3c4966bcccc51552bd01549a9b13c04ab00a43f21/pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6", size = 12017319 }, + { url = "https://files.pythonhosted.org/packages/da/6d/1235da14daddaa6e47f74ba0c255358f0ce7a6ee05da8bf8eb49161aa6b5/pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003", size = 10303385 }, +] + +[[package]] +name = "parso" +version = "0.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/0e/41f0cca4b85a6ea74d66d2226a7cda8e41206a624f5b330b958ef48e2e52/parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", size = 400064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/63/8011bd08a4111858f79d2b09aad86638490d62fbf881c44e434a6dfca87b/parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75", size = 100781 }, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/60/d93628975242cc515ab2b8f5b2fc831d8be2eff32f5a1be4776d49305d13/pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687", size = 45697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/c8/551a803a6ebb174ec1c124e68b449b98a0961f0b737def601e3c1fbb4cfd/pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293", size = 29213 }, +] + +[[package]] +name = "pathtools" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/7f/470d6fcdf23f9f3518f6b0b76be9df16dcc8630ad409947f8be2eb0ed13a/pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0", size = 11006 } + +[[package]] +name = "peft" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "torch" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/ac/862aa187c8a42d8133090d76fd626044a4166e5db17bcc11c9fca8548ee4/peft-0.3.0.tar.gz", hash = "sha256:bbdeee4de3653ee43cb6bbe7505816e6e9b4cf8275471be1707d9c253dfe8e0b", size = 53314 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/56/6bbe46360b2274548280522e6831f77be8620ed48fa2a390ca139dc5c2b3/peft-0.3.0-py3-none-any.whl", hash = "sha256:824c2ba148febb743c70363e597dafb35d996e075956ad7bc36506f09fea0349", size = 56752 }, +] + +[[package]] +name = "pexpect" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/9b/ff402e0e930e70467a7178abb7c128709a30dfb22d8777c043e501bc1b10/pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c", size = 157037 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/7b/88dbb785881c28a102619d46423cb853b46dbccc70d3ac362d99773a78ce/pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", size = 59024 }, +] + +[[package]] +name = "pickleshare" +version = "0.7.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", size = 6161 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56", size = 6877 }, +] + +[[package]] +name = "pillow" +version = "9.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/07/830784e061fb94d67649f3e438ff63cfb902dec6d48ac75aeaaac7c7c30e/Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e", size = 50403076 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/d1/4a4f29204e34a0d253ee0f371930c37ba288ecef652f7f49cb6b4602f13b/Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1", size = 3344975 }, + { url = "https://files.pythonhosted.org/packages/20/46/8f6f569584425c5250cd26c79ab2f56df42e388e6a737ae8eafa939ac607/Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12", size = 3345027 }, + { url = "https://files.pythonhosted.org/packages/e8/b1/55617e272040129919077e403996375fcdfb4f5f5b8c24a7c4e92fb8b17b/Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0", size = 3339980 }, + { url = "https://files.pythonhosted.org/packages/ed/cc/a3b981073b62636aad3d6a1c846bd5a703e0a46a61ecef8ab552c432725d/Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f", size = 3340026 }, + { url = "https://files.pythonhosted.org/packages/20/98/2bd3aa232e4c4b2db3e9b65876544b23caabbb0db43929253bfb72e520ca/Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157", size = 3345015 }, + { url = "https://files.pythonhosted.org/packages/6e/2f/937e89f838161c09bd17e53b49b8415051473c9ce9b6c55b288a66625b13/Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47", size = 3011264 }, + { url = "https://files.pythonhosted.org/packages/09/f3/213bc3f14041002f871837a3130a66cda3b4a2b22b0be9da6fc7a7346a0d/Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343", size = 3060841 }, + { url = "https://files.pythonhosted.org/packages/18/ce/2390e0a84138fb84e7510bbc5a7a8530c2ac5661241531e60b0f85c6f35b/Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d", size = 3331369 }, + { url = "https://files.pythonhosted.org/packages/69/6d/17f0ee189732bd16def91c0b440203c829b71e3af24f569cb22d831760cb/Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57", size = 3253815 }, + { url = "https://files.pythonhosted.org/packages/06/50/fd98b6be293b96b02ca0dca15939e8e8d0c7f71d731e9b93e6403487911f/Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5", size = 3112165 }, + { url = "https://files.pythonhosted.org/packages/40/d1/b646804eb150a94c76abc54576ea885f71030bab6c541ccb9594db5da64a/Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070", size = 3360976 }, + { url = "https://files.pythonhosted.org/packages/6a/cc/5b915fd1d4fe9edfd2fb23779079c11fee21535227aabc141f5fae4c97ab/Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28", size = 3294755 }, + { url = "https://files.pythonhosted.org/packages/23/8f/4d428380740a7b83a51a4b25c33d422c59dcece99784f09acf7f0b3e4ee4/Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35", size = 3357304 }, + { url = "https://files.pythonhosted.org/packages/52/75/141b332164bfcd78d3d49b95a36a34b0190f3030d93f686cb596156d368d/Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a", size = 2184780 }, + { url = "https://files.pythonhosted.org/packages/5e/7c/293136a5171800001be33c21a51daaca68fae954b543e2c015a6bb81a716/Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391", size = 2475100 }, + { url = "https://files.pythonhosted.org/packages/eb/7c/c3b1a932f4d832429b961aaae8d378c877e00b3d0accf50c5df97c595f35/Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133", size = 3345032 }, + { url = "https://files.pythonhosted.org/packages/7c/4b/96aae1deb7f6fd30995e22560263ab1d71728a7880dab109824fc37754de/Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132", size = 3011250 }, + { url = "https://files.pythonhosted.org/packages/51/57/c12f96c26a7d981fe50b802bacd1faf1dd2f04912397c7abf946a0265883/Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0", size = 3060880 }, + { url = "https://files.pythonhosted.org/packages/fb/18/4752328a96388365e6864b9ba3d3489c8a3d1cef9648267583b03a5f6b8d/Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35", size = 3331361 }, + { url = "https://files.pythonhosted.org/packages/b9/ee/88978534a2304540a938316fc3241d2e3a2d8b68834485b1ffce0d7f38e9/Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab", size = 3253833 }, + { url = "https://files.pythonhosted.org/packages/43/95/c81019bc15b14fd58862c50af0985429edc7e1dee204cbfc8f64df3f2445/Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4", size = 3112185 }, + { url = "https://files.pythonhosted.org/packages/54/4f/346b8ea1b772cb6e802ed32a78b18627be6a9d9a29755fa82ea436bb582e/Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d", size = 3360978 }, + { url = "https://files.pythonhosted.org/packages/9c/9f/0e5a602fdb6adcc594b1aec4dd7d6162b2540cd5a6ae874871e061a45c52/Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8", size = 3294793 }, + { url = "https://files.pythonhosted.org/packages/ad/b5/58378730355a42bc504f4a10ef9526e59ce4c8a1bb612a0289a407e2ce79/Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a", size = 3357344 }, + { url = "https://files.pythonhosted.org/packages/17/c0/5b3b961d414512e457bfd6337b085830a2609f8f51c05f1ac685050c76a6/Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c", size = 2184796 }, + { url = "https://files.pythonhosted.org/packages/4d/2d/12eae829bcf4ee211014ed71c6430c8b0d3fc462597dd695867c03d59fcb/Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee", size = 2475123 }, +] + +[[package]] +name = "platformdirs" +version = "3.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/99/c922839819f5d00d78b3a1057b5ceee3123c69b2216e776ddcb5a4c265ff/platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", size = 19203 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/51/fe5a0d6ea589f0d4a1b97824fb518962ad48b27cd346dcdfa2405187997a/platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d", size = 17189 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.38" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/bb/75cdcd356f57d17b295aba121494c2333d26bfff1a837e6199b8b83c415a/prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b", size = 422834 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/3f/1f5a0ff475ae6481f4b0d45d4d911824d3218b94ee2a97a8cb84e5569836/prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f", size = 385848 }, +] + +[[package]] +name = "protobuf" +version = "4.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e0/9da6a25f4ac72455f5da9d4af8d75144d15e29d415220773850e0ec23d3e/protobuf-4.22.1.tar.gz", hash = "sha256:dce7a55d501c31ecf688adb2f6c3f763cf11bc0be815d1946a84d74772ab07a7", size = 388825 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/be/ea317ad560b5f7c3f22082219e2c72f1e33437aa62f7225becb6873f6483/protobuf-4.22.1-cp310-abi3-win32.whl", hash = "sha256:85aa9acc5a777adc0c21b449dafbc40d9a0b6413ff3a4f77ef9df194be7f975b", size = 401164 }, + { url = "https://files.pythonhosted.org/packages/6a/68/c5789f3fd3614cb2e67a27d2952927e9e1232a0bd43c0960525df88930ad/protobuf-4.22.1-cp310-abi3-win_amd64.whl", hash = "sha256:8bc971d76c03f1dd49f18115b002254f2ddb2d4b143c583bb860b796bb0d399e", size = 420642 }, + { url = "https://files.pythonhosted.org/packages/fa/09/c9b6d85a65c37a04f7c5f63ca28d143d127c0394b70ba1b419b2d0646e75/protobuf-4.22.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5917412347e1da08ce2939eb5cd60650dfb1a9ab4606a415b9278a1041fb4d19", size = 397166 }, + { url = "https://files.pythonhosted.org/packages/7a/13/3f3463e7f5c7f5ea5b01e36970b6027b2287ce25546938347d9688ddfecb/protobuf-4.22.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e12e2810e7d297dbce3c129ae5e912ffd94240b050d33f9ecf023f35563b14f", size = 301232 }, + { url = "https://files.pythonhosted.org/packages/f5/ac/51e7173ec5bb9e06344482bb9e17f964c63cee00de75aa5c5a32e8794fe7/protobuf-4.22.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:953fc7904ef46900262a26374b28c2864610b60cdc8b272f864e22143f8373c4", size = 302375 }, + { url = "https://files.pythonhosted.org/packages/bc/6c/d9c699c39d4e1a255a597557885d6eb9e05d1b3ad6a82d1e6fb3d24717de/protobuf-4.22.1-py3-none-any.whl", hash = "sha256:3e19dcf4adbf608924d3486ece469dd4f4f2cf7d2649900f0efcd1a84e8fd3ba", size = 172769 }, +] + +[[package]] +name = "psutil" +version = "5.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/7d/d05864a69e452f003c0d77e728e155a89a2a26b09e64860ddd70ad64fb26/psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62", size = 485825 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/73/35cea01aad1baf901c915dc95ea33a2f271c8ff8cf2f1c73b7f591f1bdf1/psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7", size = 243468 }, + { url = "https://files.pythonhosted.org/packages/5a/37/ef88eed265d93bc28c681316f68762c5e04167519e5627a0187c8878b409/psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1", size = 277515 }, + { url = "https://files.pythonhosted.org/packages/6e/c8/784968329c1c67c28cce91991ef9af8a8913aa5a3399a6a8954b1380572f/psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08", size = 280218 }, + { url = "https://files.pythonhosted.org/packages/3e/af/fe14b984e8b0f778d502d387b789d846cb2fcc3989f63be942741266d8c8/psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff", size = 247217 }, + { url = "https://files.pythonhosted.org/packages/25/6e/ba97809175c90cbdcd33b470e466ebf0854d15d1506e605cc0ddd284d5b6/psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4", size = 252462 }, + { url = "https://files.pythonhosted.org/packages/79/26/f026804298b933b11640cc2d15155a545805df732e5ead3a2ad7cf45a38b/psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e", size = 244234 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/97/5a/0bc937c25d3ce4e0a74335222aee05455d6afa2888032185f8ab50cdf6fd/pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3", size = 19395 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/27/77f9d5684e6bce929f5cfe18d6cfbe5133013c06cb2fbf5933670e60761d/pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", size = 11693 }, +] + +[[package]] +name = "pyarrow" +version = "11.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/e7/49cc11436f92a6a9001e4002fb8e5cd6733fc15a89a354cbc22b206a8171/pyarrow-11.0.0.tar.gz", hash = "sha256:5461c57dbdb211a632a48facb9b39bbeb8a7905ec95d768078525283caef5f6d", size = 1020639 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/df/eb6902d472569f83e331bc79f17291d70b292d5239ebe6b48bc74ec8424d/pyarrow-11.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:40bb42afa1053c35c749befbe72f6429b7b5f45710e85059cdd534553ebcf4f2", size = 24437465 }, + { url = "https://files.pythonhosted.org/packages/72/f5/0b912f1d7f06a880369940f79f4ec5e91a2bcdf84dec2fb53fd1969e40e5/pyarrow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c28b5f248e08dea3b3e0c828b91945f431f4202f1a9fe84d1012a761324e1ba", size = 22373684 }, + { url = "https://files.pythonhosted.org/packages/ed/d2/9780501efdb77dbd3865375e9dc02d2b3963fc4d60b551f8d0ccec07e4de/pyarrow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37bc81f6c9435da3c9c1e767324ac3064ffbe110c4e460660c43e144be4ed85", size = 32673609 }, + { url = "https://files.pythonhosted.org/packages/bc/5b/cee81fdfbd963e08a50eda1500fc9142fa08a7dec5f7dcd9c7c2a33536b6/pyarrow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7c53def8dbbc810282ad308cc46a523ec81e653e60a91c609c2233ae407689", size = 34879133 }, + { url = "https://files.pythonhosted.org/packages/5a/ec/47a8b3b817949b61f01aa1bfe2d608258756b8c7a268745eb05accc7c02f/pyarrow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:25aa11c443b934078bfd60ed63e4e2d42461682b5ac10f67275ea21e60e6042c", size = 20550917 }, + { url = "https://files.pythonhosted.org/packages/95/1b/c67e0d844d6a62fdfddff041f325d0a87edc7f7dbc7a93e051accb47c1a3/pyarrow-11.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e217d001e6389b20a6759392a5ec49d670757af80101ee6b5f2c8ff0172e02ca", size = 24388742 }, + { url = "https://files.pythonhosted.org/packages/51/6b/218aa314c8ee3776cf1c91d338c5dfc2f940f233925a2e518419f66f9783/pyarrow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad42bb24fc44c48f74f0d8c72a9af16ba9a01a2ccda5739a517aa860fa7e3d56", size = 22324814 }, + { url = "https://files.pythonhosted.org/packages/43/30/4f187a27bade0888bfe66bdc53444e33821c5fa53c607827c1ab92a1aea1/pyarrow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d942c690ff24a08b07cb3df818f542a90e4d359381fbff71b8f2aea5bf58841", size = 32670244 }, + { url = "https://files.pythonhosted.org/packages/83/4a/d5cce2a703e0249e161b63b86f1676d08afcfe8186feccf5c55730ece1c2/pyarrow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f010ce497ca1b0f17a8243df3048055c0d18dcadbcc70895d5baf8921f753de5", size = 34870932 }, + { url = "https://files.pythonhosted.org/packages/1b/dc/e9c7979ff1785b2412757b7c46880f0119ca4ac92c0c7c25c28b0cd063f1/pyarrow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2f51dc7ca940fdf17893227edb46b6784d37522ce08d21afc56466898cb213b2", size = 20537245 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "1.10.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/5f/e53a850fd32dddefc998b6bfcbda843d4ff5b0dcac02a92e414ba6c97d46/pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e", size = 344063 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/59/8082b963e077ea4bec5bb85e8c0fc636e4e7b3484e6a8ceac94e743e3b74/pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d", size = 2864587 }, + { url = "https://files.pythonhosted.org/packages/31/9e/32896df239096e0052e390e90eb0d374367e74bf7ce603a62841310c34c7/pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e", size = 2538147 }, + { url = "https://files.pythonhosted.org/packages/81/1b/04ce5303aee97af30b94c45699ed228b8ba6ba64c972efac184fb9a566f3/pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a", size = 3093991 }, + { url = "https://files.pythonhosted.org/packages/73/f9/860473019e228ac0b12e5cccecc086ce1f7e41d5f1482b64b9454a528e4f/pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f", size = 3123685 }, + { url = "https://files.pythonhosted.org/packages/b8/b7/158fb5bf629f5a97c997711757fb14e831825872c6d091a41a769c9c69e4/pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209", size = 3154996 }, + { url = "https://files.pythonhosted.org/packages/38/cb/21afb81e5b3270cf5504543fb94a0d7734c4536b98c893701842602f9da0/pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af", size = 3112321 }, + { url = "https://files.pythonhosted.org/packages/8a/64/db1aafc37fab0dad89e0a27f120a18f2316fca704e9f95096ade47b933ac/pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a", size = 2117600 }, + { url = "https://files.pythonhosted.org/packages/67/ac/ff5f7eca22bf58dbecfd266597e15b1ec7ddc68b886157a2095a25eedb17/pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1", size = 2814362 }, + { url = "https://files.pythonhosted.org/packages/05/4e/92a0c1fd305f764801dba26182b08ccf72026766fc4451d88186185467f2/pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe", size = 2480579 }, + { url = "https://files.pythonhosted.org/packages/d1/a1/0aa23b545299186f6eabc7a5d289a951e6c033852938ae6673d75846e611/pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd", size = 3060085 }, + { url = "https://files.pythonhosted.org/packages/42/dc/092da33080729a95805e73084abf7cc064de7ae64462d1081859b2c1b7e2/pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb", size = 3093234 }, + { url = "https://files.pythonhosted.org/packages/a4/cb/16648745548e4c18f4b98b7e323bbac698e77cd8fc250a6b2ff83688c95f/pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b", size = 3137658 }, + { url = "https://files.pythonhosted.org/packages/d5/f0/a1bab22b297fc4333d496b34e0db42bc33c85c4b0e7e7a39da76fc65a643/pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca", size = 3085508 }, + { url = "https://files.pythonhosted.org/packages/fa/c2/3df79cd00e65678fce12e59e8c95378a992a93d7b9f9510d4f1f65df1936/pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d", size = 2095360 }, + { url = "https://files.pythonhosted.org/packages/8d/e1/d9219c4e4161a511158e531a84aa719087064d208c2bf87df5c58812f190/pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6", size = 157187 }, +] + +[[package]] +name = "pydub" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327 }, +] + +[[package]] +name = "pygments" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/6a/c427c06913204e24de28de5300d3f0e809933f376e0b7df95194b2bb3f71/Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297", size = 4434562 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/42/d9d95cc461f098f204cd20c85642ae40fbff81f74c300341b8d0e0df14e0/Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717", size = 1123889 }, +] + +[[package]] +name = "pyparsing" +version = "3.0.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/207523d16464c40a0310d2d4d8926daffa00ac1f5b1576170a32db749636/pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", size = 1999906 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/10/a7d0fa5baea8fe7b50f448ab742f26f52b80bfca85ac2be9d35cdd9a3246/pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc", size = 98338 }, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/90/445a7dbd275c654c268f47fa9452152709134f61f09605cf776407055a89/pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", size = 102640 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/7b/7d032130a6838b179b46dff1ee88909c11d518a10ec9bc70c4b72c7c2f80/pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", size = 82517 }, + { url = "https://files.pythonhosted.org/packages/40/04/f1d7813d4cdb62ed58e75b53e2ef481b47081ab5ad2a104cd284fa507042/pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", size = 117238 }, + { url = "https://files.pythonhosted.org/packages/73/55/1e300772f5c24921a81fc1c8b3de8a06a199c4ebb523d7c5a85f4e74a32e/pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", size = 113755 }, + { url = "https://files.pythonhosted.org/packages/57/3e/50aa661939ba1bfc2cc78817ecb37ecb55aef9eda55a193f8da381a8b7a1/pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", size = 60178 }, + { url = "https://files.pythonhosted.org/packages/87/72/e5b2347f136d14f09c8260a2e3a528be94e536d97e6635cc9f22cff2d88c/pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", size = 62716 }, + { url = "https://files.pythonhosted.org/packages/b1/46/3f9cfa75c46b8a55d3a235456bc129a26431a65e4922fc9af66aa4e2db7e/pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", size = 82552 }, + { url = "https://files.pythonhosted.org/packages/64/bd/b108e1a288a63871be1cf062176dcd5be922c748f843f316440104a45df3/pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", size = 119532 }, + { url = "https://files.pythonhosted.org/packages/86/f2/fda71652a6baa0147891296a99b4145572538417609c164450beebcf8ebc/pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", size = 116166 }, + { url = "https://files.pythonhosted.org/packages/de/9e/10c5bf794eec650a3aab1b4fb1f6824f53011d111ddfdce1459dc357408a/pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", size = 60181 }, + { url = "https://files.pythonhosted.org/packages/b2/ea/055a9c1884be7c77dd68d9a7891e7a39c776c86946aa4630f8f9f8e48169/pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", size = 62714 }, + { url = "https://files.pythonhosted.org/packages/64/de/375aa14daaee107f987da76ca32f7a907fea00fa8b8afb67dc09bec0de91/pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", size = 57505 }, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", size = 357324 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", size = 247702 }, +] + +[[package]] +name = "python-multipart" +version = "0.0.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/23/abcfad10c3348cb6358400f8adbc21b523bbc6c954494fd0974428068672/python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132", size = 31024 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/ff/b1e11d8bffb5e0e1b6d27f402eeedbeb9be6df2cdbc09356a1ae49806dbf/python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18", size = 45711 }, +] + +[[package]] +name = "pytorch-lightning" +version = "1.8.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec", extra = ["http"] }, + { name = "lightning-utilities" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tensorboardx" }, + { name = "torch" }, + { name = "torchmetrics" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/38/db76e412e39acefd7b072b9715abd21f009657361e1c86ca832114d6fd70/pytorch-lightning-1.8.6.tar.gz", hash = "sha256:c4af783579a1528e07f40dd9bd0128c162bbbcf74fe1ce4292fec63fa7e76ada", size = 576205 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/b8/8f5d44a83f5243163b04cad2985e3d1ccf7db24d9a23c73362c5202d2a33/pytorch_lightning-1.8.6-py3-none-any.whl", hash = "sha256:8b6b4126b85c56a9dd08a03f7096ce749bcb452a9a50f6201a7165dbd92d866d", size = 800263 }, +] + +[[package]] +name = "pytz" +version = "2023.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/32/12032aa8c673ee16707a9b6cdda2b09c0089131f35af55d443b6a9c69c1d/pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", size = 317095 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/99/ad6bd37e748257dd70d6f85d916cafe79c0b0f5e2e95b11f7fbc82bf3110/pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb", size = 502345 }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240 }, + { url = "https://files.pythonhosted.org/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854 }, + { url = "https://files.pythonhosted.org/packages/3c/84/1a8e3d7a15490d28a5d816efa229ecb4999cdc51a7c30dd8914f669093b8/pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213", size = 8522963 }, + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284 }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748 }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941 }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + +[[package]] +name = "pyyaml" +version = "6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/2b/61d51a2c4f25ef062ae3f74576b01638bebad5e045f747ff12643df63844/PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", size = 124996 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/e5/4fea13230bcebf24b28c0efd774a2dd65a0937a2d39e94a4503438b078ed/PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", size = 197589 }, + { url = "https://files.pythonhosted.org/packages/91/49/d46d7b15cddfa98533e89f3832f391aedf7e31f37b4d4df3a7a7855a7073/PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", size = 173975 }, + { url = "https://files.pythonhosted.org/packages/5e/f4/7b4bb01873be78fc9fde307f38f62e380b7111862c165372cf094ca2b093/PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", size = 733711 }, + { url = "https://files.pythonhosted.org/packages/ef/ad/b443cce94539e57e1a745a845f95c100ad7b97593d7e104051e43f730ecd/PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", size = 757857 }, + { url = "https://files.pythonhosted.org/packages/02/25/6ba9f6bb50a3d4fbe22c1a02554dc670682a07c8701d1716d19ddea2c940/PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5", size = 682157 }, + { url = "https://files.pythonhosted.org/packages/0f/93/5f81d1925ce3b531f5ff215376445ec220887cd1c9a8bde23759554dbdfd/PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", size = 138123 }, + { url = "https://files.pythonhosted.org/packages/b7/09/2f6f4851bbca08642fef087bade095edc3c47f28d1e7bff6b20de5262a77/PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", size = 151651 }, + { url = "https://files.pythonhosted.org/packages/f8/54/799b059314b13e1063473f76e908f44106014d18f54b16c83a16edccd5ec/PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", size = 188559 }, + { url = "https://files.pythonhosted.org/packages/cb/5f/05dd91f5046e2256e35d885f3b8f0f280148568f08e1bf20421887523e9a/PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", size = 167479 }, + { url = "https://files.pythonhosted.org/packages/7f/d9/6a0d14ac8d3b5605dc925d177c1d21ee9f0b7b39287799db1e50d197b2f4/PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", size = 732352 }, + { url = "https://files.pythonhosted.org/packages/68/3f/c027422e49433239267c62323fbc6320d6ac8d7d50cf0cb2a376260dad5f/PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", size = 753020 }, + { url = "https://files.pythonhosted.org/packages/56/8f/e8b49ad21d26111493dc2d5cae4d7efbd0e2e065440665f5023515f87f64/PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", size = 757901 }, + { url = "https://files.pythonhosted.org/packages/fc/48/531ecd926fe0a374346dd811bf1eda59a95583595bb80eadad511f3269b8/PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", size = 129269 }, + { url = "https://files.pythonhosted.org/packages/59/00/30e33fcd2a4562cd40c49c7740881009240c5cbbc0e41ca79ca4bba7c24b/PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", size = 143181 }, +] + +[[package]] +name = "pyzmq" +version = "25.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/7f/24a55c3393d54570f26fa8845e8e42e813bf1b7fb668ed5d3de76b71dbe9/pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149", size = 1209578 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/8c/548bd091bbace5ce0463f74471f8fc5d73cd68df8e77d6114e5f2325e52b/pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315", size = 1825990 }, + { url = "https://files.pythonhosted.org/packages/00/a2/72b840106d96cea129d35fcd6474bf8b7b94ae44a77e6e0b13208b9a7dd8/pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee", size = 1235776 }, + { url = "https://files.pythonhosted.org/packages/df/40/309fb581d4500c5b44e0ea4077fc722a160f78b30b2c7153c4bcbc425d18/pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c", size = 863922 }, + { url = "https://files.pythonhosted.org/packages/8f/aa/89ae1727f702f3d39a63817d5ecfcec1c79708921bf22766bf0a74f2ffe2/pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54", size = 1115701 }, + { url = "https://files.pythonhosted.org/packages/b9/39/44e7bc417837e589b2d5fd7382ddb0afdf317cafad9cdf50690e85d8fb35/pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6", size = 1064742 }, + { url = "https://files.pythonhosted.org/packages/58/cf/389676efe51bcd797e81bba7a9f57a562fd607f12d48019c3169a519bce5/pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485", size = 1062247 }, + { url = "https://files.pythonhosted.org/packages/94/c4/69bc2d6548592ece02b4a9cedf13d5f5c76938e5e626a3993b28290df663/pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc", size = 1390852 }, + { url = "https://files.pythonhosted.org/packages/44/60/008c3bbed1b0ddd02ec94a3b87bc7c0d211fe03f9af5041cc903c7e0e30b/pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354", size = 1720677 }, + { url = "https://files.pythonhosted.org/packages/cb/c3/dd49db945fea3d80320c864db72460b0a3b9148bbf214a92c2b1600b5cf4/pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd", size = 1610977 }, + { url = "https://files.pythonhosted.org/packages/74/7a/9599e16f92e5fc943d951755ba5b5c21e469837f7e5149ea68b8a26a9309/pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca", size = 875207 }, + { url = "https://files.pythonhosted.org/packages/8d/8d/f41575d2cbd7322a103bb79b67bf35cc5f3a9d9a51c7375e58c1ba728125/pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e", size = 1133209 }, + { url = "https://files.pythonhosted.org/packages/58/6f/2c08c1a7b89cf7b269ef35ab4cbcaed331fb4db042a9cfc2e83e112fcfce/pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128", size = 1815356 }, + { url = "https://files.pythonhosted.org/packages/11/be/42b11d891abc376eecd8732b3bba8102a9845528c21326cb7f114bf9b7a2/pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e", size = 1230324 }, + { url = "https://files.pythonhosted.org/packages/1a/98/c97a06df9403a2e14f24a420b9b2ee6ba618535bbb1d328f6149788add80/pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c", size = 865586 }, + { url = "https://files.pythonhosted.org/packages/c9/f7/8bf9fcb89bf928301b43b974bdc958ef880eaabfcc45015e5ba6a3a8ed47/pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5", size = 1115961 }, + { url = "https://files.pythonhosted.org/packages/1a/e5/2cfa142fa455a9d935a699f45396a9b2a3dff152d272472c1c4f1ef8a302/pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae", size = 1066061 }, + { url = "https://files.pythonhosted.org/packages/34/2f/d9ff6f3e013b08262a75ba45dceb919a29d717c125cb3bd89f998c107c30/pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a", size = 1061337 }, + { url = "https://files.pythonhosted.org/packages/39/c9/52bb45a31aa8d599ee550ae6d5513eea9bfaf9e5a22059866afc92a436cc/pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7", size = 1393025 }, + { url = "https://files.pythonhosted.org/packages/7e/d0/94367b6680500eafd1417e3b6b9a896e5eb963f5cb26c3d4e5ea29d67ca6/pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8", size = 1723344 }, + { url = "https://files.pythonhosted.org/packages/ec/46/335df4c0f92703886ca0f6670db5291a99813961bf6fab9ea0b1676ca23e/pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177", size = 1612315 }, + { url = "https://files.pythonhosted.org/packages/69/62/281d35f31b14586f058a152ea4252b65bfc9edc582bd49b19c8e96b39668/pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413", size = 873663 }, + { url = "https://files.pythonhosted.org/packages/1c/35/006d8734ff4b15b462da1e7c5f50d5e70d5764dda14894e682ca12172617/pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182", size = 1130741 }, +] + +[[package]] +name = "regex" +version = "2023.3.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/29/bd8de07107bc952e0e2783243024e1c125e787fd685725a622e4ac7aeb3c/regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7", size = 391964 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/59/3a725abd03da0a10555b9afcc954a80e5cd6d040f2bbc0e81a944715b63d/regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8", size = 294423 }, + { url = "https://files.pythonhosted.org/packages/c6/25/76a877c64d2677d6ea0b4011db4c3966eba1c473d342e5a2e0d8dcb70752/regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134", size = 288882 }, + { url = "https://files.pythonhosted.org/packages/e5/51/7a33a1a655fbd127d7ae2ab542d26530ec51e244169e371c91b256b39927/regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021", size = 768952 }, + { url = "https://files.pythonhosted.org/packages/5d/85/524279048b9405be3d3318a5926b142b4d75f40083fed40fb21c957df480/regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15", size = 809560 }, + { url = "https://files.pythonhosted.org/packages/d0/c3/3d59eddb6fe745f5152a5da4f666125e9a2aae1609797cb5cd2d0a4141eb/regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879", size = 794789 }, + { url = "https://files.pythonhosted.org/packages/29/90/804db81268636547e25004404587e75a269fd6f7a38aa2d9e1209ed61544/regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea", size = 769612 }, + { url = "https://files.pythonhosted.org/packages/4f/bf/3177bc0051029df278ed9cfc6de94753b2968b0d82bc9246a3e37a652dfa/regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715", size = 759712 }, + { url = "https://files.pythonhosted.org/packages/5a/e1/c191c9752d1d66daf9fb6443db13c1d3c5405a4b2b0136cbb86126b8758c/regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699", size = 685764 }, + { url = "https://files.pythonhosted.org/packages/bb/4f/65c14619af6e6640d8eac947a8322582207beed27fb29fbb927653a51b38/regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d", size = 738025 }, + { url = "https://files.pythonhosted.org/packages/e1/0b/8f4c19f0ced880501f96906e65f484ef1b42fe6bd93f79c9b5c1914f2618/regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd", size = 728230 }, + { url = "https://files.pythonhosted.org/packages/c6/0d/1ccc866a040c968ab331370e20b5ac48165459f76577c89f06e0f89c4dc4/regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d", size = 759892 }, + { url = "https://files.pythonhosted.org/packages/fb/55/98d7ff983be33d572a1bbe073b6b1b5db249f467dcff2bb8d516b66c9848/regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910", size = 763364 }, + { url = "https://files.pythonhosted.org/packages/47/ac/7631ae51893aca9478cc26422ce66563682880b849c27af1cf0e2695e20b/regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0", size = 741163 }, + { url = "https://files.pythonhosted.org/packages/59/ed/8a4bc1983cc95fdb19b8627ffc44361a281dcc03da0bfdde4e6a07113a5b/regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d", size = 255974 }, + { url = "https://files.pythonhosted.org/packages/79/67/f9a546833ed75af00e8e5163ec0fe2771bf224410b914d7f95fbb7808d25/regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98", size = 267927 }, + { url = "https://files.pythonhosted.org/packages/a7/69/275f20553b194755c4a5e36f337862eccf6942ec55f794341f62e93dba65/regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b", size = 294472 }, + { url = "https://files.pythonhosted.org/packages/2b/c2/12f0de728011be620421cec5884f41b651176821487b67631cc093585215/regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797", size = 288845 }, + { url = "https://files.pythonhosted.org/packages/1b/cc/628702b6b71d4e3c84dedd7c37210e30e58e235b826dbc0320f51cdbe1d5/regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb", size = 780312 }, + { url = "https://files.pythonhosted.org/packages/d6/00/cc5e8fde1042bbea9aee31e420b269655ae570cb85f3e52a6586cfaa1492/regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1", size = 822169 }, + { url = "https://files.pythonhosted.org/packages/73/98/b96802c10f51d81770496812489854014578616ae62e874e2fd2a4aa4556/regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f", size = 806325 }, + { url = "https://files.pythonhosted.org/packages/84/72/9e6273be7027630c65650b43f964845888cc10152fd92a087007197685f1/regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09", size = 780981 }, + { url = "https://files.pythonhosted.org/packages/a3/ad/e6ff08c482396fc063858c7919618235300455bd86add3ab26def9c7d5e7/regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd", size = 771298 }, + { url = "https://files.pythonhosted.org/packages/26/30/1b061ad1f85d6147ee2d181e8e36503996bf386ef9fb1d5ff8afa88d7c70/regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d", size = 746310 }, + { url = "https://files.pythonhosted.org/packages/29/36/3d50a5f45efec70e4480de50a591e272d60c8cc1f4fce95298fc3fc66257/regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8", size = 736486 }, + { url = "https://files.pythonhosted.org/packages/6c/58/4e5e33e944f54dfe48e1fe7a1be6bde30e6553d4e0ba059ba4b111359515/regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6", size = 768561 }, + { url = "https://files.pythonhosted.org/packages/80/a5/964f6cf453c806fd46c97fa2ba432eff91767d1e5fd9d0d49ff9c97edc05/regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b", size = 774459 }, + { url = "https://files.pythonhosted.org/packages/b5/77/4e41254b2d6286d8a3e231480f11e79ea3cee7632f283063f24d9483e1a3/regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d", size = 750157 }, + { url = "https://files.pythonhosted.org/packages/84/eb/24dd2a4b708a3032673f8c459d14adb441456aa65630cb2d68085176b7c9/regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858", size = 255968 }, + { url = "https://files.pythonhosted.org/packages/72/18/dc772b16749461cd3ec24573934f040f9814d84c6559a8ca4da9ac6b8ae1/regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53", size = 267922 }, +] + +[[package]] +name = "requests" +version = "2.28.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/ee/391076f5937f0a8cdf5e53b701ffc91753e87b07d66bae4a09aa671897bf/requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf", size = 108206 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", size = 62822 }, +] + +[[package]] +name = "responses" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/a5/186653e51cb20fe3ac793403334d4d077fbb7bb18a9c5c2fce8304d5a2e2/responses-0.18.0.tar.gz", hash = "sha256:380cad4c1c1dc942e5e8a8eaae0b4d4edf708f4f010db8b7bcfafad1fcd254ff", size = 45885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/f3/2b3a6dc5986303b3dd1bbbcf482022acb2583c428cd23f0b6d37b1a1a519/responses-0.18.0-py3-none-any.whl", hash = "sha256:15c63ad16de13ee8e7182d99c9334f64fd81f1ee79f90748d527c28f7ca9dd51", size = 38735 }, +] + +[[package]] +name = "rfc3986" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/30/5b1b6c28c105629cc12b33bdcbb0b11b5bb1880c6cfbd955f9e792921aa8/rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835", size = 49378 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/e5/63ca2c4edf4e00657584608bee1001302bbf8c5f569340b78304f2f446cb/rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97", size = 31976 }, +] + +[package.optional-dependencies] +idna2008 = [ + { name = "idna" }, +] + +[[package]] +name = "safetensors" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917 }, + { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419 }, + { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493 }, + { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400 }, + { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891 }, + { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694 }, + { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642 }, + { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241 }, + { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001 }, + { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013 }, + { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687 }, + { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147 }, + { url = "https://files.pythonhosted.org/packages/0a/0c/95aeb51d4246bd9a3242d3d8349c1112b4ee7611a4b40f0c5c93b05f001d/safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace", size = 296677 }, + { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878 }, +] + +[[package]] +name = "scikit-learn" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/fa/8e158d81e3602da1e7bafbd4987938bc003fe4b0f44d65681e7f8face95a/scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7", size = 7269934 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/21/ee21352f69a980614cb4193d68a64a83aa2c0f80183c9485d6d61821a922/scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f", size = 9107257 }, + { url = "https://files.pythonhosted.org/packages/5a/43/5c4d21217df6a033999ee531fdfd52809263727b4afb26f7196a8ec709ae/scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb", size = 8455656 }, + { url = "https://files.pythonhosted.org/packages/48/92/a39d1c9e0a6cb5ed4112899ecca590138484356ba8c4274dde6c3893ff14/scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d", size = 9165302 }, + { url = "https://files.pythonhosted.org/packages/fa/1e/36d7609e84b50d4a2e5bc43cd5013d9ea885799e5813a1e9cf5bb1afd3f4/scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584", size = 9625294 }, + { url = "https://files.pythonhosted.org/packages/f4/4d/fe3b35e18407da4b386be58616bd0f941ea1762a6c6798267f3aa64ef5d5/scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c", size = 8306029 }, + { url = "https://files.pythonhosted.org/packages/27/4a/1afe473760b07663710a75437b795ef37362aebb8bf513ff3bbf78fbd0c6/scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f", size = 9024742 }, + { url = "https://files.pythonhosted.org/packages/2f/fd/9fcbe7fe94150e72d87120cbc462bde1971c3674e726b81f4a4c4fdfa8e1/scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590", size = 8375105 }, + { url = "https://files.pythonhosted.org/packages/d7/8a/301594a8bb1cfeeb95dd86aa7dfedd31e93211940105429abddf0933cfff/scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233", size = 9150797 }, + { url = "https://files.pythonhosted.org/packages/4c/64/a1e6e92b850b39200c82e3bc54d556b2c634b3904c39ac5cdb10b1c5765f/scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c", size = 9562879 }, + { url = "https://files.pythonhosted.org/packages/db/98/169b46a84b48f92df2b5e163fce75d471f4df933f8b3d925a61133210776/scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c", size = 8261146 }, +] + +[[package]] +name = "scipy" +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/a9/2bf119f3f9cff1f376f924e39cfae18dec92a1514784046d185731301281/scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5", size = 42407997 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/ac/b1f1bbf7b01d96495f35be003b881f10f85bf6559efb6e9578da832c2140/scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019", size = 35093243 }, + { url = "https://files.pythonhosted.org/packages/ea/e5/452086ebed676ce4000ceb5eeeb0ee4f8c6f67c7e70fb9323a370ff95c1f/scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e", size = 28772969 }, + { url = "https://files.pythonhosted.org/packages/04/0b/a1b119c869b79a2ab459b7f9fd7e2dea75a9c7d432e64e915e75586bd00b/scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f", size = 30886961 }, + { url = "https://files.pythonhosted.org/packages/1f/4b/3bacad9a166350cb2e518cea80ab891016933cc1653f15c90279512c5fa9/scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2", size = 34422544 }, + { url = "https://files.pythonhosted.org/packages/ec/e3/b06ac3738bf365e89710205a471abe7dceec672a51c244b469bc5d1291c7/scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1", size = 42484848 }, + { url = "https://files.pythonhosted.org/packages/e7/53/053cd3669be0d474deae8fe5f757bff4c4f480b8a410231e0631c068873d/scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd", size = 35003170 }, + { url = "https://files.pythonhosted.org/packages/0d/3e/d05b9de83677195886fb79844fcca19609a538db63b1790fa373155bc3cf/scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5", size = 28717513 }, + { url = "https://files.pythonhosted.org/packages/a5/3d/b69746c50e44893da57a68457da3d7e5bb75f6a37fbace3769b70d017488/scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35", size = 30687257 }, + { url = "https://files.pythonhosted.org/packages/21/cd/fe2d4af234b80dc08c911ce63fdaee5badcdde3e9bcd9a68884580652ef0/scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d", size = 34124096 }, + { url = "https://files.pythonhosted.org/packages/65/76/903324159e4a3566e518c558aeb21571d642f781d842d8dd0fd9c6b0645a/scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f", size = 42238704 }, +] + +[[package]] +name = "seaborn" +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/77/5cde8bc47df770486acf64f550839b4136d1696e5e4d57ce33fa1823972b/seaborn-0.12.2.tar.gz", hash = "sha256:374645f36509d0dcab895cba5b47daf0586f77bfe3b36c97c607db7da5be0139", size = 1439798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/2e/17bbb83fbf102687bb2aa3d808add39da820a7698159302a1a69bb82e01c/seaborn-0.12.2-py3-none-any.whl", hash = "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08", size = 293284 }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552 }, +] + +[[package]] +name = "sentencepiece" +version = "0.1.97" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/87/f26695307c0aa00e6938f5de795fc7f2c718a448b48d29a4c8c8dbf829d3/sentencepiece-0.1.97.tar.gz", hash = "sha256:c901305e0a710bbcd296f66d79e96f744e6e175b29812bd5178318437d4e1f6c", size = 524731 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/42/9993a88794b1482a8d70dd57fb1255ab07080fa96a8ed681494074c21940/sentencepiece-0.1.97-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6f249c8f1852893be86eae66b19d522c5fb30bbad4fe2d1b07f06fdc86e1907e", size = 2340927 }, + { url = "https://files.pythonhosted.org/packages/5d/da/e668160f7f4e446360608e22f927b56b2f5f614f746f85e3a570302f713a/sentencepiece-0.1.97-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09e1bc53178de70c557a9ba4fece07364b4416ce3d36570726b3372b68aea135", size = 1204690 }, + { url = "https://files.pythonhosted.org/packages/0c/99/107fbd7397839249609e02e2820d811ffcfec8fe79200af7b36088fbda13/sentencepiece-0.1.97-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667193c57fb48b238be7e3d7636cfc8da56cb5bac5559d8f0b647334e1175be8", size = 1149144 }, + { url = "https://files.pythonhosted.org/packages/78/66/70a02c8e3c4e58705de62e079b40b3f5e00ddd41027dedec853dea7bb02f/sentencepiece-0.1.97-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2780531985af79c6163f63d4f200fec8a28b70b6768d2c19f70d01568a4524e8", size = 1231941 }, + { url = "https://files.pythonhosted.org/packages/cb/6f/42d484390fbbb8451dade6440d2594e634bdd2e5bcacdb9bef54997c796f/sentencepiece-0.1.97-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:205050670c53ef9015e2a98cce3934bfbcf0aafaa14caa0c618dd5667bc217ee", size = 1328738 }, + { url = "https://files.pythonhosted.org/packages/40/e0/ed30ef89551443c9e7a7e8844727c064294e28836c6ca1a4452283077b46/sentencepiece-0.1.97-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b183dadef8e8b6b4645c1c20692d7be0a13ecc3ec1a07b3885c8905516675f", size = 1276647 }, + { url = "https://files.pythonhosted.org/packages/f5/b9/a887a0855acccceb2b26a852a5f78fb24d084628f1ab2c7eaf00e9e01cb2/sentencepiece-0.1.97-cp310-cp310-win32.whl", hash = "sha256:ee3c9dbd558d8d85bb1617087b86df6ea2b856a528669630ce6cedeb4353b823", size = 1061891 }, + { url = "https://files.pythonhosted.org/packages/b2/6d/bf0668915c5a526b6eb24b7663f14fd61f6ee194a399b48f942f10e8eb81/sentencepiece-0.1.97-cp310-cp310-win_amd64.whl", hash = "sha256:f7dc55379e2f7dee86537180283db2e5f8418c6825fdd2fe436c724eb5604c05", size = 1133120 }, +] + +[[package]] +name = "sentry-sdk" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/e4/b82bfa04cf41fb18650fce8f0eff50816ada964115e90533a872ac3946d6/sentry-sdk-1.19.1.tar.gz", hash = "sha256:7ae78bd921981a5010ab540d6bdf3b793659a4db8cccf7f16180702d48a80d84", size = 175687 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/dc/f1d34d1fc0e272003be75a3b4d54517ade4a14960c4ebbe7fe4f58c3d39b/sentry_sdk-1.19.1-py2.py3-none-any.whl", hash = "sha256:885a11c69df23e53eb281d003b9ff15a5bdfa43d8a2a53589be52104a1b4582f", size = 199223 }, +] + +[[package]] +name = "setproctitle" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/47/ac709629ddb9779fee29b7d10ae9580f60a4b37e49bce72360ddf9a79cdc/setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd", size = 27173 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/a9/19a77c1ead9b0b3e9e366aafb64d8cdf31ed25e42a781dded07907332300/setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe", size = 16870 }, + { url = "https://files.pythonhosted.org/packages/20/a3/8d19f528ffbb3496040bc0cbef02a8678a102b9c04effd55ac1fcd7d2c07/setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18", size = 11287 }, + { url = "https://files.pythonhosted.org/packages/43/b1/c951d93fb88f684f65e7160b918fff77c0ac348d240839e8a53b1b05b119/setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005", size = 31227 }, + { url = "https://files.pythonhosted.org/packages/49/a3/0c011499a8e0ee3dd38d73b1e32e4ca4f2cb903b6d317f4b96d78787bde8/setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7", size = 32574 }, + { url = "https://files.pythonhosted.org/packages/89/78/670e28d65a1c70a0e1a06ea7c10ef57235d0e303d3019fedef7ce801e0f8/setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d", size = 29690 }, + { url = "https://files.pythonhosted.org/packages/46/b6/d1a2fc143997d89dc2dd9b55646fddb702699624510d619e101c8e149bdf/setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246", size = 30728 }, + { url = "https://files.pythonhosted.org/packages/3a/e6/132696161734102966b1ad558e05b0ff65ed9d192f1e781b0d55cec88d64/setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494", size = 38540 }, + { url = "https://files.pythonhosted.org/packages/87/88/106215fddc0fbb64337715406d5f5f97f999a3c7de98a7476d39609332a0/setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806", size = 36970 }, + { url = "https://files.pythonhosted.org/packages/ea/85/a5df3ef79b642a188ace9f73fd9b2527bd2549a155aaa3e7d6a5bafd3061/setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94", size = 39842 }, + { url = "https://files.pythonhosted.org/packages/45/8c/295ff4d931fa9e45510eb29d772aed93c5b1c365f5e54a55129a91c96eba/setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1", size = 38202 }, + { url = "https://files.pythonhosted.org/packages/55/d4/6cc75bf9aee7f4f1cb557f05d4ced06b33315d39f0c5e3f2a02000c5b86f/setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099", size = 10989 }, + { url = "https://files.pythonhosted.org/packages/9f/0b/207ccb4f375b9fc51c9d7f4df259055d608fa9df4a7bd9125ba1a296ad78/setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d", size = 11737 }, + { url = "https://files.pythonhosted.org/packages/4a/f9/f4e96c6c95d5e5e958405292ddb9dd932ec083c6f76ba55458b6caa4db02/setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa", size = 16936 }, + { url = "https://files.pythonhosted.org/packages/8c/4c/1b2c04a95da8e6c0951223bfbb0d4b56876ba35567455b88bbc9e48b7052/setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077", size = 11292 }, + { url = "https://files.pythonhosted.org/packages/e1/8d/4ad25c2e80e81f9c698add6c7a96e547c7194412ce85bce6c2c75eb8d2f8/setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de", size = 31575 }, + { url = "https://files.pythonhosted.org/packages/1c/4c/c1ef1118bcb756fd10bee57a2748240b033168501c77aec80d0eb9874f64/setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e", size = 32915 }, + { url = "https://files.pythonhosted.org/packages/d7/76/46e536e87e0e46309f5664ebecebbbc541315d81ad301e93204d0248beed/setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf", size = 30080 }, + { url = "https://files.pythonhosted.org/packages/18/c7/890da8a5790fa733a9fbf47d92e8226c1ff4bf1853dbdbabbdaa3aa6dffc/setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3", size = 31071 }, + { url = "https://files.pythonhosted.org/packages/0e/08/a1fa4d4a3077604e71eb6b76795814b44a8a1fec874b06bca853157b2313/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4", size = 41228 }, + { url = "https://files.pythonhosted.org/packages/4d/7d/9c8371cde990ecce6d263c9b482bae0e75d49505589f1f7ef1ad4f756bbd/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77", size = 39720 }, + { url = "https://files.pythonhosted.org/packages/26/a8/e406c98df9ff7a7481b8bb9ab4b410405a39751ec8b54ac8108bd0c80b4d/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80", size = 42765 }, + { url = "https://files.pythonhosted.org/packages/96/e7/e409f944c8d22667f725eaba9d6c505ce6c44d91ff5922acc8347447ac66/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7", size = 41084 }, + { url = "https://files.pythonhosted.org/packages/3f/a4/931fb6e85ea5ea7569e563b8a97b43c695f97bb3fa88ee7d70492329679d/setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc", size = 11051 }, + { url = "https://files.pythonhosted.org/packages/7b/93/69ee2f7a651ca6a01b05aab3c55b9db3a44ff50125120cfacd46ced239b5/setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff", size = 11803 }, +] + +[[package]] +name = "setuptools" +version = "68.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/20/d8dd9d8becaf3e2d6fdc17cc41870d5ada5ceda518996cf5968c2ca71bd8/setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d", size = 2198001 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", size = 805130 }, +] + +[[package]] +name = "six" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 }, +] + +[[package]] +name = "smmap" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/2d/39c6c57032f786f1965022563eec60623bb3e1409ade6ad834ff703724f3/smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936", size = 22437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/01/7caa71608bc29952ae09b0be63a539e50d2484bc37747797a66a60679856/smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94", size = 24271 }, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/50/d49c388cae4ec10e8109b1b833fd265511840706808576df3ada99ecb0ac/sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", size = 17103 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384", size = 10165 }, +] + +[[package]] +name = "stack-data" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/18/aa7f2b111aeba2cd83503254d9133a912d7f61f459a0c8561858f0d72a56/stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815", size = 44146 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/81/aa96c25c27f78cdc444fec27d80f4c05194c591465e491a1358d8a035bc1/stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8", size = 24496 }, +] + +[[package]] +name = "starlette" +version = "0.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/55/98746af96f57a0ff4f108c5ac84c130af3c4e291272acf446afc67d5d5d8/starlette-0.26.1.tar.gz", hash = "sha256:41da799057ea8620e4667a3e69a5b1923ebd32b1819c8fa75634bbe8d8bea9bd", size = 51307 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/48/f9c1ec6bee313aba264fbc2483d9070f4e4526f2538e2b55b1e4a391d938/starlette-0.26.1-py3-none-any.whl", hash = "sha256:e87fce5d7cbdde34b76f0ac69013fd9d190d581d80681493016666e6f96c6d5e", size = 66917 }, +] + +[[package]] +name = "sympy" +version = "1.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/36/4667b08bc45131fe655a27b1a112c1730f3244343c53a338f44d730bd6ba/sympy-1.11.1.tar.gz", hash = "sha256:e32380dce63cb7c0108ed525570092fd45168bdae2faa17e528221ef72e88658", size = 12921384 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/49/a2d03101e2d28ad528968144831d506344418ef1cc04839acdbe185889c2/sympy-1.11.1-py3-none-any.whl", hash = "sha256:938f984ee2b1e8eae8a07b884c8b7a1146010040fccddc6539c54f401c8f6fcf", size = 6471005 }, +] + +[[package]] +name = "tensorboardx" +version = "2.6.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/9b/c2b5aba53f5e27ffcf249fc38485836119638f97d20b978664b15f97c8a6/tensorboardX-2.6.2.2.tar.gz", hash = "sha256:c6476d7cd0d529b0b72f4acadb1269f9ed8b22f441e87a84f2a3b940bb87b666", size = 4778030 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl", hash = "sha256:160025acbf759ede23fd3526ae9d9bfbfd8b68eb16c38a010ebe326dc6395db8", size = 101700 }, +] + +[[package]] +name = "termcolor" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/4e/b2a54a21092ad2d5d70b0140e4080811bee06a39cc8481651579fe865c89/termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a", size = 11340 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/f4/8ddd8a684b4c005345f45740a449d93d0af7ccecd91319d0f4426cf08b36/termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7", size = 6584 }, +] + +[[package]] +name = "threadpoolctl" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/c7/3d85f8b3894ba7228d0c74e16e97a36a72b2cd2b0e0f8f89b5d435d11f71/threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380", size = 33651 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/cf/6e354304bcb9c6413c4e02a747b600061c21d38ba51e7e544ac7bc66aecc/threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b", size = 14928 }, +] + +[[package]] +name = "tokenize-rt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/01/fb40ea8c465f680bf7aa3f5bee39c62ba8b7f52c38048c27aa95aff4f779/tokenize_rt-5.0.0.tar.gz", hash = "sha256:3160bc0c3e8491312d0485171dea861fc160a240f5f5766b72a1165408d10740", size = 5329 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/12/4c7495f25b4c9131706f3aaffb185d4de32c02a6ee49d875e929c5b7c919/tokenize_rt-5.0.0-py2.py3-none-any.whl", hash = "sha256:c67772c662c6b3dc65edf66808577968fb10badfc2042e3027196bed4daf9e5a", size = 5848 }, +] + +[[package]] +name = "tokenizers" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/d9/af2821b5934ed871f716eb65fb3bd43e7bc70b99191ec08f20cfd642d0a1/tokenizers-0.13.2.tar.gz", hash = "sha256:f9525375582fd1912ac3caa2f727d36c86ff8c0c6de45ae1aaff90f87f33b907", size = 359067 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/7f/f0e7aac969258fd12277b91039e30cf1c40ec9aa74233eade751bc426c3c/tokenizers-0.13.2-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:a6f36b1b499233bb4443b5e57e20630c5e02fba61109632f5e00dab970440157", size = 3789316 }, + { url = "https://files.pythonhosted.org/packages/1f/11/7f41721f56ac5433379e6fd8b4a2529dfda73bc5d0d4d9d0414176616440/tokenizers-0.13.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:bc6983282ee74d638a4b6d149e5dadd8bc7ff1d0d6de663d69f099e0c6bddbeb", size = 3741547 }, + { url = "https://files.pythonhosted.org/packages/62/39/b2258b56ba320feb6f1ef7eea4a6e5f0d302e58afe64e3fefa46e90a5a53/tokenizers-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16756e6ab264b162f99c0c0a8d3d521328f428b33374c5ee161c0ebec42bf3c0", size = 7267438 }, + { url = "https://files.pythonhosted.org/packages/d3/f8/29300ea9665fe16daa698bf604b7c4763db8a0e312325bcab84cd9a48407/tokenizers-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b10db6e4b036c78212c6763cb56411566edcf2668c910baa1939afd50095ce48", size = 8351133 }, + { url = "https://files.pythonhosted.org/packages/1c/ba/09885063e7fd8790901cfa66bac37cc4924f017b9e0389d9b74763504064/tokenizers-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:238e879d1a0f4fddc2ce5b2d00f219125df08f8532e5f1f2ba9ad42f02b7da59", size = 7927706 }, + { url = "https://files.pythonhosted.org/packages/e6/9e/d23618ec1eb6ea0aa68e96394f097088881465d9d688fca08117ddf1f829/tokenizers-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47ef745dbf9f49281e900e9e72915356d69de3a4e4d8a475bda26bfdb5047736", size = 7600549 }, + { url = "https://files.pythonhosted.org/packages/25/0a/940773b8f37912c24a6ad5e8c7f7184afbc189106be26976b963705c7f66/tokenizers-0.13.2-cp310-cp310-win32.whl", hash = "sha256:96cedf83864bcc15a3ffd088a6f81a8a8f55b8b188eabd7a7f2a4469477036df", size = 3035739 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/edbfeae9be672a39a67c61328a8ffecff5eb5623c788bbb6a8392e0d7cc5/tokenizers-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:eda77de40a0262690c666134baf19ec5c4f5b8bde213055911d9f5a718c506e1", size = 3298217 }, + { url = "https://files.pythonhosted.org/packages/9c/f9/21489d35d3d6a918d76c6faa1e8ca16ce42449f8cbc22b1eef895dc92388/tokenizers-0.13.2-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:9eee037bb5aa14daeb56b4c39956164b2bebbe6ab4ca7779d88aa16b79bd4e17", size = 3796746 }, + { url = "https://files.pythonhosted.org/packages/4d/ec/aab5818913fd8f944f7f9dcf2a2faecac663ace4e2cb58499fa1e7302481/tokenizers-0.13.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d1b079c4c9332048fec4cb9c2055c2373c74fbb336716a5524c9a720206d787e", size = 3748679 }, + { url = "https://files.pythonhosted.org/packages/a8/24/60c2e9fd36a434633368e31ff5c76c2ddf643be0461dd6101a0d79265222/tokenizers-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a689654fc745135cce4eea3b15e29c372c3e0b01717c6978b563de5c38af9811", size = 7267441 }, + { url = "https://files.pythonhosted.org/packages/71/df/932c2757acf713a8f587dc7d44233b5ea66b019adcff80055f24f35ad496/tokenizers-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3606528c07cda0566cff6cbfbda2b167f923661be595feac95701ffcdcbdbb21", size = 8351133 }, + { url = "https://files.pythonhosted.org/packages/70/1b/c322d13960f1e47b62af7b52e6e20fff9f9c8886d5fc4e56ea338782d34a/tokenizers-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41291d0160946084cbd53c8ec3d029df3dc2af2673d46b25ff1a7f31a9d55d51", size = 7927708 }, + { url = "https://files.pythonhosted.org/packages/9d/63/4559700815b47706bce5b75bf926960d673147b00720b645cddb79499370/tokenizers-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7892325f9ca1cc5fca0333d5bfd96a19044ce9b092ce2df625652109a3de16b8", size = 7600545 }, + { url = "https://files.pythonhosted.org/packages/73/84/a34f70d7b1e3e502628a3bc506c48d9feda1b7e2cc9ba129c3a0a45758fe/tokenizers-0.13.2-cp311-cp311-win32.whl", hash = "sha256:93714958d4ebe5362d3de7a6bd73dc86c36b5af5941ebef6c325ac900fa58865", size = 3035749 }, + { url = "https://files.pythonhosted.org/packages/0b/2c/14ffa9228c09b4e485f7ef32dfa696b127fa199174b11f038c5c5f00cdb2/tokenizers-0.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:fa7ef7ee380b1f49211bbcfac8a006b1a3fa2fa4c7f4ee134ae384eb4ea5e453", size = 3291795 }, +] + +[[package]] +name = "toolz" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/05/2008534bbaa716b46a2d795d7b54b999d0f7638fbb9ed0b6e87bfa934f84/toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194", size = 66264 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/5c/922a3508f5bda2892be3df86c74f9cf1e01217c2b1f8a0ac4841d903e3e9/toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f", size = 55835 }, +] + +[[package]] +name = "torch" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/cd/670e5e178db87065ee60f60fb35b040abbb819a1f686a91d9ff799fc5048/torch-2.0.0-1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c9090bda7d2eeeecd74f51b721420dbeb44f838d4536cc1b284e879417e3064a", size = 74256435 }, + { url = "https://files.pythonhosted.org/packages/21/7a/f43f2f490836dfc2de466dbc86cd75357d9ae3945c084efa290fad15976f/torch-2.0.0-1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bd42db2a48a20574d2c33489e120e9f32789c4dc13c514b0c44272972d14a2d7", size = 74257960 }, + { url = "https://files.pythonhosted.org/packages/b6/b1/f562cb533751c272d23f605858cd17d6a6c50fa8cd3c1f99539e2acd359f/torch-2.0.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7a9319a67294ef02459a19738bbfa8727bb5307b822dadd708bc2ccf6c901aca", size = 619894634 }, + { url = "https://files.pythonhosted.org/packages/47/1f/0213a42f0e290b3057601bd6f03f54712b1c39bdd014fb4d594455503dfa/torch-2.0.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9f01fe1f6263f31bd04e1757946fd63ad531ae37f28bb2dbf66f5c826ee089f4", size = 63204166 }, + { url = "https://files.pythonhosted.org/packages/87/e2/62dbdfc85d3b8f771bc4b1a979ee6a157dbaa8928981dabbf45afc6d13dc/torch-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:527f4ae68df7b8301ee6b1158ca56350282ea633686537b30dbb5d7b4a52622a", size = 172307267 }, + { url = "https://files.pythonhosted.org/packages/c6/20/8200a1c143aca65c72f820a5e7ba4cb3121ad655ad96c5e88395ba381f1f/torch-2.0.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:ce9b5a49bd513dff7950a5a07d6e26594dd51989cee05ba388b03e8e366fd5d5", size = 139828552 }, + { url = "https://files.pythonhosted.org/packages/59/5c/b032a68257189c0b9398bfd7542efa50b3f9a2d08b537167f4c02a69a4b6/torch-2.0.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:53e1c33c6896583cdb9a583693e22e99266444c4a43392dddc562640d39e542b", size = 55832064 }, + { url = "https://files.pythonhosted.org/packages/83/0b/b83dfba34421cfb1fc41583a479fbeaec0733ec9f59465702997d8de5e10/torch-2.0.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:09651bff72e439d004c991f15add0c397c66f98ab36fe60d5514b44e4da722e8", size = 619895084 }, + { url = "https://files.pythonhosted.org/packages/da/c2/cbac2af26537b82c265a4d53330c540e805185ca2272f33a918a3dedc3a0/torch-2.0.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d439aec349c98f12819e8564b8c54008e4613dd4428582af0e6e14c24ca85870", size = 63204594 }, + { url = "https://files.pythonhosted.org/packages/7f/fd/1438b0c44639d106892b19d386611fefd5add11d339ff623ac7a177b8323/torch-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2802f84f021907deee7e9470ed10c0e78af7457ac9a08a6cd7d55adef835fede", size = 172305868 }, + { url = "https://files.pythonhosted.org/packages/63/23/b2c6f3ef643c0a9a1d22ed2be9b5fe023d6cd1fe1729d5b03e9a695ab3d7/torch-2.0.0-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:01858620f25f25e7a9ec4b547ff38e5e27c92d38ec4ccba9cfbfb31d7071ed9c", size = 139533501 }, + { url = "https://files.pythonhosted.org/packages/ee/a9/43610ad590dad7109c3890bf9ffffaea76dab590a0e2cf6d6e957fee4613/torch-2.0.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:9a2e53b5783ef5896a6af338b36d782f28e83c8ddfc2ac44b67b066d9d76f498", size = 55834652 }, +] + +[[package]] +name = "torchmetrics" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lightning-utilities" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/01/b6c344ac04b53ebe3759ba938f1406775fe7649c44ba2e27e467be4e6fe9/torchmetrics-1.0.3.tar.gz", hash = "sha256:1c20ea2f0db434334e88da6c015ddf936d43379bfb403e9dc2a7272b0eab453c", size = 432173 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/90/9ac94af10cd1777859a92be1e8186325490654930e871f8bb219cc342868/torchmetrics-1.0.3-py3-none-any.whl", hash = "sha256:612a74ab8ebfcd4ebb38e5c370ce29a0e73af074948048f6f2233e25cf60da75", size = 731638 }, +] + +[[package]] +name = "tornado" +version = "6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/9e/225a41452f2d9418d89be5e32cf824c84fe1e639d350d6e8d49db5b7f73a/tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", size = 504849 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/bd/074254a55bfc82d7a1886abbd803600ef01cbd76ee66bc30307b2724130b/tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", size = 421754 }, + { url = "https://files.pythonhosted.org/packages/5c/0c/cbc0a98f7b8ef833bcb13c58d35d09e2c288ae67a35af4c8960b88f99ae9/tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", size = 419666 }, + { url = "https://files.pythonhosted.org/packages/71/cc/c1342382484d0178a79029109c433e406a60095da1c3605ca966775a70e5/tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", size = 424391 }, + { url = "https://files.pythonhosted.org/packages/11/30/ac70f5c5f03cf1cd0ae8199c80382387a9fe57e8f68853d5c9527c0219e5/tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", size = 423771 }, + { url = "https://files.pythonhosted.org/packages/19/bb/b6c3d1668d2b10ad38a584f3a1ec9737984e274f8b708e09fcbb96427f5c/tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", size = 423970 }, + { url = "https://files.pythonhosted.org/packages/cd/a4/761e45cea12b2af076d36240d464b371ab1231272948cdc49b7d81855c5c/tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", size = 426534 }, + { url = "https://files.pythonhosted.org/packages/60/08/e630a348b34a9ddd640aed67dafc6f0df425d8ac07d2fa60288f38321c69/tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", size = 426504 }, + { url = "https://files.pythonhosted.org/packages/f9/51/6f63a166d9a3077be100cbb13dcbce434e5654daaaa7003b0a045b9f6edf/tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", size = 426523 }, + { url = "https://files.pythonhosted.org/packages/ec/01/93e63530851ba8ef9685f1a9b91e324b28d28323a6b67400114ea65c5110/tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", size = 424877 }, + { url = "https://files.pythonhosted.org/packages/1c/26/cbfa1103e74a02e09dd53291e419da3ad4c5b948f52aea5800e6671b56e0/tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b", size = 425329 }, +] + +[[package]] +name = "tqdm" +version = "4.65.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/78/81191f56abb7d3d56963337dbdff6aa4f55805c8afd8bad64b0a34199e9b/tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5", size = 167542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/02/a2cff6306177ae6bc73bc0665065de51dfb3b9db7373e122e2735faf0d97/tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671", size = 77094 }, +] + +[[package]] +name = "traitlets" +version = "5.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/c3/205e88f02959712b62008502952707313640369144a7fded4cbc61f48321/traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9", size = 150207 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/75/c28e9ef7abec2b7e9ff35aea3e0be6c1aceaf7873c26c95ae1f0d594de71/traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8", size = 117376 }, +] + +[[package]] +name = "transformers" +version = "4.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/09/b401b54c748e7b97047732fde542dd84c6ea97b319899c858d78ca32f865/transformers-4.28.0.tar.gz", hash = "sha256:4f8f85fe149d6c007f6996aa2d3a0b8ff2ebf25c11446375a820343bf9e8529a", size = 6007440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/13/1ce598763b3669d43f192a7911bf2bf730a328012ab8801b93187a4f70d0/transformers-4.28.0-py3-none-any.whl", hash = "sha256:359a38860ded57a97b4ad9a9889465393e9e05a5de0824863607c85298cba0cd", size = 6952272 }, +] + +[[package]] +name = "triton" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cmake" }, + { name = "filelock" }, + { name = "lit" }, + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/ff6be541195daf77aa5c72303b2354661a69e717967d44d91eb4f3fdce32/triton-2.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38806ee9663f4b0f7cd64790e96c579374089e58f49aac4a6608121aa55e2505", size = 63268585 }, + { url = "https://files.pythonhosted.org/packages/b7/cd/4aa0179919306f9c2e3e5308f269d20c094b2a4e2963b656e9405172763f/triton-2.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:226941c7b8595219ddef59a1fdb821e8c744289a132415ddd584facedeb475b1", size = 63278135 }, +] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/20/06270dac7316220643c32ae61694e451c98f8caf4c8eab3aa80a2bedf0df/typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", size = 52399 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/25/5abcd82372d3d4a3932e1fa8c3dbf9efac10cc7c0d16e78467460571b404/typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4", size = 27736 }, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/01/865815288cb9b2cd2e7181bbe17fe55e4e3d30f29f28efcef2be4247e6a0/uc-micro-py-1.0.1.tar.gz", hash = "sha256:b7cdf4ea79433043ddfe2c82210208f26f7962c0cfbe3bacb05ee879a7fdb596", size = 4333 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/0e/738dbd15b1afe372d0d788e1e2112cfa67c9cf9e1c777360eaf9cd429caf/uc_micro_py-1.0.1-py3-none-any.whl", hash = "sha256:316cfb8b6862a0f1d03540f0ae6e7b033ff1fa0ddbe60c12cbe0d4cec846a69f", size = 6162 }, +] + +[[package]] +name = "urllib3" +version = "1.26.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/79/6372d8c0d0641b4072889f3ff84f279b738cd8595b64c8e0496d4e848122/urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305", size = 301444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/f5/890a0baca17a61c1f92f72b81d3c31523c99bec609e60c292ea55b387ae8/urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42", size = 140881 }, +] + +[[package]] +name = "uvicorn" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/fa/362dc074f4c886e4bff1d994ed1929ed2c2a5ba85827d8f1d745fbe66de2/uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032", size = 37176 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/f1/7c45fe2a09133e103dcf0621831545c268cd3f7a5d58dc7e470be91b2cd0/uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742", size = 57824 }, +] + +[[package]] +name = "wandb" +version = "0.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "click" }, + { name = "docker-pycreds" }, + { name = "gitpython" }, + { name = "pathtools" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sentry-sdk" }, + { name = "setproctitle" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/cf/54042e02097009937e16cf953f40eb32cd45fed4f1ebaaf08a8eb582abb3/wandb-0.14.1.tar.gz", hash = "sha256:bacd290b8be47917b5821c64d961299af6f3b6b27294ecec0d8abe9da8262b23", size = 1695073 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/58/e9cefbb93c7b0c3153943a7b11c80c0c62bc55965bf6d3547cb4b78df046/wandb-0.14.1-py3-none-any.whl", hash = "sha256:427bbe6972852d37e209971a400d0eb58169cad373d2100bb68ef0720c1b8fa8", size = 2006477 }, +] + +[[package]] +name = "wcwidth" +version = "0.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/5f/1e4bd82a9cc1f17b2c2361a2d876d4c38973a997003ba5eb400e8a932b6c/wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0", size = 35452 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/f4/c0584a25144ce20bfcf1aecd041768b8c762c1eb0aa77502a3f0baa83f11/wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", size = 29995 }, +] + +[[package]] +name = "websockets" +version = "10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/dc/549a807a53c13fd4a8dac286f117a7a71260defea9ec0c05d6027f2ae273/websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3", size = 84877 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/88/81c08fb3418c5aedf3776333f29443599729509a4f673d6598dd769d3d6b/websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48", size = 100633 }, + { url = "https://files.pythonhosted.org/packages/68/bd/c8bd8354fc629863a2db39c9182d40297f47dfb2ed3e178bc83041ce044b/websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab", size = 97870 }, + { url = "https://files.pythonhosted.org/packages/20/7a/bd0ce7ac1cfafc76c84d6e8051bcbd0f7def8e45207230833bd6ff77a41d/websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c", size = 97945 }, + { url = "https://files.pythonhosted.org/packages/25/a7/4e32f8edfc26339d8d170fe539e0b83a329c42d974dacfe07a0566390aef/websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032", size = 107446 }, + { url = "https://files.pythonhosted.org/packages/1c/4b/cab8fed34c3a29d4594ff77234f6e6b45feb35331f1c12fccf92ca5486dd/websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4", size = 106455 }, + { url = "https://files.pythonhosted.org/packages/4d/6f/2388f9304cdaa0215b6388f837c6dbfe6d63ac1bba8c196e3b14eea1831e/websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50", size = 106763 }, + { url = "https://files.pythonhosted.org/packages/0c/56/b2d373ed19b4e7b6c5c7630d598ba10473fa6131e67e69590214ab18bc09/websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8", size = 111489 }, + { url = "https://files.pythonhosted.org/packages/a1/f6/83da14582fbb0496c47a4c039bd6e802886a0c300e9795c0f839fd1498e3/websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1", size = 110721 }, + { url = "https://files.pythonhosted.org/packages/37/02/ef21ca4698c2fd950250e5ac397fd07b0c9f16bbd073d0ea64c25baef9c1/websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331", size = 111343 }, + { url = "https://files.pythonhosted.org/packages/a1/6f/60e5f6e114b6077683d74da5df0d4af647a9e6d2a18b4698f577b2cb7c14/websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a", size = 100918 }, + { url = "https://files.pythonhosted.org/packages/1e/76/163a18626001465a309bf74b6aeb301d7092e304637fe00f89d7efc75c44/websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089", size = 101442 }, + { url = "https://files.pythonhosted.org/packages/60/3a/6dccbe2725d13c398b90cbebeea684cda7792e6d874f96417db900556ad0/websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4", size = 100656 }, + { url = "https://files.pythonhosted.org/packages/d1/60/0a6cb94e25b981e428c1cdcc2b0a406ac6e1dfc78d8a81c8a4ee7510e853/websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f", size = 97896 }, + { url = "https://files.pythonhosted.org/packages/cc/19/2f003f9f81c0fab2eabb81d8fc2fce5fb5b5714f1b4abfe897cb209e031d/websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c", size = 97947 }, + { url = "https://files.pythonhosted.org/packages/5d/3c/fc1725524e48f624df77f5998b1c7070fdddec3ae67a2ffbc99ffd116269/websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46", size = 108024 }, + { url = "https://files.pythonhosted.org/packages/68/ec/3267f8bbe8a4a5e181ab3fc67cc137f0966ab9e9a4da14ffc603f320b9e6/websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96", size = 107020 }, + { url = "https://files.pythonhosted.org/packages/d5/5d/d0b039f0db0bb1fea93437721cf3cd8a244ad02a86960c38a3853d5e1fab/websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa", size = 107398 }, + { url = "https://files.pythonhosted.org/packages/d1/c6/9489869aa591e6a8941b0af2302f8383e199e90477559a510713d41bfa45/websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c", size = 112842 }, + { url = "https://files.pythonhosted.org/packages/0c/f0/195097822f8edc4ffa355f6463a1890928577517382c0baededc760f9397/websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106", size = 112118 }, + { url = "https://files.pythonhosted.org/packages/19/a3/02ce75ffca3ef147cc0f44647c67acb3171b5a09910b5b9f083b5ca395a6/websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9", size = 112714 }, + { url = "https://files.pythonhosted.org/packages/b0/fc/a818cddc63589e12d5eff9b51a59aad82e2adf35279493248a3742c41f85/websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8", size = 100918 }, + { url = "https://files.pythonhosted.org/packages/27/bb/6327e8c7d4dd7d5b450b409a461be278968ce05c54da13da581ac87661db/websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882", size = 101444 }, +] + +[[package]] +name = "wheel" +version = "0.41.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/99/78c4f3bd50619d772168bec6a0f34379b02c19c9cced0ed833ecd021fd0d/wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985", size = 98050 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", size = 64848 }, +] + +[[package]] +name = "xxhash" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/90/666a4d4d96a93ddaaaa0142ef8c1bd20f7135a7f1114a894f4d6efac16c5/xxhash-3.2.0.tar.gz", hash = "sha256:1afd47af8955c5db730f630ad53ae798cf7fae0acb64cebb3cf94d35c47dd088", size = 74561 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/33/74f8a77eb6f98cf2b27f0c347deb696395d4daf5eb56779aba61629a40b0/xxhash-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af44b9e59c4b2926a4e3c7f9d29949ff42fcea28637ff6b8182e654461932be8", size = 35021 }, + { url = "https://files.pythonhosted.org/packages/3c/bc/5da8254bc46f0eea4a95c8a6cc189f2694fb6387d5fc30eede810dc939e7/xxhash-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1bdd57973e2b802ef32553d7bebf9402dac1557874dbe5c908b499ea917662cd", size = 31574 }, + { url = "https://files.pythonhosted.org/packages/35/af/294352c37eacc63371304450c1c5f8faf485a51f3e3580c39de4c68d9a87/xxhash-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b7c9aa77bbce61a5e681bd39cb6a804338474dcc90abe3c543592aa5d6c9a9b", size = 242735 }, + { url = "https://files.pythonhosted.org/packages/bf/46/840e16ac11fe943af3edcf4d4ffcad997e9e6942782adae3808bf1e396e0/xxhash-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11bf87dc7bb8c3b0b5e24b7b941a9a19d8c1f88120b6a03a17264086bc8bb023", size = 207406 }, + { url = "https://files.pythonhosted.org/packages/23/15/16d6cf03c87f08cd5679ecaab46b7b00cb7f08feaf844e1ce1152cc310dc/xxhash-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2783d41487ce6d379fdfaa7332fca5187bf7010b9bddcf20cafba923bc1dc665", size = 287675 }, + { url = "https://files.pythonhosted.org/packages/32/c3/4d24d4868fab9d9c8980ce00f01e3302565b06e712129d7dda779f9bb714/xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:561076ca0dcef2fbc20b2bc2765bff099e002e96041ae9dbe910a863ca6ee3ea", size = 212459 }, + { url = "https://files.pythonhosted.org/packages/bc/35/0a315fea9c268944cb75b0f50f1f4c8b5b1aee02834c8adb7f0fa86f07b2/xxhash-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a26eeb4625a6e61cedc8c1b39b89327c9c7e1a8c2c4d786fe3f178eb839ede6", size = 220629 }, + { url = "https://files.pythonhosted.org/packages/cf/9c/0752f0961929f80a164a8704d8eca85c116da700c15652a26bede8cd73c8/xxhash-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d93a44d0104d1b9b10de4e7aadf747f6efc1d7ec5ed0aa3f233a720725dd31bd", size = 266505 }, + { url = "https://files.pythonhosted.org/packages/5b/d7/bd456487842b5e05b1c02c19a06887bc039f239e6cd9dca453ee2ae83009/xxhash-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:89585adc73395a10306d2e2036e50d6c4ac0cf8dd47edf914c25488871b64f6d", size = 196695 }, + { url = "https://files.pythonhosted.org/packages/95/09/a0c0b6163d7cdbac3dac264ffd135846254d7894f8438f83b93152659771/xxhash-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a892b4b139126a86bfdcb97cd912a2f8c4e8623869c3ef7b50871451dd7afeb0", size = 209962 }, + { url = "https://files.pythonhosted.org/packages/d0/0b/6c101322d357b68cb857bdda62bca7236e7c87214177757cc03fbe578afc/xxhash-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e998efb190653f70e0f30d92b39fc645145369a4823bee46af8ddfc244aa969d", size = 289633 }, + { url = "https://files.pythonhosted.org/packages/8d/0a/f0ccaab9d63c5b4f97e3aac669018ae7a116fbb5532c9ff8846f177a3eca/xxhash-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8ed3bd2b8bb3277710843ca63e4f5c3ee6f8f80b083be5b19a7a9905420d11e", size = 232262 }, + { url = "https://files.pythonhosted.org/packages/59/d3/65d7cebf8ed49afeff7aa3cf5421db9af6b046ac411dae8423a1eba11270/xxhash-3.2.0-cp310-cp310-win32.whl", hash = "sha256:20181cbaed033c72cb881b2a1d13c629cd1228f113046133469c9a48cfcbcd36", size = 31121 }, + { url = "https://files.pythonhosted.org/packages/db/16/e9b793ee8542449eeb99682d2228af1525de1dab127c61ce142fb885c2b8/xxhash-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a0f7a16138279d707db778a63264d1d6016ac13ffd3f1e99f54b2855d6c0d8e1", size = 30880 }, + { url = "https://files.pythonhosted.org/packages/73/e5/9df2bfe36fe98ff7b177591008d09a8b6a0fb01923c598d641f7fb976dae/xxhash-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5daff3fb5bfef30bc5a2cb143810d376d43461445aa17aece7210de52adbe151", size = 35022 }, + { url = "https://files.pythonhosted.org/packages/03/7a/bae33ff4d36208f7ffe1f7f188c12d3492523ddf33b30e6a1e34af5cd77a/xxhash-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bb5be3c5de702a547715f320ecf5c8014aeca750ed5147ca75389bd22e7343", size = 31570 }, + { url = "https://files.pythonhosted.org/packages/88/20/02fa1f8395e052335cf324e021f8fe1cef2ca8ce2c22308db85cba6f487f/xxhash-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01f36b671ff55cb1d5c2f6058b799b697fd0ae4b4582bba6ed0999678068172a", size = 243483 }, + { url = "https://files.pythonhosted.org/packages/75/6f/fdea482230052d101dfbf0fc881d35005998ce01ed1bddf1342435b49347/xxhash-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4d4519123aac73c93159eb8f61db9682393862dd669e7eae034ecd0a35eadac", size = 208297 }, + { url = "https://files.pythonhosted.org/packages/63/e1/4680269ac55d90d48659fafb992360ab3bf8138285f8644d397079cde6c4/xxhash-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:994e4741d5ed70fc2a335a91ef79343c6b1089d7dfe6e955dd06f8ffe82bede6", size = 288430 }, + { url = "https://files.pythonhosted.org/packages/fc/03/d4d625cd19fb5ea6f73ffc81d726fb0c0c6ede36ada7438c3efaeaa907fe/xxhash-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:919bc1b010aa6ff0eb918838ff73a435aed9e9a19c3202b91acecd296bf75607", size = 213225 }, + { url = "https://files.pythonhosted.org/packages/48/36/ec2726918e8c410ae04e5272e37042ca0c0ea54cf3362f6bf20fbe07e970/xxhash-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17b65454c5accbb079c45eca546c27c4782f5175aa320758fafac896b1549d27", size = 221405 }, + { url = "https://files.pythonhosted.org/packages/41/87/088fe48dc34e467d59d6d39399798ed57b05ab0c54bb7e29313abda1e30e/xxhash-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b0c094d5e65a46dbf3fe0928ff20873a747e6abfd2ed4b675beeb2750624bc2e", size = 267366 }, + { url = "https://files.pythonhosted.org/packages/1b/75/c861c9ea0ce5d67c6fc2403d33b5413c35d9e51477d79b8e4b78fff8c9f1/xxhash-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f94163ebe2d5546e6a5977e96d83621f4689c1054053428cf8d4c28b10f92f69", size = 197604 }, + { url = "https://files.pythonhosted.org/packages/e9/21/511d7bca2af2f10e5b2a9873d47df378d1c1fed894667daddb8eb5869f5a/xxhash-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cead7c0307977a00b3f784cff676e72c147adbcada19a2e6fc2ddf54f37cf387", size = 210767 }, + { url = "https://files.pythonhosted.org/packages/92/e8/56d5ebe409086e1714bc65c56a0795453cbc4181237def2f26f09981d265/xxhash-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a0e1bd0260c1da35c1883321ce2707ceea07127816ab625e1226ec95177b561a", size = 290534 }, + { url = "https://files.pythonhosted.org/packages/70/a5/7eea66d5716ebc788a83968bf71b8ba19ff8a3e79f6ea95f2a4973084aa4/xxhash-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc8878935671490efe9275fb4190a6062b73277bd273237179b9b5a2aa436153", size = 233295 }, + { url = "https://files.pythonhosted.org/packages/21/eb/0a324e50b193db947d29aaa55ccd12633c10747aa958fa69fdd96021dafa/xxhash-3.2.0-cp311-cp311-win32.whl", hash = "sha256:a433f6162b18d52f7068175d00bd5b1563b7405f926a48d888a97b90a160c40d", size = 31120 }, + { url = "https://files.pythonhosted.org/packages/d1/2d/bab6a443fb27d72136118912e6c05105104a02bdb2825e9158b530875e88/xxhash-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:a32d546a1752e4ee7805d6db57944f7224afa7428d22867006b6486e4195c1f3", size = 30880 }, +] + +[[package]] +name = "yarl" +version = "1.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/1e/1b204050c601d5cd82b45d5c8f439cb6f744a2ce0c0a6f83be0ddf0dc7b2/yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562", size = 172341 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/6f/6ed536b68a754fe337f6d8b7686d6c28d7474c5326087eb76dd1a9975675/yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5", size = 95596 }, + { url = "https://files.pythonhosted.org/packages/42/37/d8eae7ce26f39d0115375e3b654714c550933ffefa4d07104f85d0d37b41/yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863", size = 61035 }, + { url = "https://files.pythonhosted.org/packages/0d/88/90457ba43e9d4424ee58a1adfa04c717569ab31456480958576ac3e8cfff/yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe", size = 57913 }, + { url = "https://files.pythonhosted.org/packages/be/d8/fcf074e9c246a0d22241f94d474794c876c073a3191d1608a64492d7ea4f/yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e", size = 257287 }, + { url = "https://files.pythonhosted.org/packages/cf/4c/4d0d1a5c50fab50ae368b9a8af1e1e6437fe1dc28ff8a04a06a90136af63/yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996", size = 266434 }, + { url = "https://files.pythonhosted.org/packages/df/8e/6163228567a53797d5468d39ec6d9133fa78aeb3490ff6a979730e056209/yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef", size = 265778 }, + { url = "https://files.pythonhosted.org/packages/b5/e0/6ea3832faed10de6a06cd407c660e6978d5538fe7489e934fb9967c8bb8b/yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8", size = 264010 }, + { url = "https://files.pythonhosted.org/packages/b9/bd/42b39f09ed7b26ed810900f513cd579d5918e3ca39de22f5c5f401a7c102/yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6", size = 254178 }, + { url = "https://files.pythonhosted.org/packages/c6/dc/50fe7fdcf3d27828a5922aaa1c4cbdf2d03827cd5ca6ace2757289e5ee18/yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146", size = 241667 }, + { url = "https://files.pythonhosted.org/packages/ba/c2/8760e6df148cb9d092894decfd9fcf07593bfff26f6716f992d5a1ca7a5c/yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f", size = 243246 }, + { url = "https://files.pythonhosted.org/packages/d3/50/a9a7e280bb94def4a7497d27dd0c9fc87c6feb2ef9cf7639df15b2d0a1e1/yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826", size = 249931 }, + { url = "https://files.pythonhosted.org/packages/de/c2/bdfaa94701e9f1dbd0dfd0454bcb56cf49669ba4591361161fbc5a5ef455/yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3", size = 252769 }, + { url = "https://files.pythonhosted.org/packages/06/04/add788ffdf590fd8d7aa93bd0add24d369fbf864548adf80bab8c8587bd3/yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80", size = 248149 }, + { url = "https://files.pythonhosted.org/packages/3e/da/942a19605c385e887a0ed784429d95a608a54cd0aa8dc9b44396bc8b57f5/yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42", size = 52542 }, + { url = "https://files.pythonhosted.org/packages/5e/81/6691d7dd1c6ca607a4d6804557e6e0bf43dd52ad8ae2bf8bdca2e5cce54d/yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574", size = 56056 }, + { url = "https://files.pythonhosted.org/packages/02/51/c33498373d2e0ff5d7f3e76038b7057003927d481405780d22f140906b24/yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634", size = 92837 }, + { url = "https://files.pythonhosted.org/packages/ca/f3/2ef9870409b3ea57a5890e4e49b6bfd6e347a45fe92f6b2e9567abfefb59/yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd", size = 59707 }, + { url = "https://files.pythonhosted.org/packages/e6/d3/5f5b39db2c8c09f6923418c9329a04fe6f68825f27d2cb9776871d75ddc3/yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581", size = 56542 }, + { url = "https://files.pythonhosted.org/packages/20/23/9ed12660f860962f179bca719b1d8a895c572c5dbb75098d35d074d35703/yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a", size = 273480 }, + { url = "https://files.pythonhosted.org/packages/c0/fd/2f7a640dc157cc2d111114106e3036a69ba3408460d38580f681377c122d/yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf", size = 282010 }, + { url = "https://files.pythonhosted.org/packages/cb/82/91f74496b653ac9a6220ee499510377c03a4ff768c5bd945f6759b23ebb8/yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee", size = 282737 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/6f2039a5578f2af2d36f22173abf22c957970e908617b90e12552f7dfc9a/yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76", size = 278082 }, + { url = "https://files.pythonhosted.org/packages/ba/85/f9e3350daa31161d1f4dfb10e195951df4ac22d8f201603cf894b37510c8/yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b", size = 265756 }, + { url = "https://files.pythonhosted.org/packages/9b/d2/7813ebb6fe192e568c78ba56658f7a26caeceff6302a96808512f5ee40fd/yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a", size = 243855 }, + { url = "https://files.pythonhosted.org/packages/52/e4/7bcabff7bc7b8421bef266bc955367f586d48667eb0a6ae812852feb51e8/yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6", size = 239552 }, + { url = "https://files.pythonhosted.org/packages/c6/1c/4a992306ad86a8ae5a1fb4745bd76c590e7bcdb01ce2203dfd38dc830dfe/yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4", size = 251984 }, + { url = "https://files.pythonhosted.org/packages/5f/3c/59d045a4094f11dea659b69bfca8338803f6cb161da5b039d35cb415a84d/yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c", size = 256073 }, + { url = "https://files.pythonhosted.org/packages/7f/13/a4b6ffff8f3278c020d6b7c42fee53133f6165d347db94bdd9ae394ba4f8/yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2", size = 246790 }, + { url = "https://files.pythonhosted.org/packages/11/ea/c5487522577f3b029a39da71bbe81d7b13303894bde26c88046b2a180e79/yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b", size = 51771 }, + { url = "https://files.pythonhosted.org/packages/88/59/fd28cddd2fe1806cde775c61b43dfe824b672bef1d214383fd86ead3db93/yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c", size = 55321 }, +] + +[[package]] +name = "zipp" +version = "3.16.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/45/f3b987ad5bf9e08095c1ebe6352238be36f25dd106fde424a160061dce6d/zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147", size = 20002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", size = 7203 }, +]