code: 
  
  
  
  
  
  
  import os
  from dataclasses import replace
  
  import jax
  import wandb
  from bigbird_flax import Args, DataCollator, FlaxBigBirdForNaturalQuestions, Trainer, build_tx, train_step, val_step
  from datasets import load_dataset
  from flax import jax_utils
  
  from transformers import BigBirdTokenizerFast
  
  
  if __name__ == "__main__":
   print('''#################### AVAILABLE DEVICES ####################''')
   print(jax.devices())
   print('''###########################################################''')
  
   # setup for wandb sweep
   lowerCamelCase			:							str       =Args()
   lowerCamelCase			:							str       =wandb.init(project='''bigbird-natural-questions''', config=args.__dict__)
   lowerCamelCase			:							Any       =dict(logger.config)
   del wandb_args["batch_size"]
   lowerCamelCase			:							str       =replace(args, **wandb_args)
   lowerCamelCase			:							List[str]       =args.base_dir + '''-''' + wandb.run.id
   lowerCamelCase			:							str       =replace(args, base_dir=base_dir)
   print(args)
  
   lowerCamelCase			:							List[Any]       =load_dataset('''json''', data_files=args.tr_data_path)['''train''']
   lowerCamelCase			:							str       =load_dataset('''json''', data_files=args.val_data_path)['''train''']
  
   # drop extra batch for now
   lowerCamelCase			:							List[Any]       =range(len(tr_dataset) - len(tr_dataset) % args.batch_size)
   lowerCamelCase			:							Union[str, Any]       =tr_dataset.shuffle().select(indices)
   lowerCamelCase			:							List[str]       =range(len(val_dataset) - len(val_dataset) % args.batch_size)
   lowerCamelCase			:							Dict       =val_dataset.shuffle().select(indices)
  
   if os.environ.get('''TRAIN_ON_SMALL''', '''false''') == "true":
    lowerCamelCase			:							Optional[int]       =tr_dataset.shuffle().select(range(80000))
    lowerCamelCase			:							List[Any]       =val_dataset.shuffle().select(range(8000))
  
   print(tr_dataset)
   print(val_dataset)
  
   lowerCamelCase			:							int       =FlaxBigBirdForNaturalQuestions.from_pretrained(
       args.model_id, block_size=args.block_size, num_random_blocks=args.num_random_blocks
   )
   lowerCamelCase			:							Union[str, Any]       =BigBirdTokenizerFast.from_pretrained(args.model_id)
   lowerCamelCase			:							Dict       =DataCollator(pad_id=tokenizer.pad_token_id, max_length=4096)
  
   lowerCamelCase			:							List[str]       ={
       '''lr''': args.lr,
       '''init_lr''': args.init_lr,
       '''warmup_steps''': args.warmup_steps,
       '''num_train_steps''': args.max_epochs * (len(tr_dataset) // args.batch_size),
       '''weight_decay''': args.weight_decay,
   }
   lowerCamelCase       ,    lowerCamelCase			:							Tuple       =build_tx(**tx_args)
  
   lowerCamelCase			:							Optional[Any]       =Trainer(
       args=args,
       data_collator=data_collator,
       model_save_fn=model.save_pretrained,
       train_step_fn=train_step,
       val_step_fn=val_step,
       logger=logger,
       scheduler_fn=lr,
   )
  
   lowerCamelCase			:							Tuple       =None
   lowerCamelCase			:							str       =trainer.create_state(model, tx, num_train_steps=tx_args['''num_train_steps'''], ckpt_dir=ckpt_dir)
   try:
    trainer.train(state, tr_dataset, val_dataset)
   except KeyboardInterrupt:
    print('''Oooops; TRAINING STOPPED UNFORTUNATELY''')
  
   print('''SAVING WEIGHTS IN `final-weights`''')
   lowerCamelCase			:							str       =jax_utils.unreplicate(state.params)
   model.save_pretrained(os.path.join(args.base_dir, '''final-weights'''), params=params)
style_context: 
  
  
  
  
  
  
  def 	SCREAMING_SNAKE_CASE							(      __lowerCAmelCase    )				->			str:
       if len(__lowerCAmelCase    ) == 0 or not all(len(__lowerCAmelCase    ) == 2 for pair in coordinates    ):
            raise ValueError("The program cannot work out a fitting polynomial."    )
  
       if len({tuple(__lowerCAmelCase    ) for pair in coordinates}    ) != len(__lowerCAmelCase    ):
            raise ValueError("The program cannot work out a fitting polynomial."    )
  
       UpperCamelCase__    :     List[str]        =						{x for x, _ in coordinates}
       if len(__lowerCAmelCase    ) == 1:
            return f'x={coordinates[0][0]}'
  
       if len(__lowerCAmelCase    ) != len(__lowerCAmelCase    ):
            raise ValueError("The program cannot work out a fitting polynomial."    )
  
       UpperCamelCase__    :     Any        =						len(__lowerCAmelCase    )
  
       UpperCamelCase__    :     str        =						0
       UpperCamelCase__    :     list[list[float]]        =						[]
       # put the x and x to the power values in a matrix
       while count_of_line < x:
            UpperCamelCase__    :     int        =						0
            UpperCamelCase__    :     List[Any]        =						coordinates[count_of_line][0]
            UpperCamelCase__    :     list[float]        =						[]
            while count_in_line < x:
                 count_line.append(a ** (x - (count_in_line + 1))    )
                 count_in_line += 1
            matrix.append(__lowerCAmelCase    )
            count_of_line += 1
  
       UpperCamelCase__    :     List[Any]        =						0
       # put the y values into a vector
       UpperCamelCase__    :     list[float]        =						[]
       while count_of_line < x:
            vector.append(coordinates[count_of_line][1]    )
            count_of_line += 1
  
       UpperCamelCase__    :     Tuple        =						0
  
       while count < x:
            UpperCamelCase__    :     Dict        =						0
            while zahlen < x:
                 if count == zahlen:
                      zahlen += 1
                 if zahlen == x:
                      break
                 UpperCamelCase__    :     Optional[Any]        =						matrix[zahlen][count] / matrix[count][count]
                 for counting_columns, item in enumerate(matrix[count]    ):
                      # manipulating all the values in the matrix
                      matrix[zahlen][counting_columns] -= item * bruch
                 # manipulating the values in the vector
                 vector[zahlen] -= vector[count] * bruch
                 zahlen += 1
            count += 1
  
       UpperCamelCase__    :     Tuple        =						0
       # make solutions
       UpperCamelCase__    :     list[str]        =						[]
       while count < x:
            solution.append(str(vector[count] / matrix[count][count]    )    )
            count += 1
  
       UpperCamelCase__    :     int        =						0
       UpperCamelCase__    :     List[str]        =						"f(x)="
  
       while count < x:
            UpperCamelCase__    :     list[str]        =						solution[count].split("E"    )
            if len(__lowerCAmelCase    ) > 1:
                 UpperCamelCase__    :     Union[str, Any]        =						f'{remove_e[0]}*10^{remove_e[1]}'
            solved += f'x^{x - (count + 1)}*{solution[count]}'
            if count + 1 != x:
                 solved += "+"
            count += 1
  
       return solved
  
  
  if __name__ == "__main__":
   print(points_to_polynomial([]))
   print(points_to_polynomial([[]]))
   print(points_to_polynomial([[1, 0], [2, 0], [3, 0]]))
   print(points_to_polynomial([[1, 1], [2, 1], [3, 1]]))
   print(points_to_polynomial([[1, 3], [2, 3], [3, 3]]))
   print(points_to_polynomial([[1, 1], [2, 2], [3, 3]]))
   print(points_to_polynomial([[1, 1], [2, 4], [3, 9]]))
   print(points_to_polynomial([[1, 3], [2, 6], [3, 11]]))
   print(points_to_polynomial([[1, -3], [2, -6], [3, -11]]))
   print(points_to_polynomial([[1, 5], [2, 2], [3, 9]]))