Overview Schemas Index

MATHEMATICAL_FUNCTIONS_SCHEMA (jsdai.SMathematical_functions_schema)


FUNCTION derive_function_range
          (func : maths_function) : tuple_space;

LOCAL
    typenames : SET OF  STRING := stripped_typeof(func);
    tspace : tuple_space := make_listed_product_space ([]);
    m, n : nonnegative_integer := 0;
    temp : INTEGER := 0;
  END_LOCAL;
  IF  'FINITE_FUNCTION' IN  typenames THEN
    RETURN  (derive_finite_function_range (func\finite_function.pairs));
  END_IF;
  IF  'CONSTANT_FUNCTION' IN  typenames THEN
    RETURN  (one_tuples_of (make_finite_space ([func\constant_function.sole_output])));
  END_IF;
  IF  'SELECTOR_FUNCTION' IN  typenames THEN
    tspace := func.domain;
    IF  (space_dimension(tspace) = 1) AND ((schema_prefix + 'TUPLE_SPACE') IN
      TYPEOF (tspace)) THEN
      tspace := factor1 (tspace);
    END_IF;
    RETURN  (one_tuples_of (factor_space (tspace, func\selector_function.selector)));
  END_IF;
  IF  'ELEMENTARY_FUNCTION' IN  typenames THEN
    RETURN  (derive_elementary_function_range (func\elementary_function.func_id));
  END_IF;
  IF  'RESTRICTION_FUNCTION' IN  typenames THEN
    RETURN  (one_tuples_of (func\restriction_function.operand));
  END_IF;
  IF  'REPACKAGING_FUNCTION' IN  typenames THEN
    tspace := func\repackaging_function.operand.range;
    IF  func\repackaging_function.output_repack = ro_wrap_as_tuple THEN
      tspace := one_tuples_of (tspace);
    END_IF;
    IF  func\repackaging_function.output_repack = ro_unwrap_tuple THEN
      tspace := factor1 (tspace);
    END_IF;
    IF  func\repackaging_function.selected_output > 0 THEN
      tspace := one_tuples_of (factor_space (tspace,
        func\repackaging_function.selected_output));
    END_IF;
    RETURN  (tspace);
  END_IF;
  IF  'REINDEXED_ARRAY_FUNCTION' IN  typenames THEN
    RETURN  (func\unary_generic_expression.operand\maths_function.range);
  END_IF;
  IF  'SERIES_COMPOSED_FUNCTION' IN  typenames THEN
    RETURN  (func\series_composed_function.operands[SIZEOF
      (func\series_composed_function.operands)].range);
  END_IF;
  IF  'PARALLEL_COMPOSED_FUNCTION' IN  typenames THEN
    RETURN  (func\parallel_composed_function.final_function.range);
  END_IF;
  IF  'EXPLICIT_TABLE_FUNCTION' IN  typenames THEN
    IF  'LISTED_REAL_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (the_reals));
    END_IF;
    IF  'LISTED_INTEGER_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (the_integers));
    END_IF;
    IF  'LISTED_LOGICAL_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (the_logicals));
    END_IF;
    IF  'LISTED_STRING_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (the_strings));
    END_IF;
    IF  'LISTED_COMPLEX_NUMBER_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (the_complex_numbers));
    END_IF;
    IF  'LISTED_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (func\listed_data.value_range));
    END_IF;
    IF  'EXTERNALLY_LISTED_DATA' IN  typenames THEN
      RETURN  (one_tuples_of (func\externally_listed_data.value_range));
    END_IF;
    IF  'LINEARIZED_TABLE_FUNCTION' IN  typenames THEN
      RETURN  (func\linearized_table_function.source.range);
    END_IF;
    IF  'BASIC_SPARSE_MATRIX' IN  typenames THEN
      RETURN  (func\basic_sparse_matrix.val.range);
    END_IF;
    -- Unreachable, AS  no other subtypes OF  explicit_table_function are permissible
    -- without first modifying this FUNCTION  TO  account FOR  them.
    RETURN  (?);
  END_IF;
  IF  'HOMOGENEOUS_LINEAR_FUNCTION' IN  typenames THEN
    RETURN  (one_tuples_of (make_uniform_product_space
      (factor1 (func\homogeneous_linear_function.mat.range),
      func\homogeneous_linear_function.mat\explicit_table_function.shape
      [3 - func\homogeneous_linear_function.sum_index])));
  END_IF;
  IF  'GENERAL_LINEAR_FUNCTION' IN  typenames THEN
    RETURN  (one_tuples_of (make_uniform_product_space
      (factor1 (func\general_linear_function.mat.range),
      func\general_linear_function.mat\explicit_table_function.shape
      [3 - func\general_linear_function.sum_index])));
  END_IF;
  IF  'B_SPLINE_BASIS' IN  typenames THEN
    RETURN  (one_tuples_of (make_uniform_product_space (the_reals,
      func\b_spline_basis.num_basis)));
  END_IF;
  IF  'B_SPLINE_FUNCTION' IN  typenames THEN
    tspace := factor1 (func\b_spline_function.coef.domain);
    m := SIZEOF (func\b_spline_function.basis);
    n := space_dimension (tspace);
    IF  m = n THEN
      RETURN  (one_tuples_of (the_reals));
    END_IF;
    IF  m = n - 1 THEN
      RETURN  (one_tuples_of (make_uniform_product_space (the_reals,
        factor_space (tspace, n)\finite_integer_interval.size)));
    END_IF;
    tspace := extract_factors (tspace, m+1, n);
    RETURN  (one_tuples_of (make_function_space (sc_equal, tspace, sc_subspace,
      number_superspace_of (func\b_spline_function.coef.range))));
  END_IF;
  IF  'RATIONALIZE_FUNCTION' IN  typenames THEN
    tspace := factor1 (func\rationalize_function.fun.range);
    n := space_dimension (tspace);
    RETURN  (one_tuples_of (make_uniform_product_space (number_superspace_of (
      factor1 (tspace)), n-1)));
  END_IF;
  IF  'PARTIAL_DERIVATIVE_FUNCTION' IN  typenames THEN
    RETURN  (drop_numeric_constraints (
      func\partial_derivative_function.derivand.range));
  END_IF;
  IF  'DEFINITE_INTEGRAL_FUNCTION' IN  typenames THEN
    RETURN  (drop_numeric_constraints (
      func\definite_integral_function.integrand.range));
  END_IF;
  IF  'ABSTRACTED_EXPRESSION_FUNCTION' IN  typenames THEN
    RETURN  (one_tuples_of(values_space_of(func\abstracted_expression_function.expr)));
  END_IF;
  IF  'EXPRESSION_DENOTED_FUNCTION' IN  typenames THEN
    RETURN  (values_space_of (func\expression_denoted_function.expr)\function_space.
      range_argument);
  END_IF;
  IF  'IMPORTED_POINT_FUNCTION' IN  typenames THEN
      temp := dimension_of (func\imported_point_function.geometry);
    RETURN  (one_tuples_of (make_uniform_product_space (the_reals, temp)));
  END_IF;
  IF  'IMPORTED_CURVE_FUNCTION' IN  typenames THEN
      temp := dimension_of (func\imported_curve_function.geometry);
    RETURN  (one_tuples_of (make_uniform_product_space (the_reals, temp)));
  END_IF;
  IF  'IMPORTED_SURFACE_FUNCTION' IN  typenames THEN
      temp := dimension_of (func\imported_surface_function.geometry);
    RETURN  (one_tuples_of (make_uniform_product_space (the_reals, temp)));
  END_IF;
  IF  'IMPORTED_VOLUME_FUNCTION' IN  typenames THEN
      temp := dimension_of (func\imported_volume_function.geometry);
    RETURN  (one_tuples_of (make_uniform_product_space (the_reals, temp)));
  END_IF;
  IF 'APPLICATION_DEFINED_FUNCTION' IN typenames THEN
    RETURN  (func\application_defined_function.explicit_range);
  END_IF;
  -- Unreachable, AS no other subtypes OF maths_function are permissible without
  -- first modifying this FUNCTION TO account FOR them.
  RETURN (?);

END_FUNCTION; -- derive_function_range

public class FDerive_function_range
          public static Value run(SdaiContext _context, Value func)