code: def window_partition(
      x: torch.Tensor,
      window_size: Tuple[int, int],
  ) -> torch.Tensor:
      """
      Partition into non-overlapping windows with padding if needed.
      Args:
          x (tensor): input tokens with [B, H, W, C].
          window_size (int): window size.
  
      Returns:
          windows: windows after partition with [B * num_windows, window_size, window_size, C].
          (Hp, Wp): padded height and width before partition
      """
      B, H, W, C = x.shape
      x = x.view(
          B,
          H // window_size[0],
          window_size[0],
          W // window_size[1],
          window_size[1],
          C,
      )
      windows = (
          x.permute(0, 1, 3, 2, 4, 5)
          .contiguous()
          .view(-1, window_size[0], window_size[1], C)
      )
      return windows
  
imports: import logging
  import math
  from typing import Callable, List, Optional, Tuple, Union
  import torch
  import torch.nn
  from timm.data import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD
  from timm.layers import PatchEmbed, Mlp, DropPath, ClassifierHead, to_2tuple, to_ntuple, trunc_normal_, _assert, use_fused_attn, resize_rel_pos_bias_table, resample_patch_embed
  from ._builder import build_model_with_cfg
  from ._features_fx import register_notrace_function
  from ._manipulate import checkpoint_seq, named_apply
  from ._registry import generate_default_cfgs, register_model, register_model_deprecations
  from .vision_transformer import get_init_weights_vit
label_desc: Use image node_id 1 for calling a global function with example usage: window_partition(x, window_size) and returns: windows