code: def test_parse_shape_symbolic(self, shape):
      print("special shape parsing for", self.backend.framework_name)
      input_symbol = self.backend.create_symbol(shape)
  
      shape_placeholder = parse_shape(input_symbol, "a b c d")
      shape = {}
      for name, symbol in shape_placeholder.items():
          shape[name] = (
              symbol
              if isinstance(symbol, int)
              else self.backend.eval_symbol(
                  symbol,
                  [(input_symbol, numpy.zeros([10, 20, 30, 40]))],
              )
          )
      print(shape)
      result_placeholder = rearrange(
          input_symbol,
          "a b (c1 c2) (d1 d2) -> (a b d1) c1 (c2 d2)",
          **parse_shape(input_symbol, "a b c1 _"),
          d2=2,
      )
      result = self.backend.eval_symbol(
          result_placeholder,
          [(input_symbol, numpy.zeros([10, 20, 30, 40]))],
      )
      print(result.shape)
      assert result.shape == (10 * 20 * 20, 30, 1 * 2)
      assert numpy.allclose(result, 0)
  
imports: import sys
  import unittest
  from doctest import testmod
  from typing import Dict, List, Optional
  import numpy
  import pytest
  from parameterized import parameterized, parameterized_class
  import einops
  import einops.layers
  import einops.parsing
  from einops._backends import AbstractBackend
  from einops.einops import rearrange, parse_shape, _optimize_transformation
  from .None import collect_test_backends, is_backend_tested
label_desc: Use image node_id 1 for calling the TestParseShapeSymbolic obj's underlying member method code with example usage: obj.test_parse_shape_symbolic(shape) without return types