code: def _assert_expgrad_two_states(self, state1, state2):
      assert state1["total_error"] == pytest.approx(
          state2["total_error"], abs=_PRECISION
      )
      assert state1["disp"] == pytest.approx(
          state2["disp"], abs=_PRECISION
      )
      assert state1["n_predictors"] == state2["n_predictors"]
      assert state1["best_gap"] == pytest.approx(
          state2["best_gap"], abs=_PRECISION
      )
      assert state1["last_iter"] == state2["last_iter"]
      assert state1["best_iter"] == state2["best_iter"]
      assert state1["n_oracle_calls"] == state2["n_oracle_calls"]
      assert (
          state1["n_oracle_calls_dummy_returned"]
          == state2["n_oracle_calls_dummy_returned"]
      )
  
imports: from copy import deepcopy
  import numpy
  import pandas
  import pytest
  from sklearn.dummy import DummyClassifier
  from sklearn.linear_model import LogisticRegression
  from fairlearn.reductions import AbsoluteLoss, BoundedGroupLoss, DemographicParity, EqualizedOdds, ErrorRate, ErrorRateParity, ExponentiatedGradient, FalsePositiveRateParity, SquareLoss, TruePositiveRateParity, ZeroOneLoss
  from fairlearn.reductions._exponentiated_gradient._constants import _MIN_ITER
  from fairlearn.reductions._moments.bounded_group_loss import MeanLoss
  from .simple_learners import LeastSquaresBinaryClassifierLearner, LeastSquaresRegressor
  from .test_utilities import _get_data
label_desc: Use image node_id 10 for calling the TestExponentiatedGradientSmoke obj's underlying member method code with example usage: obj._assert_expgrad_two_states(state1, state2) without return types