





'''simple docstring'''







import argparse
import copy

def    __UpperCamelCase	(	a    : Union[str, Any]     ) ->Tuple:
	snake_case				=			{}

	with open(a     ) as f:
		for line in f:
			if line.split()[0] not in dict_of_neighbours:
				snake_case				=			[]
				_list.append([line.split()[1], line.split()[2]]     )
				snake_case				=			_list
			else:
				dict_of_neighbours[line.split()[0]].append(
				    [line.split()[1], line.split()[2]]     )
			if line.split()[1] not in dict_of_neighbours:
				snake_case				=			[]
				_list.append([line.split()[0], line.split()[2]]     )
				snake_case				=			_list
			else:
				dict_of_neighbours[line.split()[1]].append(
				    [line.split()[0], line.split()[2]]     )

	return dict_of_neighbours

def    __UpperCamelCase	(	a    : Dict					,   a    : Tuple     ) ->int:

	with open(a     ) as f:
		snake_case				=			f.read(1     )
	snake_case				=			start_node

	snake_case				=			[]

	snake_case				=			start_node

	snake_case				=			0
	while visiting not in first_solution:
		snake_case				=			1_0000
		for k in dict_of_neighbours[visiting]:
			if int(k[1]     ) < int(a     ) and k[0] not in first_solution:
				snake_case				=			k[1]
				snake_case				=			k[0]

		first_solution.append(a     )
		snake_case				=			distance_of_first_solution + int(a     )
		snake_case				=			best_node

	first_solution.append(a     )

	snake_case				=			0
	for k in dict_of_neighbours[first_solution[-2]]:
		if k[0] == start_node:
			break
		position += 1

	snake_case				=			(
	    distance_of_first_solution
	    + int(dict_of_neighbours[first_solution[-2]][position][1]     )
	    - 1_0000
	)
	return first_solution, distance_of_first_solution

def    __UpperCamelCase	(	a    : Optional[int]					,   a    : str     ) ->str:
	snake_case				=			[]

	for n in solution[1:-1]:
		snake_case				=			solution.index(a     )
		for kn in solution[1:-1]:
			snake_case				=			solution.index(a     )
			if n == kn:
				continue

			snake_case				=			copy.deepcopy(a     )
			snake_case				=			kn
			snake_case				=			n

			snake_case				=			0

			for k in _tmp[:-1]:
				snake_case				=			_tmp[_tmp.index(a     ) + 1]
				for i in dict_of_neighbours[k]:
					if i[0] == next_node:
						snake_case				=			distance + int(i[1]     )
			_tmp.append(a     )

			if _tmp not in neighborhood_of_solution:
				neighborhood_of_solution.append(_tmp     )

	snake_case				=			len(neighborhood_of_solution[0]     ) - 1

	neighborhood_of_solution.sort(key=lambda a     : x[index_of_last_item_in_the_list]     )
	return neighborhood_of_solution

def    __UpperCamelCase	(	a    : Any					,   a    : Optional[Any]					,   a    : int					,   a    : Optional[int]					,   a    : Union[str, Any]     ) ->List[Any]:
	snake_case				=			1
	snake_case				=			first_solution
	snake_case				=			[]
	snake_case				=			distance_of_first_solution
	snake_case				=			solution

	while count <= iters:
		snake_case				=			find_neighborhood(a					,   a     )
		snake_case				=			0
		snake_case				=			neighborhood[index_of_best_solution]
		snake_case				=			len(a     ) - 1

		snake_case				=			False
		while not found:
			snake_case				=			0
			while i < len(a     ):
				if best_solution[i] != solution[i]:
					snake_case				=			best_solution[i]
					snake_case				=			solution[i]
					break
				snake_case				=			i + 1

			if [first_exchange_node, second_exchange_node] not in tabu_list and [
			    second_exchange_node,
			    first_exchange_node,
			] not in tabu_list:
				tabu_list.append([first_exchange_node, second_exchange_node]     )
				snake_case				=			True
				snake_case				=			best_solution[:-1]
				snake_case				=			neighborhood[index_of_best_solution][best_cost_index]
				if cost < best_cost:
					snake_case				=			cost
					snake_case				=			solution
			else:
				snake_case				=			index_of_best_solution + 1
				snake_case				=			neighborhood[index_of_best_solution]

		if len(a     ) >= size:
			tabu_list.pop(0     )

		snake_case				=			count + 1

	return best_solution_ever, best_cost

def    __UpperCamelCase	(	a    : Union[str, Any]=None     ) ->Optional[Any]:
	snake_case				=			generate_neighbours(args.File     )

	snake_case				,		snake_case				=			generate_first_solution(
	    args.File					,   a     )

	snake_case				,		snake_case				=			tabu_search(
	    a					,   a					,   a					,   args.Iterations					,   args.Size					,   )

	print(f"""Best solution: {best_sol}, with total distance: {best_cost}."""     )


if __name__ == "__main__":
			_lowercase       						=			argparse.ArgumentParser(description='Tabu Search')
			parser.add_argument(
			    '-f',
			    '--File',
			    type=str,
			    help='Path to the file containing the data',
			    required=True,
			)
			parser.add_argument(
			    '-i',
			    '--Iterations',
			    type=int,
			    help='How many iterations the algorithm should perform',
			    required=True,
			)
			parser.add_argument(
			    '-s', '--Size', type=int, help='Size of the tabu list', required=True
			)

			# Pass the arguments to main method
			main(parser.parse_args())








'''simple docstring'''







import json
import os
import re
import unittest

from transformers import CodeGenTokenizer, CodeGenTokenizerFast
from transformers.models.codegen.tokenization_codegen import VOCAB_FILES_NAMES
from transformers.testing_utils import require_tokenizers, slow

from ...test_tokenization_common import TokenizerTesterMixin
@require_tokenizers
class 			_lowercase						(       __a				,		unittest.TestCase					):
     _UpperCAmelCase										=					CodeGenTokenizer
     _UpperCAmelCase										=					CodeGenTokenizerFast
     _UpperCAmelCase										=					True
     _UpperCAmelCase										=					{'''add_prefix_space''': True}
     _UpperCAmelCase										=					False







     def     UpperCamelCase			( self    ) ->	Tuple:
      super().setUp()

      # Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
      snake_case				=			[
          '''l''',
          '''o''',
          '''w''',
          '''e''',
          '''r''',
          '''s''',
          '''t''',
          '''i''',
          '''d''',
          '''n''',
          '''\u0120''',
          '''\u0120l''',
          '''\u0120n''',
          '''\u0120lo''',
          '''\u0120low''',
          '''er''',
          '''\u0120lowest''',
          '''\u0120newer''',
          '''\u0120wider''',
          '''<unk>''',
          '''<|endoftext|>''',
      ]
      snake_case				=			dict(zip(A__    ,   range(len(A__    )    )    )    )
      snake_case				=			['''#version: 0.2''', '''\u0120 l''', '''\u0120l o''', '''\u0120lo w''', '''e r''', '''''']
      snake_case				=			{'''unk_token''': '''<unk>'''}

      snake_case				=			os.path.join(self.tmpdirname    ,   VOCAB_FILES_NAMES['''vocab_file''']    )
      snake_case				=			os.path.join(self.tmpdirname    ,   VOCAB_FILES_NAMES['''merges_file''']    )
      with open(self.vocab_file    ,   '''w'''    ,   encoding='''utf-8'''    ) as fp:
       fp.write(json.dumps(A__    ) + '''\n'''    )
      with open(self.merges_file    ,   '''w'''    ,   encoding='''utf-8'''    ) as fp:
       fp.write('''\n'''.join(A__    )    )







     def     UpperCamelCase			( self    ,   **A__    ) ->	Union[str, Any]:
      kwargs.update(self.special_tokens_map    )
      return CodeGenTokenizer.from_pretrained(self.tmpdirname    ,   **A__    )







     def     UpperCamelCase			( self    ,   **A__    ) ->	Union[str, Any]:
      kwargs.update(self.special_tokens_map    )
      return CodeGenTokenizerFast.from_pretrained(self.tmpdirname    ,   **A__    )







     def     UpperCamelCase			( self    ,   A__    ) ->	Tuple:
      snake_case				=			'''lower newer'''
      snake_case				=			'''lower newer'''
      return input_text, output_text







     def     UpperCamelCase			( self    ) ->	List[Any]:
      snake_case				=			CodeGenTokenizer(self.vocab_file    ,   self.merges_file    ,   **self.special_tokens_map    )
      snake_case				=			'''lower newer'''
      snake_case				=			['''\u0120low''', '''er''', '''\u0120''', '''n''', '''e''', '''w''', '''er''']
      snake_case				=			tokenizer.tokenize(A__    ,   add_prefix_space=A__    )
      self.assertListEqual(A__    ,   A__    )

      snake_case				=			tokens + [tokenizer.unk_token]
      snake_case				=			[14, 15, 10, 9, 3, 2, 15, 19]
      self.assertListEqual(tokenizer.convert_tokens_to_ids(A__    )    ,   A__    )







     def     UpperCamelCase			( self    ) ->	Optional[int]:
      if not self.test_rust_tokenizer:
       return

      snake_case				=			self.get_tokenizer()
      snake_case				=			self.get_rust_tokenizer(add_prefix_space=A__    )

      snake_case				=			'''lower newer'''

      # Testing tokenization
      snake_case				=			tokenizer.tokenize(A__    ,   add_prefix_space=A__    )
      snake_case				=			rust_tokenizer.tokenize(A__    )
      self.assertListEqual(A__    ,   A__    )

      # Testing conversion to ids without special tokens
      snake_case				=			tokenizer.encode(A__    ,   add_special_tokens=A__    ,   add_prefix_space=A__    )
      snake_case				=			rust_tokenizer.encode(A__    ,   add_special_tokens=A__    )
      self.assertListEqual(A__    ,   A__    )

      # Testing conversion to ids with special tokens
      snake_case				=			self.get_rust_tokenizer(add_prefix_space=A__    )
      snake_case				=			tokenizer.encode(A__    ,   add_prefix_space=A__    )
      snake_case				=			rust_tokenizer.encode(A__    )
      self.assertListEqual(A__    ,   A__    )

      # Testing the unknown token
      snake_case				=			tokens + [rust_tokenizer.unk_token]
      snake_case				=			[14, 15, 10, 9, 3, 2, 15, 19]
      self.assertListEqual(rust_tokenizer.convert_tokens_to_ids(A__    )    ,   A__    )







     def     UpperCamelCase			( self    ,   *A__    ,   **A__    ) ->	List[str]:
      # It's very difficult to mix/test pretokenization with byte-level
      # And get both CodeGen and Roberta to work at the same time (mostly an issue of adding a space before the string)
      pass







     def     UpperCamelCase			( self    ,   A__=15    ) ->	Tuple:
      for tokenizer, pretrained_name, kwargs in self.tokenizers_list:
       with self.subTest(F"""{tokenizer.__class__.__name__} ({pretrained_name})"""    ):
        snake_case				=			self.rust_tokenizer_class.from_pretrained(A__    ,   **A__    )

        # Simple input
        snake_case				=			'''This is a simple input'''
        snake_case				=			['''This is a simple input 1''', '''This is a simple input 2''']
        snake_case				=			('''This is a simple input''', '''This is a pair''')
        snake_case				=			[
            ('''This is a simple input 1''', '''This is a simple input 2'''),
            ('''This is a simple pair 1''', '''This is a simple pair 2'''),
        ]

        # Simple input tests
        self.assertRaises(A__    ,   tokenizer_r.encode    ,   A__    ,   max_length=A__    ,   padding='''max_length'''    )

        # Simple input
        self.assertRaises(A__    ,   tokenizer_r.encode_plus    ,   A__    ,   max_length=A__    ,   padding='''max_length'''    )

        # Simple input
        self.assertRaises(
            A__    ,   tokenizer_r.batch_encode_plus    ,   A__    ,   max_length=A__    ,   padding='''max_length'''    ,   )

        # Pair input
        self.assertRaises(A__    ,   tokenizer_r.encode    ,   A__    ,   max_length=A__    ,   padding='''max_length'''    )

        # Pair input
        self.assertRaises(A__    ,   tokenizer_r.encode_plus    ,   A__    ,   max_length=A__    ,   padding='''max_length'''    )

        # Pair input
        self.assertRaises(
            A__    ,   tokenizer_r.batch_encode_plus    ,   A__    ,   max_length=A__    ,   padding='''max_length'''    ,   )







     def     UpperCamelCase			( self    ) ->	Tuple:
      snake_case				=			CodeGenTokenizer.from_pretrained(self.tmpdirname    ,   pad_token='''<pad>'''    )

      # Simple input
      snake_case				=			'''This is a simple input'''
      snake_case				=			['''This is a simple input looooooooong''', '''This is a simple input''']
      snake_case				=			('''This is a simple input''', '''This is a pair''')
      snake_case				=			[
          ('''This is a simple input loooooong''', '''This is a simple input'''),
          ('''This is a simple pair loooooong''', '''This is a simple pair'''),
      ]

      snake_case				=			tokenizer.pad_token_id

      snake_case				=			tokenizer(A__    ,   padding='''max_length'''    ,   max_length=30    ,   return_tensors='''np'''    )
      snake_case				=			tokenizer(A__    ,   padding=A__    ,   truncate=A__    ,   return_tensors='''np'''    )
      snake_case				=			tokenizer(*A__    ,   padding='''max_length'''    ,   max_length=60    ,   return_tensors='''np'''    )
      snake_case				=			tokenizer(A__    ,   padding=A__    ,   truncate=A__    ,   return_tensors='''np'''    )

      # s
      # test single string max_length padding
      self.assertEqual(out_s['''input_ids'''].shape[-1]    ,   30    )
      self.assertTrue(pad_token_id in out_s['''input_ids''']    )
      self.assertTrue(0 in out_s['''attention_mask''']    )

      # s2
      # test automatic padding
      self.assertEqual(out_sa['''input_ids'''].shape[-1]    ,   33    )
      # long slice doesn't have padding
      self.assertFalse(pad_token_id in out_sa['''input_ids'''][0]    )
      self.assertFalse(0 in out_sa['''attention_mask'''][0]    )
      # short slice does have padding
      self.assertTrue(pad_token_id in out_sa['''input_ids'''][1]    )
      self.assertTrue(0 in out_sa['''attention_mask'''][1]    )

      # p
      # test single pair max_length padding
      self.assertEqual(out_p['''input_ids'''].shape[-1]    ,   60    )
      self.assertTrue(pad_token_id in out_p['''input_ids''']    )
      self.assertTrue(0 in out_p['''attention_mask''']    )

      # p2
      # test automatic padding pair
      self.assertEqual(out_pa['''input_ids'''].shape[-1]    ,   52    )
      # long slice pair doesn't have padding
      self.assertFalse(pad_token_id in out_pa['''input_ids'''][0]    )
      self.assertFalse(0 in out_pa['''attention_mask'''][0]    )
      # short slice pair does have padding
      self.assertTrue(pad_token_id in out_pa['''input_ids'''][1]    )
      self.assertTrue(0 in out_pa['''attention_mask'''][1]    )







     def     UpperCamelCase			( self    ) ->	str:
      snake_case				=			'''$$$'''
      snake_case				=			CodeGenTokenizer.from_pretrained(self.tmpdirname    ,   bos_token=A__    ,   add_bos_token=A__    )

      snake_case				=			'''This is a simple input'''
      snake_case				=			['''This is a simple input 1''', '''This is a simple input 2''']

      snake_case				=			tokenizer.bos_token_id

      snake_case				=			tokenizer(A__    )
      snake_case				=			tokenizer(A__    )

      self.assertEqual(out_s.input_ids[0]    ,   A__    )
      self.assertTrue(all(o[0] == bos_token_id for o in out_sa.input_ids    )    )

      snake_case				=			tokenizer.decode(out_s.input_ids    )
      snake_case				=			tokenizer.batch_decode(out_sa.input_ids    )

      self.assertEqual(decode_s.split()[0]    ,   A__    )
      self.assertTrue(all(d.split()[0] == bos_token for d in decode_sa    )    )







     @slow
     def     UpperCamelCase			( self    ) ->	Any:
      snake_case				=			CodeGenTokenizer.from_pretrained('''Salesforce/codegen-350M-mono'''    )

      snake_case				=			'''\nif len_a > len_b:\n    result = a\nelse:\n    result = b\n\n\n\n#'''
      snake_case				=			'''\nif len_a > len_b:      result = a\nelse:      result = b'''

      snake_case				=			tokenizer.encode(A__    )
      snake_case				=			['''^#''', re.escape('''<|endoftext|>'''    ), '''^\'\'\'''', '''^"""''', '''\n\n\n''']
      snake_case				=			tokenizer.decode(A__    ,   truncate_before_pattern=A__    )
      self.assertEqual(A__    ,   A__    )







     def     UpperCamelCase			( self    ) ->	Union[str, Any]:
      pass

