code: def test_hyperedges_direct_manual_shaping(self):
      h1 = graphistry.hypergraph(
          hyper_df,
          verbose=False,
          direct=True,
          opts={"EDGES": {"aa": ["cc"], "cc": ["cc"]}},
      )
      self.assertEqual(len(h1["edges"]), 6)
  
      h2 = graphistry.hypergraph(
          hyper_df,
          verbose=False,
          direct=True,
          opts={"EDGES": {"aa": ["cc", "bb", "aa"], "cc": ["cc"]}},
      )
      self.assertEqual(len(h2["edges"]), 12)
  
imports: import datetime, logging, pandas, pyarrow
  import pytest
  import graphistry, graphistry.plotter
  from common import NoAuthTestCase
label_desc: Use image node_id 4 for calling the TestHypergraphPlain obj's underlying member method code with example usage: obj.test_hyperedges_direct_manual_shaping() without return types