code: def _w_between_shards(args: Dict[str, Any]):
      
      shard_num = args['shard_num']
      state = _state_shard(args)
      num_shard_qubits = args['num_shard_qubits']
      index = args['index']
      half_turns = args['half_turns']
  
      axis_half_turns = args['axis_half_turns']
  
      perm_index = shard_num ^ (1 << (index - num_shard_qubits))
      perm_state = mem_manager.SharedMemManager.get_array(
          args['state_handle']).view(np.complex64)[perm_index]
  
      cos = np.cos(-0.5 * np.pi * half_turns)
      sin = np.sin(-0.5 * np.pi * half_turns)
  
      cos_axis = np.cos(np.pi * axis_half_turns)
      sin_axis = np.sin(np.pi * axis_half_turns)
  
      scratch = _scratch_shard(args)
      z_op = (1 - 2 * _kth_bit(shard_num, index - num_shard_qubits))
      np.copyto(scratch, state * cos + 1j * sin * perm_state *
                (cos_axis - 1j * sin_axis * z_op))
docs: Applies a W gate when the gate acts between shards.