code: def _prune_optimizer(self, mask):
      optimizable_tensors = {}
      for group in self.optimizer.param_groups:
          stored_state = self.optimizer.state.get(
              group["params"][0], None
          )
          if stored_state is not None:
              stored_state["exp_avg"] = stored_state["exp_avg"][mask]
              stored_state["exp_avg_sq"] = stored_state["exp_avg_sq"][
                  mask
              ]
  
              del self.optimizer.state[group["params"][0]]
              group["params"][0] = nn.Parameter(
                  (group["params"][0][mask].requires_grad_(True))
              )
              self.optimizer.state[group["params"][0]] = stored_state
  
              optimizable_tensors[group["name"]] = group["params"][0]
          else:
              group["params"][0] = nn.Parameter(
                  group["params"][0][mask].requires_grad_(True)
              )
              optimizable_tensors[group["name"]] = group["params"][0]
      return optimizable_tensors
  
imports: import torch
  import numpy
  from utils.general_utils import inverse_sigmoid, get_expon_lr_func, build_rotation
  from torch import nn
  import os
  from utils.system_utils import mkdir_p
  from plyfile import PlyData, PlyElement
  from utils.sh_utils import RGB2SH
  from simple_knn._C import distCUDA2
  from utils.graphics_utils import BasicPointCloud
  from utils.general_utils import strip_symmetric, build_scaling_rotation
label_desc: Use image node_id 20 for calling the GaussianModel obj's underlying member method code with example usage: obj._prune_optimizer(mask) and returns: optimizable_tensors