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
|