code: def test_pipeline_update_hyperparam_level_two_flat():
      p = Pipeline(
          [
              ("a", SomeStep()),
              (
                  "b",
                  Pipeline(
                      [
                          ("a", SomeStep()),
                          ("b", SomeStep()),
                          ("c", SomeStep()),
                      ]
                  ),
              ),
              ("c", SomeStep()),
          ]
      )
      p.set_hyperparams(
          {
              "b__a__learning_rate": 7,
              "b__a__other_hp": 8,
          }
      )
  
      p.update_hyperparams({"b__a__learning_rate": 0.01})
  
      assert p["b"]["a"].hyperparams["learning_rate"] == 0.01
      assert p["b"]["a"].hyperparams["other_hp"] == 8
      assert p["b"]["c"].hyperparams == dict()
      assert p["b"].hyperparams.to_flat_dict() == {
          "a__learning_rate": 0.01,
          "a__other_hp": 8,
      }
      assert p["c"].hyperparams == dict()
  
imports: from typing import Generic
  import numpy
  import pytest
  from neuraxle.base import _FittableStep, _HasChildrenMixin, BaseStep, BaseTransformer, CX, NonTransformableMixin
  from neuraxle.hyperparams.distributions import RandInt, LogUniform
  from neuraxle.hyperparams.space import HyperparameterSpace
  from neuraxle.pipeline import Pipeline
  from neuraxle.steps.misc import TransformCallbackStep, TapeCallbackFunction
  from neuraxle.steps.numpy import NumpyTranspose
  from neuraxle.union import Identity, AddFeatures, ModelStacking
  from testing_neuraxle.mocks.step_mocks import SomeStep, AN_INPUT, AN_EXPECTED_OUTPUT
label_desc: Use image node_id 12 for calling a global function with example usage: test_pipeline_update_hyperparam_level_two_flat() without return types