FUNCTION derive_function_domain
(* SCHEMA step_merged_ap_schema; *)
-- IN AP238 STEP-NC/AP242
FUNCTION derive_function_domain
(func : maths_function ) : tuple_space;
LOCAL
typenames : SET OF STRING := stripped_typeof(func);
tspace : tuple_space := make_listed_product_space([]);
shape : LIST OF positive_integer;
sidxs : LIST OF INTEGER := [ 0 ];
itvl : finite_integer_interval;
factors : LIST OF finite_integer_interval := [];
is_uniform : BOOLEAN := TRUE;
END_LOCAL;
IF 'FINITE_FUNCTION' IN typenames THEN
RETURN (derive_finite_function_domain(func\finite_function.pairs));
END_IF;
IF 'CONSTANT_FUNCTION' IN typenames THEN
RETURN (domain_from(func\constant_function.source_of_domain));
END_IF;
IF 'SELECTOR_FUNCTION' IN typenames THEN
RETURN (domain_from(func\selector_function.source_of_domain));
END_IF;
IF 'ELEMENTARY_FUNCTION' IN typenames THEN
RETURN (derive_elementary_function_domain(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
IF func\repackaging_function.input_repack = ro_nochange THEN
RETURN (func\repackaging_function.operand.domain);
END_IF;
IF func\repackaging_function.input_repack = ro_wrap_as_tuple THEN
RETURN (factor1(func\repackaging_function.operand.domain));
END_IF;
IF func\repackaging_function.input_repack = ro_unwrap_tuple THEN
RETURN (one_tuples_of(func\repackaging_function.operand.domain));
END_IF;
RETURN (?);
END_IF;
IF 'REINDEXED_ARRAY_FUNCTION' IN typenames THEN
shape := shape_of_array(func\unary_generic_expression.operand);
sidxs := func\reindexed_array_function.starting_indices;
REPEAT i := 1 TO SIZEOF(shape);
itvl := make_finite_integer_interval(sidxs[i], sidxs[i] + shape[i] - 1);
INSERT( factors, itvl, i - 1 );
IF shape[i] <> shape[1] THEN
is_uniform := FALSE;
END_IF;
END_REPEAT;
IF is_uniform THEN
RETURN (make_uniform_product_space(factors[1], SIZEOF(shape)));
END_IF;
RETURN (make_listed_product_space(factors));
END_IF;
IF 'SERIES_COMPOSED_FUNCTION' IN typenames THEN
RETURN (func\series_composed_function.operands[1].domain);
END_IF;
IF 'PARALLEL_COMPOSED_FUNCTION' IN typenames THEN
RETURN (domain_from(func\parallel_composed_function.source_of_domain));
END_IF;
IF 'EXPLICIT_TABLE_FUNCTION' IN typenames THEN
shape := func\explicit_table_function.shape;
sidxs[1] := func\explicit_table_function.index_base;
REPEAT i := 1 TO SIZEOF(shape);
itvl := make_finite_integer_interval(sidxs[1], sidxs[1] + shape[i] - 1);
INSERT( factors, itvl, i - 1 );
IF shape[i] <> shape[1] THEN
is_uniform := FALSE;
END_IF;
END_REPEAT;
IF is_uniform THEN
RETURN (make_uniform_product_space(factors[1], SIZEOF(shape)));
END_IF;
RETURN (make_listed_product_space(factors));
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[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[func\general_linear_function.sum_index] - 1)));
END_IF;
IF 'B_SPLINE_BASIS' IN typenames THEN
RETURN (one_tuples_of(make_finite_real_interval(func\b_spline_basis.repeated_knots[func\b_spline_basis.order], closed, func\b_spline_basis.repeated_knots[(func\b_spline_basis.num_basis + 1)], closed)));
END_IF;
IF 'B_SPLINE_FUNCTION' IN typenames THEN
REPEAT i := 1 TO SIZEOF(func\b_spline_function.basis);
tspace := assoc_product_space(tspace, func\b_spline_function.basis[i].domain);
END_REPEAT;
RETURN (one_tuples_of(tspace));
END_IF;
IF 'RATIONALIZE_FUNCTION' IN typenames THEN
RETURN (func\rationalize_function.fun.domain);
END_IF;
IF 'PARTIAL_DERIVATIVE_FUNCTION' IN typenames THEN
RETURN (func\partial_derivative_function.derivand.domain);
END_IF;
IF 'DEFINITE_INTEGRAL_FUNCTION' IN typenames THEN
RETURN (derive_definite_integral_domain(func));
END_IF;
IF 'ABSTRACTED_EXPRESSION_FUNCTION' IN typenames THEN
REPEAT i := 1 TO SIZEOF(func\abstracted_expression_function.variables);
tspace := assoc_product_space(tspace, one_tuples_of(values_space_of(func\abstracted_expression_function.variables[i])));
END_REPEAT;
RETURN (tspace);
END_IF;
IF 'EXPRESSION_DENOTED_FUNCTION' IN typenames THEN
RETURN (values_space_of(func\expression_denoted_function.expr)\function_space.domain_argument);
END_IF;
IF 'IMPORTED_POINT_FUNCTION' IN typenames THEN
RETURN (one_tuples_of(make_listed_product_space([])));
END_IF;
IF 'IMPORTED_CURVE_FUNCTION' IN typenames THEN
RETURN (func\imported_curve_function.parametric_domain);
END_IF;
IF 'IMPORTED_SURFACE_FUNCTION' IN typenames THEN
RETURN (func\imported_surface_function.parametric_domain);
END_IF;
IF 'IMPORTED_VOLUME_FUNCTION' IN typenames THEN
RETURN (func\imported_volume_function.parametric_domain);
END_IF;
IF 'APPLICATION_DEFINED_FUNCTION' IN typenames THEN
RETURN (func\application_defined_function.explicit_domain);
END_IF;
RETURN (?);
END_FUNCTION;
Referenced By
Defintion derive_function_domain is references by the following definitions:
[Top Level Definitions] [Exit]Generated by STEP Tools® EXPRESS to HTML Converter
2024-09-06T14:00:33-04:00