class_docstr: Test that the correct answer is correct, and the rest are incorrect.
  
  The test is done by numerically evaluating expressions over a range
  of its variables, using exact rational aritmetic (the "fractions" module).
  
  (Used internally by ProblemGenerator, problem.py).
docstr: Extract variables from the LHS and RHS side of the equation.
  
  At this point, the "equation" is actually a Python assignment
  instruction's AST, in self.question.expr.
  
  Performs sanity checks over these sets of variables.
docstr_tok: ["Extract","variables","from","the","LHS","and","RHS","side","of","the","equation",".","At","this","point",",","the","``","equation","''","is","actually","a","Python","assignment","instruction","'s","AST",",","in","self.question.expr",".","Performs","sanity","checks","over","these","sets","of","variables","."]
code: def _variables(self):
      """
      Extract variables from the LHS and RHS side of the equation.
  
      At this point, the "equation" is actually a Python assignment
      instruction's AST, in self.question.expr.
  
      Performs sanity checks over these sets of variables.
      """
      q_vars = Vars(self.question.expr)
      answers_vars = [Vars(a.expr) for a in self.answers]
      a_vars = answers_vars[0]
  
      assert all(a.lhs == a_vars.lhs for a in answers_vars)
      assert all(a.rhs == a_vars.rhs for a in answers_vars)
  
      assert q_vars.lhs not in q_vars.rhs
      assert a_vars.lhs not in a_vars.rhs
  
      assert (set(q_vars.lhs) | q_vars.rhs) == (
          set(a_vars.lhs) | a_vars.rhs
      )
  
      return q_vars, a_vars
  
file_path: evals/evals/registry/data/solve-for-variable/tools/tester.py
imports: import ast
  from fractions import Fraction
  from solve import EquationGenerator
label_desc: Use image node_id 2 for calling the Evaluator obj's underlying member method code with example usage: obj._variables() and returns: q_vars,  a_vars