getVariables method

Set<Variable> getVariables()

Retrieves the base variables present in the expression, effectively decomposing composite variables into their constituent parts. For instance, for an expression containing x^2, it returns x, and for x*y, it returns both x and y.

Returns: A Set containing all distinct base Variable objects found in the expression.

Implementation

Set<Variable> getVariables() {
  Set<Variable> variables = {};

  void extractBaseVariables(Expression expr) {
    if (expr is Variable) {
      if (expr.toString().contains('^')) {
        var v = expr.toString().split('^');

        extractBaseVariables(Pow(Expression.parse(v[0].substring(1)),
            Expression.parse(v[1].substring(0, v[1].length - 1))));
      } else if (expr.toString().contains('*')) {
        var components = expr.toString().split('*');
        for (var i = 0; i < components.length - 1; i++) {
          for (var j = i + 1; j < components.length; j++) {
            var leftComponent = Expression.parse(
                components[i].trim().replaceAll(RegExp(r'^\(|\)$'), ''));
            var rightComponent = Expression.parse(
                components[j].trim().replaceAll(RegExp(r'^\(|\)$'), ''));
            extractBaseVariables(Multiply(leftComponent, rightComponent));
          }
        }
      } else {
        variables.add(expr);
      }
    } else if (expr is BinaryOperationsExpression) {
      extractBaseVariables(expr.left);
      extractBaseVariables(expr.right);
    } else if (expr is UnaryExpression) {
      extractBaseVariables(expr.operand);
    } else if (expr is TrigonometricExpression) {
      extractBaseVariables(expr.operand);
    }
  }

  extractBaseVariables(this);
  return variables;
}