fungeom 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fungeom/__init__.py +215 -0
- fungeom/core/__init__.py +22 -0
- fungeom/core/arrays.py +25 -0
- fungeom/core/resolvability.py +74 -0
- fungeom/core/resolver.py +85 -0
- fungeom/primitives/__init__.py +164 -0
- fungeom/primitives/boolean/__init__.py +8 -0
- fungeom/primitives/boolean/decidability.py +14 -0
- fungeom/primitives/boolean/resolvers/__init__.py +0 -0
- fungeom/primitives/boolean/resolvers/base.py +88 -0
- fungeom/primitives/boolean/resolvers/comparison.py +54 -0
- fungeom/primitives/boolean/resolvers/conjunction.py +27 -0
- fungeom/primitives/boolean/resolvers/disjunction.py +27 -0
- fungeom/primitives/boolean/resolvers/literal.py +23 -0
- fungeom/primitives/boolean/resolvers/negation.py +22 -0
- fungeom/primitives/boolean/value.py +15 -0
- fungeom/primitives/bundle/__init__.py +23 -0
- fungeom/primitives/bundle/decidability.py +15 -0
- fungeom/primitives/bundle/resolvers/__init__.py +1 -0
- fungeom/primitives/bundle/resolvers/base.py +305 -0
- fungeom/primitives/bundle/resolvers/boolean.py +213 -0
- fungeom/primitives/bundle/resolvers/direction3.py +139 -0
- fungeom/primitives/bundle/resolvers/fit.py +115 -0
- fungeom/primitives/bundle/resolvers/plane_ops.py +52 -0
- fungeom/primitives/bundle/resolvers/point2.py +313 -0
- fungeom/primitives/bundle/resolvers/point3.py +419 -0
- fungeom/primitives/bundle/resolvers/scalar.py +276 -0
- fungeom/primitives/bundle/resolvers/transform.py +108 -0
- fungeom/primitives/bundle/resolvers/vec3.py +205 -0
- fungeom/primitives/bundle/value.py +55 -0
- fungeom/primitives/coverage/__init__.py +10 -0
- fungeom/primitives/coverage/decidability.py +15 -0
- fungeom/primitives/coverage/resolvers/__init__.py +1 -0
- fungeom/primitives/coverage/resolvers/base.py +92 -0
- fungeom/primitives/coverage/resolvers/contains.py +33 -0
- fungeom/primitives/coverage/resolvers/difference.py +28 -0
- fungeom/primitives/coverage/resolvers/gaps.py +25 -0
- fungeom/primitives/coverage/resolvers/hull.py +36 -0
- fungeom/primitives/coverage/resolvers/intersection.py +28 -0
- fungeom/primitives/coverage/resolvers/literal.py +28 -0
- fungeom/primitives/coverage/resolvers/total_duration.py +30 -0
- fungeom/primitives/coverage/resolvers/union.py +28 -0
- fungeom/primitives/coverage/value.py +103 -0
- fungeom/primitives/direction2/__init__.py +6 -0
- fungeom/primitives/direction2/decidability.py +15 -0
- fungeom/primitives/direction2/resolvers/__init__.py +1 -0
- fungeom/primitives/direction2/resolvers/angle.py +25 -0
- fungeom/primitives/direction2/resolvers/angle_to.py +28 -0
- fungeom/primitives/direction2/resolvers/base.py +105 -0
- fungeom/primitives/direction2/resolvers/dot.py +30 -0
- fungeom/primitives/direction2/resolvers/literal.py +20 -0
- fungeom/primitives/direction2/resolvers/normalized.py +33 -0
- fungeom/primitives/direction2/resolvers/perpendicular.py +24 -0
- fungeom/primitives/direction2/resolvers/reversed.py +24 -0
- fungeom/primitives/direction2/resolvers/signed_angle.py +36 -0
- fungeom/primitives/direction2/resolvers/slerp.py +45 -0
- fungeom/primitives/direction2/resolvers/vector.py +25 -0
- fungeom/primitives/direction2/value.py +74 -0
- fungeom/primitives/direction3/__init__.py +4 -0
- fungeom/primitives/direction3/decidability.py +15 -0
- fungeom/primitives/direction3/resolvers/__init__.py +1 -0
- fungeom/primitives/direction3/resolvers/angle.py +28 -0
- fungeom/primitives/direction3/resolvers/any_perpendicular.py +34 -0
- fungeom/primitives/direction3/resolvers/base.py +110 -0
- fungeom/primitives/direction3/resolvers/cross.py +37 -0
- fungeom/primitives/direction3/resolvers/dot.py +34 -0
- fungeom/primitives/direction3/resolvers/literal.py +20 -0
- fungeom/primitives/direction3/resolvers/normalized.py +37 -0
- fungeom/primitives/direction3/resolvers/reversed.py +22 -0
- fungeom/primitives/direction3/resolvers/signed_angle.py +44 -0
- fungeom/primitives/direction3/resolvers/slerp.py +48 -0
- fungeom/primitives/direction3/resolvers/vector.py +28 -0
- fungeom/primitives/direction3/value.py +58 -0
- fungeom/primitives/duration/__init__.py +7 -0
- fungeom/primitives/duration/decidability.py +14 -0
- fungeom/primitives/duration/resolvers/__init__.py +1 -0
- fungeom/primitives/duration/resolvers/absolute.py +22 -0
- fungeom/primitives/duration/resolvers/base.py +164 -0
- fungeom/primitives/duration/resolvers/clamp.py +31 -0
- fungeom/primitives/duration/resolvers/literal.py +38 -0
- fungeom/primitives/duration/resolvers/maximum.py +31 -0
- fungeom/primitives/duration/resolvers/minimum.py +31 -0
- fungeom/primitives/duration/resolvers/ratio.py +39 -0
- fungeom/primitives/duration/resolvers/scaled.py +32 -0
- fungeom/primitives/duration/resolvers/sum.py +31 -0
- fungeom/primitives/duration/value.py +16 -0
- fungeom/primitives/face/__init__.py +6 -0
- fungeom/primitives/face/decidability.py +15 -0
- fungeom/primitives/face/resolvers/__init__.py +1 -0
- fungeom/primitives/face/resolvers/base.py +83 -0
- fungeom/primitives/face/resolvers/clearance.py +35 -0
- fungeom/primitives/face/resolvers/closest_point.py +32 -0
- fungeom/primitives/face/resolvers/contains.py +32 -0
- fungeom/primitives/face/resolvers/on.py +34 -0
- fungeom/primitives/face/resolvers/parts.py +42 -0
- fungeom/primitives/face/value.py +57 -0
- fungeom/primitives/frame/__init__.py +8 -0
- fungeom/primitives/frame/decidability.py +21 -0
- fungeom/primitives/frame/resolvers/__init__.py +1 -0
- fungeom/primitives/frame/resolvers/attached.py +33 -0
- fungeom/primitives/frame/resolvers/base.py +59 -0
- fungeom/primitives/frame/resolvers/known.py +30 -0
- fungeom/primitives/frame/resolvers/relative.py +32 -0
- fungeom/primitives/frame/value.py +90 -0
- fungeom/primitives/frame2/__init__.py +10 -0
- fungeom/primitives/frame2/decidability.py +15 -0
- fungeom/primitives/frame2/resolvers/__init__.py +1 -0
- fungeom/primitives/frame2/resolvers/attached.py +29 -0
- fungeom/primitives/frame2/resolvers/base.py +55 -0
- fungeom/primitives/frame2/resolvers/known.py +30 -0
- fungeom/primitives/frame2/resolvers/relative.py +31 -0
- fungeom/primitives/frame2/value.py +80 -0
- fungeom/primitives/instant/__init__.py +7 -0
- fungeom/primitives/instant/decidability.py +14 -0
- fungeom/primitives/instant/resolvers/__init__.py +1 -0
- fungeom/primitives/instant/resolvers/affine.py +52 -0
- fungeom/primitives/instant/resolvers/base.py +142 -0
- fungeom/primitives/instant/resolvers/centroid.py +29 -0
- fungeom/primitives/instant/resolvers/difference.py +38 -0
- fungeom/primitives/instant/resolvers/lerp.py +31 -0
- fungeom/primitives/instant/resolvers/literal.py +34 -0
- fungeom/primitives/instant/resolvers/maximum.py +31 -0
- fungeom/primitives/instant/resolvers/minimum.py +31 -0
- fungeom/primitives/instant/resolvers/shifted.py +28 -0
- fungeom/primitives/instant/value.py +18 -0
- fungeom/primitives/interval/__init__.py +6 -0
- fungeom/primitives/interval/decidability.py +15 -0
- fungeom/primitives/interval/resolvers/__init__.py +1 -0
- fungeom/primitives/interval/resolvers/base.py +148 -0
- fungeom/primitives/interval/resolvers/between.py +35 -0
- fungeom/primitives/interval/resolvers/clamp.py +28 -0
- fungeom/primitives/interval/resolvers/contains.py +35 -0
- fungeom/primitives/interval/resolvers/endpoint.py +46 -0
- fungeom/primitives/interval/resolvers/hull.py +28 -0
- fungeom/primitives/interval/resolvers/intersection.py +37 -0
- fungeom/primitives/interval/resolvers/overlaps.py +33 -0
- fungeom/primitives/interval/value.py +35 -0
- fungeom/primitives/line/__init__.py +6 -0
- fungeom/primitives/line/decidability.py +15 -0
- fungeom/primitives/line/resolvers/__init__.py +1 -0
- fungeom/primitives/line/resolvers/base.py +99 -0
- fungeom/primitives/line/resolvers/direction.py +26 -0
- fungeom/primitives/line/resolvers/direction_along.py +46 -0
- fungeom/primitives/line/resolvers/distance_to.py +29 -0
- fungeom/primitives/line/resolvers/origin.py +27 -0
- fungeom/primitives/line/resolvers/point_at.py +28 -0
- fungeom/primitives/line/resolvers/project.py +30 -0
- fungeom/primitives/line/resolvers/through.py +30 -0
- fungeom/primitives/line/resolvers/through_points.py +31 -0
- fungeom/primitives/line/value.py +73 -0
- fungeom/primitives/line2/__init__.py +6 -0
- fungeom/primitives/line2/decidability.py +15 -0
- fungeom/primitives/line2/resolvers/__init__.py +1 -0
- fungeom/primitives/line2/resolvers/base.py +99 -0
- fungeom/primitives/line2/resolvers/direction.py +26 -0
- fungeom/primitives/line2/resolvers/distance_to.py +29 -0
- fungeom/primitives/line2/resolvers/intersect.py +46 -0
- fungeom/primitives/line2/resolvers/normal.py +26 -0
- fungeom/primitives/line2/resolvers/origin.py +27 -0
- fungeom/primitives/line2/resolvers/point_at.py +28 -0
- fungeom/primitives/line2/resolvers/project.py +30 -0
- fungeom/primitives/line2/resolvers/signed_distance.py +29 -0
- fungeom/primitives/line2/resolvers/through.py +30 -0
- fungeom/primitives/line2/resolvers/through_points.py +31 -0
- fungeom/primitives/line2/value.py +80 -0
- fungeom/primitives/plane/__init__.py +6 -0
- fungeom/primitives/plane/decidability.py +15 -0
- fungeom/primitives/plane/resolvers/__init__.py +1 -0
- fungeom/primitives/plane/resolvers/base.py +229 -0
- fungeom/primitives/plane/resolvers/embed.py +35 -0
- fungeom/primitives/plane/resolvers/facing.py +35 -0
- fungeom/primitives/plane/resolvers/flipped.py +24 -0
- fungeom/primitives/plane/resolvers/frame.py +53 -0
- fungeom/primitives/plane/resolvers/intersect.py +46 -0
- fungeom/primitives/plane/resolvers/normal.py +26 -0
- fungeom/primitives/plane/resolvers/offset.py +28 -0
- fungeom/primitives/plane/resolvers/origin.py +27 -0
- fungeom/primitives/plane/resolvers/project.py +30 -0
- fungeom/primitives/plane/resolvers/project_direction.py +40 -0
- fungeom/primitives/plane/resolvers/signed_distance.py +29 -0
- fungeom/primitives/plane/resolvers/spanned_by.py +38 -0
- fungeom/primitives/plane/resolvers/through.py +30 -0
- fungeom/primitives/plane/resolvers/through_points.py +32 -0
- fungeom/primitives/plane/resolvers/to_local.py +36 -0
- fungeom/primitives/plane/resolvers/winding_normal.py +50 -0
- fungeom/primitives/plane/value.py +98 -0
- fungeom/primitives/point2/__init__.py +6 -0
- fungeom/primitives/point2/decidability.py +15 -0
- fungeom/primitives/point2/resolvers/__init__.py +1 -0
- fungeom/primitives/point2/resolvers/affine.py +56 -0
- fungeom/primitives/point2/resolvers/base.py +132 -0
- fungeom/primitives/point2/resolvers/centroid.py +29 -0
- fungeom/primitives/point2/resolvers/displacement.py +28 -0
- fungeom/primitives/point2/resolvers/framed.py +31 -0
- fungeom/primitives/point2/resolvers/lerp.py +34 -0
- fungeom/primitives/point2/resolvers/located.py +22 -0
- fungeom/primitives/point2/resolvers/reflected.py +29 -0
- fungeom/primitives/point2/resolvers/transformed.py +30 -0
- fungeom/primitives/point2/resolvers/translated.py +30 -0
- fungeom/primitives/point2/value.py +70 -0
- fungeom/primitives/point3/__init__.py +4 -0
- fungeom/primitives/point3/decidability.py +15 -0
- fungeom/primitives/point3/resolvers/__init__.py +1 -0
- fungeom/primitives/point3/resolvers/affine.py +60 -0
- fungeom/primitives/point3/resolvers/base.py +137 -0
- fungeom/primitives/point3/resolvers/centroid.py +33 -0
- fungeom/primitives/point3/resolvers/displacement.py +37 -0
- fungeom/primitives/point3/resolvers/framed.py +37 -0
- fungeom/primitives/point3/resolvers/lerp.py +34 -0
- fungeom/primitives/point3/resolvers/located.py +25 -0
- fungeom/primitives/point3/resolvers/reflected.py +33 -0
- fungeom/primitives/point3/resolvers/transformed.py +34 -0
- fungeom/primitives/point3/resolvers/translated.py +30 -0
- fungeom/primitives/point3/value.py +70 -0
- fungeom/primitives/ray/__init__.py +6 -0
- fungeom/primitives/ray/decidability.py +15 -0
- fungeom/primitives/ray/resolvers/__init__.py +1 -0
- fungeom/primitives/ray/resolvers/base.py +100 -0
- fungeom/primitives/ray/resolvers/direction.py +26 -0
- fungeom/primitives/ray/resolvers/distance_to.py +29 -0
- fungeom/primitives/ray/resolvers/from_to.py +31 -0
- fungeom/primitives/ray/resolvers/intersect.py +45 -0
- fungeom/primitives/ray/resolvers/origin.py +27 -0
- fungeom/primitives/ray/resolvers/point_at.py +30 -0
- fungeom/primitives/ray/resolvers/project.py +30 -0
- fungeom/primitives/ray/resolvers/reversed.py +24 -0
- fungeom/primitives/ray/resolvers/through.py +30 -0
- fungeom/primitives/ray/value.py +74 -0
- fungeom/primitives/ray2/__init__.py +6 -0
- fungeom/primitives/ray2/decidability.py +15 -0
- fungeom/primitives/ray2/resolvers/__init__.py +1 -0
- fungeom/primitives/ray2/resolvers/base.py +91 -0
- fungeom/primitives/ray2/resolvers/direction.py +26 -0
- fungeom/primitives/ray2/resolvers/distance_to.py +29 -0
- fungeom/primitives/ray2/resolvers/from_to.py +31 -0
- fungeom/primitives/ray2/resolvers/intersect.py +45 -0
- fungeom/primitives/ray2/resolvers/origin.py +27 -0
- fungeom/primitives/ray2/resolvers/point_at.py +30 -0
- fungeom/primitives/ray2/resolvers/project.py +30 -0
- fungeom/primitives/ray2/resolvers/reversed.py +24 -0
- fungeom/primitives/ray2/resolvers/through.py +30 -0
- fungeom/primitives/ray2/value.py +72 -0
- fungeom/primitives/region2/__init__.py +10 -0
- fungeom/primitives/region2/decidability.py +15 -0
- fungeom/primitives/region2/resolvers/__init__.py +1 -0
- fungeom/primitives/region2/resolvers/area.py +25 -0
- fungeom/primitives/region2/resolvers/base.py +219 -0
- fungeom/primitives/region2/resolvers/boolean.py +73 -0
- fungeom/primitives/region2/resolvers/bounds.py +36 -0
- fungeom/primitives/region2/resolvers/centroid.py +29 -0
- fungeom/primitives/region2/resolvers/closest_point.py +41 -0
- fungeom/primitives/region2/resolvers/contains.py +29 -0
- fungeom/primitives/region2/resolvers/disc.py +35 -0
- fungeom/primitives/region2/resolvers/hull.py +58 -0
- fungeom/primitives/region2/resolvers/literal.py +20 -0
- fungeom/primitives/region2/resolvers/nearest_boundary.py +36 -0
- fungeom/primitives/region2/resolvers/offset.py +32 -0
- fungeom/primitives/region2/resolvers/perimeter.py +25 -0
- fungeom/primitives/region2/resolvers/polygon.py +43 -0
- fungeom/primitives/region2/resolvers/predicates.py +53 -0
- fungeom/primitives/region2/resolvers/rectangle.py +36 -0
- fungeom/primitives/region2/resolvers/sample.py +43 -0
- fungeom/primitives/region2/resolvers/signed_distance.py +36 -0
- fungeom/primitives/region2/resolvers/transformed.py +35 -0
- fungeom/primitives/region2/resolvers/vertices.py +33 -0
- fungeom/primitives/region2/shapely_bridge.py +55 -0
- fungeom/primitives/region2/value.py +232 -0
- fungeom/primitives/roster/__init__.py +10 -0
- fungeom/primitives/roster/decidability.py +15 -0
- fungeom/primitives/roster/resolvers/__init__.py +1 -0
- fungeom/primitives/roster/resolvers/base.py +78 -0
- fungeom/primitives/roster/resolvers/contains.py +32 -0
- fungeom/primitives/roster/resolvers/count.py +29 -0
- fungeom/primitives/roster/resolvers/difference.py +27 -0
- fungeom/primitives/roster/resolvers/intersection.py +27 -0
- fungeom/primitives/roster/resolvers/literal.py +25 -0
- fungeom/primitives/roster/resolvers/union.py +27 -0
- fungeom/primitives/roster/value.py +71 -0
- fungeom/primitives/rostermap/__init__.py +6 -0
- fungeom/primitives/rostermap/decidability.py +15 -0
- fungeom/primitives/rostermap/resolvers/__init__.py +1 -0
- fungeom/primitives/rostermap/resolvers/base.py +100 -0
- fungeom/primitives/rostermap/resolvers/composed.py +31 -0
- fungeom/primitives/rostermap/resolvers/identity.py +26 -0
- fungeom/primitives/rostermap/resolvers/inverse.py +30 -0
- fungeom/primitives/rostermap/resolvers/literal.py +25 -0
- fungeom/primitives/rostermap/resolvers/maps.py +27 -0
- fungeom/primitives/rostermap/resolvers/source.py +26 -0
- fungeom/primitives/rostermap/resolvers/target.py +26 -0
- fungeom/primitives/rostermap/value.py +71 -0
- fungeom/primitives/sampling/__init__.py +6 -0
- fungeom/primitives/sampling/decidability.py +15 -0
- fungeom/primitives/sampling/resolvers/__init__.py +1 -0
- fungeom/primitives/sampling/resolvers/base.py +66 -0
- fungeom/primitives/sampling/resolvers/count.py +25 -0
- fungeom/primitives/sampling/resolvers/explicit.py +28 -0
- fungeom/primitives/sampling/resolvers/rate.py +33 -0
- fungeom/primitives/sampling/resolvers/span.py +26 -0
- fungeom/primitives/sampling/resolvers/uniform.py +43 -0
- fungeom/primitives/sampling/value.py +65 -0
- fungeom/primitives/scalar/__init__.py +3 -0
- fungeom/primitives/scalar/decidability.py +14 -0
- fungeom/primitives/scalar/resolvers/__init__.py +1 -0
- fungeom/primitives/scalar/resolvers/absolute.py +22 -0
- fungeom/primitives/scalar/resolvers/base.py +181 -0
- fungeom/primitives/scalar/resolvers/ceil.py +23 -0
- fungeom/primitives/scalar/resolvers/clamp.py +31 -0
- fungeom/primitives/scalar/resolvers/floor.py +23 -0
- fungeom/primitives/scalar/resolvers/literal.py +34 -0
- fungeom/primitives/scalar/resolvers/maximum.py +27 -0
- fungeom/primitives/scalar/resolvers/minimum.py +27 -0
- fungeom/primitives/scalar/resolvers/modulo.py +33 -0
- fungeom/primitives/scalar/resolvers/power.py +37 -0
- fungeom/primitives/scalar/resolvers/product.py +27 -0
- fungeom/primitives/scalar/resolvers/quotient.py +34 -0
- fungeom/primitives/scalar/resolvers/round.py +22 -0
- fungeom/primitives/scalar/resolvers/sign.py +23 -0
- fungeom/primitives/scalar/resolvers/sqrt.py +25 -0
- fungeom/primitives/scalar/resolvers/sum.py +27 -0
- fungeom/primitives/scalar/value.py +15 -0
- fungeom/primitives/segment/__init__.py +6 -0
- fungeom/primitives/segment/decidability.py +15 -0
- fungeom/primitives/segment/resolvers/__init__.py +1 -0
- fungeom/primitives/segment/resolvers/at.py +30 -0
- fungeom/primitives/segment/resolvers/base.py +106 -0
- fungeom/primitives/segment/resolvers/between.py +29 -0
- fungeom/primitives/segment/resolvers/direction.py +28 -0
- fungeom/primitives/segment/resolvers/distance_to.py +29 -0
- fungeom/primitives/segment/resolvers/endpoints.py +42 -0
- fungeom/primitives/segment/resolvers/length.py +25 -0
- fungeom/primitives/segment/resolvers/midpoint.py +27 -0
- fungeom/primitives/segment/resolvers/parameter_of.py +29 -0
- fungeom/primitives/segment/resolvers/project.py +30 -0
- fungeom/primitives/segment/resolvers/reversed.py +25 -0
- fungeom/primitives/segment/value.py +80 -0
- fungeom/primitives/segment2/__init__.py +6 -0
- fungeom/primitives/segment2/decidability.py +15 -0
- fungeom/primitives/segment2/resolvers/__init__.py +1 -0
- fungeom/primitives/segment2/resolvers/at.py +30 -0
- fungeom/primitives/segment2/resolvers/base.py +98 -0
- fungeom/primitives/segment2/resolvers/between.py +29 -0
- fungeom/primitives/segment2/resolvers/direction.py +28 -0
- fungeom/primitives/segment2/resolvers/distance_to.py +29 -0
- fungeom/primitives/segment2/resolvers/endpoints.py +42 -0
- fungeom/primitives/segment2/resolvers/length.py +25 -0
- fungeom/primitives/segment2/resolvers/midpoint.py +27 -0
- fungeom/primitives/segment2/resolvers/parameter_of.py +29 -0
- fungeom/primitives/segment2/resolvers/project.py +30 -0
- fungeom/primitives/segment2/resolvers/reversed.py +25 -0
- fungeom/primitives/segment2/value.py +79 -0
- fungeom/primitives/signals/__init__.py +43 -0
- fungeom/primitives/signals/blend.py +35 -0
- fungeom/primitives/signals/boolean.py +320 -0
- fungeom/primitives/signals/boundary.py +66 -0
- fungeom/primitives/signals/bundle.py +955 -0
- fungeom/primitives/signals/direction3.py +268 -0
- fungeom/primitives/signals/interpolation.py +92 -0
- fungeom/primitives/signals/plane.py +243 -0
- fungeom/primitives/signals/point3.py +312 -0
- fungeom/primitives/signals/scalar.py +481 -0
- fungeom/primitives/signals/series.py +553 -0
- fungeom/primitives/signals/transform.py +266 -0
- fungeom/primitives/signals/vec3.py +300 -0
- fungeom/primitives/timeline/__init__.py +8 -0
- fungeom/primitives/timeline/decidability.py +15 -0
- fungeom/primitives/timeline/resolvers/__init__.py +1 -0
- fungeom/primitives/timeline/resolvers/base.py +93 -0
- fungeom/primitives/timeline/resolvers/derived.py +33 -0
- fungeom/primitives/timeline/resolvers/grounded.py +40 -0
- fungeom/primitives/timeline/resolvers/known.py +25 -0
- fungeom/primitives/timeline/resolvers/relative.py +42 -0
- fungeom/primitives/timeline/resolvers/to_master.py +35 -0
- fungeom/primitives/timeline/value.py +81 -0
- fungeom/primitives/timemap/__init__.py +6 -0
- fungeom/primitives/timemap/decidability.py +15 -0
- fungeom/primitives/timemap/resolvers/__init__.py +1 -0
- fungeom/primitives/timemap/resolvers/affine.py +30 -0
- fungeom/primitives/timemap/resolvers/aligning.py +35 -0
- fungeom/primitives/timemap/resolvers/base.py +123 -0
- fungeom/primitives/timemap/resolvers/composed.py +27 -0
- fungeom/primitives/timemap/resolvers/inverse.py +30 -0
- fungeom/primitives/timemap/resolvers/literal.py +25 -0
- fungeom/primitives/timemap/resolvers/through.py +45 -0
- fungeom/primitives/timemap/value.py +57 -0
- fungeom/primitives/timewarp/__init__.py +6 -0
- fungeom/primitives/timewarp/decidability.py +15 -0
- fungeom/primitives/timewarp/resolvers/__init__.py +1 -0
- fungeom/primitives/timewarp/resolvers/base.py +75 -0
- fungeom/primitives/timewarp/resolvers/domain.py +32 -0
- fungeom/primitives/timewarp/resolvers/inverse.py +28 -0
- fungeom/primitives/timewarp/resolvers/through.py +36 -0
- fungeom/primitives/timewarp/value.py +54 -0
- fungeom/primitives/transform/__init__.py +4 -0
- fungeom/primitives/transform/decidability.py +15 -0
- fungeom/primitives/transform/resolvers/__init__.py +1 -0
- fungeom/primitives/transform/resolvers/aligning.py +44 -0
- fungeom/primitives/transform/resolvers/applied_direction.py +32 -0
- fungeom/primitives/transform/resolvers/applied_vector.py +31 -0
- fungeom/primitives/transform/resolvers/axis_angle.py +41 -0
- fungeom/primitives/transform/resolvers/base.py +149 -0
- fungeom/primitives/transform/resolvers/composed.py +27 -0
- fungeom/primitives/transform/resolvers/from_axes.py +53 -0
- fungeom/primitives/transform/resolvers/inverse.py +22 -0
- fungeom/primitives/transform/resolvers/literal.py +27 -0
- fungeom/primitives/transform/resolvers/look_at.py +57 -0
- fungeom/primitives/transform/resolvers/rotation_part.py +27 -0
- fungeom/primitives/transform/resolvers/slerp.py +44 -0
- fungeom/primitives/transform/resolvers/translation.py +29 -0
- fungeom/primitives/transform/resolvers/translation_part.py +23 -0
- fungeom/primitives/transform/value.py +130 -0
- fungeom/primitives/transform2/__init__.py +6 -0
- fungeom/primitives/transform2/decidability.py +15 -0
- fungeom/primitives/transform2/resolvers/__init__.py +1 -0
- fungeom/primitives/transform2/resolvers/angle.py +25 -0
- fungeom/primitives/transform2/resolvers/applied_direction.py +29 -0
- fungeom/primitives/transform2/resolvers/applied_vector.py +28 -0
- fungeom/primitives/transform2/resolvers/base.py +113 -0
- fungeom/primitives/transform2/resolvers/composed.py +27 -0
- fungeom/primitives/transform2/resolvers/inverse.py +24 -0
- fungeom/primitives/transform2/resolvers/literal.py +27 -0
- fungeom/primitives/transform2/resolvers/rotation.py +24 -0
- fungeom/primitives/transform2/resolvers/rotation_part.py +29 -0
- fungeom/primitives/transform2/resolvers/slerp.py +41 -0
- fungeom/primitives/transform2/resolvers/translation.py +24 -0
- fungeom/primitives/transform2/resolvers/translation_part.py +25 -0
- fungeom/primitives/transform2/value.py +129 -0
- fungeom/primitives/vec2/__init__.py +4 -0
- fungeom/primitives/vec2/decidability.py +15 -0
- fungeom/primitives/vec2/resolvers/__init__.py +1 -0
- fungeom/primitives/vec2/resolvers/angle.py +38 -0
- fungeom/primitives/vec2/resolvers/base.py +133 -0
- fungeom/primitives/vec2/resolvers/components.py +27 -0
- fungeom/primitives/vec2/resolvers/coordinate.py +24 -0
- fungeom/primitives/vec2/resolvers/dot.py +48 -0
- fungeom/primitives/vec2/resolvers/lerp.py +31 -0
- fungeom/primitives/vec2/resolvers/literal.py +31 -0
- fungeom/primitives/vec2/resolvers/norm.py +25 -0
- fungeom/primitives/vec2/resolvers/normalized.py +27 -0
- fungeom/primitives/vec2/resolvers/perpendicular.py +25 -0
- fungeom/primitives/vec2/resolvers/projected.py +59 -0
- fungeom/primitives/vec2/resolvers/resized.py +36 -0
- fungeom/primitives/vec2/resolvers/scaled.py +28 -0
- fungeom/primitives/vec2/resolvers/sum.py +27 -0
- fungeom/primitives/vec2/value.py +25 -0
- fungeom/primitives/vec3/__init__.py +4 -0
- fungeom/primitives/vec3/decidability.py +15 -0
- fungeom/primitives/vec3/resolvers/__init__.py +1 -0
- fungeom/primitives/vec3/resolvers/angle.py +38 -0
- fungeom/primitives/vec3/resolvers/base.py +143 -0
- fungeom/primitives/vec3/resolvers/components.py +33 -0
- fungeom/primitives/vec3/resolvers/coordinate.py +24 -0
- fungeom/primitives/vec3/resolvers/cross.py +30 -0
- fungeom/primitives/vec3/resolvers/dot.py +30 -0
- fungeom/primitives/vec3/resolvers/lerp.py +31 -0
- fungeom/primitives/vec3/resolvers/literal.py +31 -0
- fungeom/primitives/vec3/resolvers/norm.py +30 -0
- fungeom/primitives/vec3/resolvers/normalized.py +27 -0
- fungeom/primitives/vec3/resolvers/projected.py +59 -0
- fungeom/primitives/vec3/resolvers/resized.py +36 -0
- fungeom/primitives/vec3/resolvers/scalar_triple.py +33 -0
- fungeom/primitives/vec3/resolvers/scaled.py +28 -0
- fungeom/primitives/vec3/resolvers/sum.py +27 -0
- fungeom/primitives/vec3/value.py +30 -0
- fungeom/py.typed +0 -0
- fungeom/values.py +87 -0
- fungeom/viz.py +51 -0
- fungeom-0.1.0.dist-info/METADATA +168 -0
- fungeom-0.1.0.dist-info/RECORD +470 -0
- fungeom-0.1.0.dist-info/WHEEL +4 -0
- fungeom-0.1.0.dist-info/licenses/LICENSE +201 -0
fungeom/__init__.py
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""fungeom — a functional geometry API.
|
|
2
|
+
|
|
3
|
+
Geometry is described as an immutable, lazily-evaluated graph of resolvers. Each
|
|
4
|
+
primitive is one class — ``Scalar``, ``Vec2``, ``Vec3``, ``Direction3``,
|
|
5
|
+
``Transform``, ``Frame``, ``Point3`` — that you both construct from (classmethods
|
|
6
|
+
like ``Vec3.of`` / ``Point3.at``) and compose with (fluent methods like
|
|
7
|
+
``a.midpoint(b)``). Build a graph, ``decide()`` whether it can be resolved, then
|
|
8
|
+
``resolve()`` to get a concrete value (reachable as ``<Primitive>.Value``).
|
|
9
|
+
|
|
10
|
+
The decidability core (``Resolver``, ``Resolvable``, ``Unresolvable``,
|
|
11
|
+
``gather``) is public; the concrete resolvers behind each facade are not.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from fungeom.core import (
|
|
15
|
+
Resolvability,
|
|
16
|
+
Resolvable,
|
|
17
|
+
Resolver,
|
|
18
|
+
Unresolvable,
|
|
19
|
+
UnresolvableError,
|
|
20
|
+
gather,
|
|
21
|
+
)
|
|
22
|
+
from fungeom.primitives import (
|
|
23
|
+
MASTER_CLOCK,
|
|
24
|
+
WORLD_FRAME,
|
|
25
|
+
WORLD_FRAME2,
|
|
26
|
+
AffineTimeMap,
|
|
27
|
+
Bool,
|
|
28
|
+
BoolSeries,
|
|
29
|
+
BoolSignal,
|
|
30
|
+
Boundary,
|
|
31
|
+
Clock,
|
|
32
|
+
CoordinateFrame,
|
|
33
|
+
CoordinateFrame2,
|
|
34
|
+
Direction3Signal,
|
|
35
|
+
Coverage,
|
|
36
|
+
CoverageValue,
|
|
37
|
+
Direction2,
|
|
38
|
+
Direction2Value,
|
|
39
|
+
Direction3,
|
|
40
|
+
Duration,
|
|
41
|
+
Frame,
|
|
42
|
+
Frame2,
|
|
43
|
+
Instant,
|
|
44
|
+
Interpolation,
|
|
45
|
+
Interval,
|
|
46
|
+
IntervalValue,
|
|
47
|
+
Line,
|
|
48
|
+
Line2,
|
|
49
|
+
Line2Value,
|
|
50
|
+
LineValue,
|
|
51
|
+
Mat3,
|
|
52
|
+
Mat4,
|
|
53
|
+
Plane,
|
|
54
|
+
PlaneValue,
|
|
55
|
+
Point2,
|
|
56
|
+
Point2Value,
|
|
57
|
+
Point3,
|
|
58
|
+
PlaneSignal,
|
|
59
|
+
Point3Signal,
|
|
60
|
+
Ray,
|
|
61
|
+
Ray2,
|
|
62
|
+
Ray2Value,
|
|
63
|
+
RayValue,
|
|
64
|
+
Face,
|
|
65
|
+
FaceValue,
|
|
66
|
+
Region2,
|
|
67
|
+
Region2Value,
|
|
68
|
+
Roster,
|
|
69
|
+
RosterValue,
|
|
70
|
+
RosterMap,
|
|
71
|
+
KeyCorrespondence,
|
|
72
|
+
Mat2,
|
|
73
|
+
RigidTransform,
|
|
74
|
+
RigidTransform2,
|
|
75
|
+
Segment,
|
|
76
|
+
Segment2,
|
|
77
|
+
Segment2Value,
|
|
78
|
+
SegmentValue,
|
|
79
|
+
Transform2,
|
|
80
|
+
SampledSeries,
|
|
81
|
+
Sampling,
|
|
82
|
+
SamplingValue,
|
|
83
|
+
Scalar,
|
|
84
|
+
ScalarSignal,
|
|
85
|
+
BoolBundle,
|
|
86
|
+
Bundle,
|
|
87
|
+
BundleValue,
|
|
88
|
+
Direction3Bundle,
|
|
89
|
+
PiecewiseLinearWarp,
|
|
90
|
+
Point2Bundle,
|
|
91
|
+
Point3Bundle,
|
|
92
|
+
Point3BundleSignal,
|
|
93
|
+
ScalarBundleSignal,
|
|
94
|
+
ScalarBundle,
|
|
95
|
+
TransformBundle,
|
|
96
|
+
TransformBundleSignal,
|
|
97
|
+
Vec3Bundle,
|
|
98
|
+
TimeMap,
|
|
99
|
+
TimeWarp,
|
|
100
|
+
Timeline,
|
|
101
|
+
Transform,
|
|
102
|
+
TransformSignal,
|
|
103
|
+
Vec2,
|
|
104
|
+
Vec3,
|
|
105
|
+
Vec3Signal,
|
|
106
|
+
)
|
|
107
|
+
from importlib.metadata import PackageNotFoundError
|
|
108
|
+
from importlib.metadata import version as _package_version
|
|
109
|
+
|
|
110
|
+
from fungeom.viz import render_tree, resolver_tree
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
__version__ = _package_version("fungeom")
|
|
114
|
+
except PackageNotFoundError: # pragma: no cover - only hit running from an uninstalled source tree
|
|
115
|
+
__version__ = "0.0.0+unknown"
|
|
116
|
+
|
|
117
|
+
__all__ = [
|
|
118
|
+
"__version__",
|
|
119
|
+
# primitives (facades)
|
|
120
|
+
"Bool",
|
|
121
|
+
"Scalar",
|
|
122
|
+
"Vec2",
|
|
123
|
+
"Vec3",
|
|
124
|
+
"Direction2",
|
|
125
|
+
"Direction3",
|
|
126
|
+
"Transform",
|
|
127
|
+
"Transform2",
|
|
128
|
+
"Frame",
|
|
129
|
+
"Frame2",
|
|
130
|
+
"Point2",
|
|
131
|
+
"Point3",
|
|
132
|
+
"Plane",
|
|
133
|
+
"Region2",
|
|
134
|
+
"Face",
|
|
135
|
+
"Line",
|
|
136
|
+
"Line2",
|
|
137
|
+
"Ray",
|
|
138
|
+
"Ray2",
|
|
139
|
+
"Segment",
|
|
140
|
+
"Segment2",
|
|
141
|
+
# temporal
|
|
142
|
+
"Duration",
|
|
143
|
+
"Instant",
|
|
144
|
+
"Interval",
|
|
145
|
+
"Coverage",
|
|
146
|
+
"TimeMap",
|
|
147
|
+
"TimeWarp",
|
|
148
|
+
"Timeline",
|
|
149
|
+
"Sampling",
|
|
150
|
+
"Bundle",
|
|
151
|
+
"ScalarBundle",
|
|
152
|
+
"Vec3Bundle",
|
|
153
|
+
"Direction3Bundle",
|
|
154
|
+
"BoolBundle",
|
|
155
|
+
"TransformBundle",
|
|
156
|
+
"Point2Bundle",
|
|
157
|
+
"Point3Bundle",
|
|
158
|
+
"PlaneSignal",
|
|
159
|
+
"Point3BundleSignal",
|
|
160
|
+
"ScalarBundleSignal",
|
|
161
|
+
"TransformBundleSignal",
|
|
162
|
+
"BoolSignal",
|
|
163
|
+
"Roster",
|
|
164
|
+
"RosterMap",
|
|
165
|
+
"Interpolation",
|
|
166
|
+
"Boundary",
|
|
167
|
+
"ScalarSignal",
|
|
168
|
+
"Vec3Signal",
|
|
169
|
+
"Direction3Signal",
|
|
170
|
+
"TransformSignal",
|
|
171
|
+
"Point3Signal",
|
|
172
|
+
# commonly-used value types
|
|
173
|
+
"RigidTransform",
|
|
174
|
+
"RigidTransform2",
|
|
175
|
+
"Mat2",
|
|
176
|
+
"Point2Value",
|
|
177
|
+
"Region2Value",
|
|
178
|
+
"FaceValue",
|
|
179
|
+
"PlaneValue",
|
|
180
|
+
"LineValue",
|
|
181
|
+
"Line2Value",
|
|
182
|
+
"RayValue",
|
|
183
|
+
"Ray2Value",
|
|
184
|
+
"SegmentValue",
|
|
185
|
+
"Segment2Value",
|
|
186
|
+
"Direction2Value",
|
|
187
|
+
"CoordinateFrame",
|
|
188
|
+
"WORLD_FRAME",
|
|
189
|
+
"CoordinateFrame2",
|
|
190
|
+
"WORLD_FRAME2",
|
|
191
|
+
"IntervalValue",
|
|
192
|
+
"CoverageValue",
|
|
193
|
+
"AffineTimeMap",
|
|
194
|
+
"PiecewiseLinearWarp",
|
|
195
|
+
"BundleValue",
|
|
196
|
+
"RosterValue",
|
|
197
|
+
"KeyCorrespondence",
|
|
198
|
+
"Clock",
|
|
199
|
+
"MASTER_CLOCK",
|
|
200
|
+
"SamplingValue",
|
|
201
|
+
"BoolSeries",
|
|
202
|
+
"SampledSeries",
|
|
203
|
+
"Mat3",
|
|
204
|
+
"Mat4",
|
|
205
|
+
# decidability core
|
|
206
|
+
"Resolver",
|
|
207
|
+
"Resolvability",
|
|
208
|
+
"Resolvable",
|
|
209
|
+
"Unresolvable",
|
|
210
|
+
"UnresolvableError",
|
|
211
|
+
"gather",
|
|
212
|
+
# visualization
|
|
213
|
+
"resolver_tree",
|
|
214
|
+
"render_tree",
|
|
215
|
+
]
|
fungeom/core/__init__.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from .arrays import ArrayLike, freeze
|
|
2
|
+
from .resolvability import (
|
|
3
|
+
Resolvability,
|
|
4
|
+
Resolvable,
|
|
5
|
+
Unresolvable,
|
|
6
|
+
UnresolvableError,
|
|
7
|
+
gather,
|
|
8
|
+
)
|
|
9
|
+
from .resolver import Resolver
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
# resolver / resolvability
|
|
13
|
+
"Resolver",
|
|
14
|
+
"Resolvability",
|
|
15
|
+
"Resolvable",
|
|
16
|
+
"Unresolvable",
|
|
17
|
+
"UnresolvableError",
|
|
18
|
+
"gather",
|
|
19
|
+
# arrays
|
|
20
|
+
"ArrayLike",
|
|
21
|
+
"freeze",
|
|
22
|
+
]
|
fungeom/core/arrays.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Generic numpy helpers shared across primitives.
|
|
2
|
+
|
|
3
|
+
These have no geometric meaning of their own — they are the small,
|
|
4
|
+
primitive-agnostic array utilities that the value types lean on. Keeping them in
|
|
5
|
+
``core`` lets every primitive (vectors, transforms, points) depend on them
|
|
6
|
+
without any of them depending on each other.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import numpy.typing as npt
|
|
14
|
+
|
|
15
|
+
type ArrayLike = npt.ArrayLike
|
|
16
|
+
"""Anything coercible into an array: a numpy array, a list, a tuple of numbers."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def freeze(arr: npt.NDArray[Any]) -> None:
|
|
20
|
+
"""Mark a numpy array read-only, in place.
|
|
21
|
+
|
|
22
|
+
Used by the frozen value dataclasses so that an immutable value object cannot
|
|
23
|
+
have its backing buffer mutated out from under it.
|
|
24
|
+
"""
|
|
25
|
+
arr.setflags(write=False)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Resolvability: evidence about whether a resolver can be resolved.
|
|
2
|
+
|
|
3
|
+
Deciding whether a :class:`~fungeom.core.resolver.Resolver` can produce a
|
|
4
|
+
value is itself a computation over its graph. Rather than collapse that into a
|
|
5
|
+
bare ``bool`` (which would throw away *why* something cannot be resolved), the
|
|
6
|
+
decision is reified as a small sum type:
|
|
7
|
+
|
|
8
|
+
* :class:`Resolvable` — proof that resolution succeeds, carrying the value it
|
|
9
|
+
computed along the way (so a later ``resolve()`` is free).
|
|
10
|
+
* :class:`Unresolvable` — proof that it does not, carrying a human-readable
|
|
11
|
+
reason.
|
|
12
|
+
|
|
13
|
+
``Resolvability[T] = Resolvable[T] | Unresolvable`` is what ``Resolver.decide()``
|
|
14
|
+
returns. :class:`Unresolvable` is deliberately *not* generic: a failure carries
|
|
15
|
+
only a reason, so the same value can flow out of a ``Vec3`` decision and into a
|
|
16
|
+
``Point3`` one without rewrapping. Because the decision is an ordinary value, you
|
|
17
|
+
can pass it around, ``match`` on it, or require :class:`Resolvable` in a function
|
|
18
|
+
signature to demand a *proven-resolvable* input at type-check time.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from collections.abc import Iterable
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from typing import ClassVar, NoReturn
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class UnresolvableError(Exception):
|
|
29
|
+
"""Raised when something that cannot be resolved is asked to resolve."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class Resolvable[T]:
|
|
34
|
+
"""Evidence that a resolver resolves, carrying the computed value."""
|
|
35
|
+
|
|
36
|
+
value: T
|
|
37
|
+
|
|
38
|
+
ok: ClassVar[bool] = True
|
|
39
|
+
|
|
40
|
+
def unwrap(self) -> T:
|
|
41
|
+
"""Return the resolved value."""
|
|
42
|
+
return self.value
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True)
|
|
46
|
+
class Unresolvable:
|
|
47
|
+
"""Evidence that a resolver does not resolve, and why."""
|
|
48
|
+
|
|
49
|
+
reason: str
|
|
50
|
+
|
|
51
|
+
ok: ClassVar[bool] = False
|
|
52
|
+
|
|
53
|
+
def unwrap(self) -> NoReturn:
|
|
54
|
+
"""Raise :class:`UnresolvableError` with the captured reason."""
|
|
55
|
+
raise UnresolvableError(self.reason)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
type Resolvability[T] = Resolvable[T] | Unresolvable
|
|
59
|
+
"""The result of :meth:`~fungeom.core.resolver.Resolver.decide`."""
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def gather[T](decisions: Iterable[Resolvability[T]]) -> Resolvability[list[T]]:
|
|
63
|
+
"""Collect many decisions into one.
|
|
64
|
+
|
|
65
|
+
Returns :class:`Resolvable` with every value once they all succeed, or the
|
|
66
|
+
first :class:`Unresolvable` encountered. This is the ``traverse`` that makes
|
|
67
|
+
N-ary combinators (a centroid, a polyline, ...) short and uniform.
|
|
68
|
+
"""
|
|
69
|
+
values: list[T] = []
|
|
70
|
+
for decision in decisions:
|
|
71
|
+
if isinstance(decision, Unresolvable):
|
|
72
|
+
return decision
|
|
73
|
+
values.append(decision.value)
|
|
74
|
+
return Resolvable(values)
|
fungeom/core/resolver.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""The ``Resolver`` abstraction: the spine of the functional API.
|
|
2
|
+
|
|
3
|
+
A ``Resolver[T]`` is a *deferred* description of a value of type ``T``. Nothing
|
|
4
|
+
is computed when you build one; the value is produced only when you resolve it.
|
|
5
|
+
Because resolvers are immutable, every transformation (``translate``,
|
|
6
|
+
``reframe``, ...) returns a *new* resolver rather than mutating the existing one.
|
|
7
|
+
Chains of resolvers therefore form a directed acyclic graph (a lazy expression
|
|
8
|
+
tree) that is evaluated on demand.
|
|
9
|
+
|
|
10
|
+
The single primitive every concrete resolver implements is :meth:`_decide`, which
|
|
11
|
+
*proves* whether the resolver can be resolved (returning the value on success or
|
|
12
|
+
a reason on failure). The public :meth:`decide` memoizes it; ``resolve()`` and
|
|
13
|
+
``is_resolvable`` are derived from :meth:`decide`, so deciding and resolving can
|
|
14
|
+
never disagree, and a shared sub-graph is decided at most once.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from abc import ABC, abstractmethod
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
from fungeom.core.resolvability import Resolvability
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Resolver[T](ABC):
|
|
26
|
+
"""A generic object that can be resolved to a value of type ``T``.
|
|
27
|
+
|
|
28
|
+
Subclasses describe *how* to produce a ``T`` and implement :meth:`_decide`.
|
|
29
|
+
Resolvers are expected to be immutable value objects so that the expression
|
|
30
|
+
graph they form is safe to share and cache.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def _decide(self) -> Resolvability[T]:
|
|
35
|
+
"""Compute this resolver's decision. Implemented by each concrete resolver.
|
|
36
|
+
|
|
37
|
+
Returns :class:`~fungeom.core.resolvability.Resolvable` carrying
|
|
38
|
+
the computed value, or
|
|
39
|
+
:class:`~fungeom.core.resolvability.Unresolvable` carrying the
|
|
40
|
+
reason it cannot be resolved. Call :meth:`decide` (which memoizes this).
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def decide(self) -> Resolvability[T]:
|
|
44
|
+
"""Prove whether this resolver can be resolved (memoized).
|
|
45
|
+
|
|
46
|
+
The result is cached on the (immutable) resolver, so deciding it again —
|
|
47
|
+
or deciding a graph that reuses it as a sub-expression — is free.
|
|
48
|
+
"""
|
|
49
|
+
cached: Resolvability[T] | None = getattr(self, "_decision", None)
|
|
50
|
+
if cached is None:
|
|
51
|
+
cached = self._decide()
|
|
52
|
+
object.__setattr__(self, "_decision", cached)
|
|
53
|
+
return cached
|
|
54
|
+
|
|
55
|
+
def resolve(self) -> T:
|
|
56
|
+
"""Resolve to a concrete value, or raise ``UnresolvableError``.
|
|
57
|
+
|
|
58
|
+
This is total only when you already hold proof of resolvability (e.g.
|
|
59
|
+
the value returned by :meth:`decide` matched as ``Resolvable``).
|
|
60
|
+
"""
|
|
61
|
+
return self.decide().unwrap()
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def is_resolvable(self) -> bool:
|
|
65
|
+
"""Whether :meth:`resolve` would succeed."""
|
|
66
|
+
return self.decide().ok
|
|
67
|
+
|
|
68
|
+
def children(self) -> list[Resolver[Any]]:
|
|
69
|
+
"""The immediate sub-resolvers this one is built from.
|
|
70
|
+
|
|
71
|
+
Found by inspecting dataclass fields (including those holding a tuple or
|
|
72
|
+
list of resolvers), so combinators expose their structure for free —
|
|
73
|
+
enough to walk or visualize the lazy graph.
|
|
74
|
+
"""
|
|
75
|
+
field_names: dict[str, Any] | None = getattr(self, "__dataclass_fields__", None)
|
|
76
|
+
if not field_names:
|
|
77
|
+
return []
|
|
78
|
+
found: list[Resolver[Any]] = []
|
|
79
|
+
for name in field_names:
|
|
80
|
+
value = getattr(self, name)
|
|
81
|
+
if isinstance(value, Resolver):
|
|
82
|
+
found.append(value)
|
|
83
|
+
elif isinstance(value, (tuple, list)):
|
|
84
|
+
found.extend(item for item in value if isinstance(item, Resolver))
|
|
85
|
+
return found
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Geometric primitives, each a submodule with the same shape.
|
|
2
|
+
|
|
3
|
+
Every primitive is one **facade class** (the resolver) with classmethod
|
|
4
|
+
constructors and fluent combinators; its resolved value is reachable as
|
|
5
|
+
``<Primitive>.Value``. Concrete resolvers live behind the facade (one file each
|
|
6
|
+
under ``<primitive>/resolvers/``) and are not part of the public surface.
|
|
7
|
+
|
|
8
|
+
Submodules: ``boolean``, ``scalar``, ``vec2``, ``vec3``, ``direction3``, ``transform``,
|
|
9
|
+
``frame``, ``point3``, plus the temporal ``duration`` / ``instant`` / ``interval``
|
|
10
|
+
/ ``coverage`` / ``timemap`` / ``timeline`` / ``sampling`` and the ``signals``
|
|
11
|
+
package (scalar / vec3 / direction3 / transform / point3, over one generic core).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from fungeom.primitives.boolean import Bool
|
|
15
|
+
from fungeom.primitives.coverage import Coverage, CoverageValue
|
|
16
|
+
from fungeom.primitives.direction2 import Direction2, Direction2Value
|
|
17
|
+
from fungeom.primitives.direction3 import Direction3, Direction3Value
|
|
18
|
+
from fungeom.primitives.duration import Duration
|
|
19
|
+
from fungeom.primitives.frame import WORLD_FRAME, CoordinateFrame, Frame
|
|
20
|
+
from fungeom.primitives.frame2 import WORLD_FRAME2, CoordinateFrame2, Frame2
|
|
21
|
+
from fungeom.primitives.instant import Instant
|
|
22
|
+
from fungeom.primitives.interval import Interval, IntervalValue
|
|
23
|
+
from fungeom.primitives.line import Line, LineValue
|
|
24
|
+
from fungeom.primitives.line2 import Line2, Line2Value
|
|
25
|
+
from fungeom.primitives.plane import Plane, PlaneValue
|
|
26
|
+
from fungeom.primitives.point2 import Point2, Point2Value
|
|
27
|
+
from fungeom.primitives.point3 import Point3, Point3Value
|
|
28
|
+
from fungeom.primitives.ray import Ray, RayValue
|
|
29
|
+
from fungeom.primitives.ray2 import Ray2, Ray2Value
|
|
30
|
+
from fungeom.primitives.roster import Roster, RosterValue
|
|
31
|
+
from fungeom.primitives.rostermap import KeyCorrespondence, RosterMap
|
|
32
|
+
from fungeom.primitives.sampling import Sampling, SamplingValue
|
|
33
|
+
from fungeom.primitives.segment import Segment, SegmentValue
|
|
34
|
+
from fungeom.primitives.segment2 import Segment2, Segment2Value
|
|
35
|
+
from fungeom.primitives.scalar import Scalar
|
|
36
|
+
from fungeom.primitives.signals import (
|
|
37
|
+
BoolSignal,
|
|
38
|
+
Boundary,
|
|
39
|
+
Direction3Signal,
|
|
40
|
+
Interpolation,
|
|
41
|
+
PlaneSignal,
|
|
42
|
+
Point3BundleSignal,
|
|
43
|
+
ScalarBundleSignal,
|
|
44
|
+
Point3Signal,
|
|
45
|
+
BoolSeries,
|
|
46
|
+
SampledSeries,
|
|
47
|
+
ScalarSignal,
|
|
48
|
+
TransformBundleSignal,
|
|
49
|
+
TransformSignal,
|
|
50
|
+
Vec3Signal,
|
|
51
|
+
)
|
|
52
|
+
from fungeom.primitives.timeline import MASTER_CLOCK, Clock, Timeline
|
|
53
|
+
from fungeom.primitives.bundle import (
|
|
54
|
+
BoolBundle,
|
|
55
|
+
Bundle,
|
|
56
|
+
BundleValue,
|
|
57
|
+
Direction3Bundle,
|
|
58
|
+
Point2Bundle,
|
|
59
|
+
Point3Bundle,
|
|
60
|
+
ScalarBundle,
|
|
61
|
+
TransformBundle,
|
|
62
|
+
Vec3Bundle,
|
|
63
|
+
)
|
|
64
|
+
from fungeom.primitives.region2 import Region2, Region2Value
|
|
65
|
+
from fungeom.primitives.face import Face, FaceValue
|
|
66
|
+
from fungeom.primitives.timemap import AffineTimeMap, TimeMap
|
|
67
|
+
from fungeom.primitives.timewarp import PiecewiseLinearWarp, TimeWarp
|
|
68
|
+
from fungeom.primitives.transform import Mat3, Mat4, RigidTransform, Transform
|
|
69
|
+
from fungeom.primitives.transform2 import Mat2, RigidTransform2, Transform2
|
|
70
|
+
from fungeom.primitives.vec2 import Float2, Vec2
|
|
71
|
+
from fungeom.primitives.vec3 import Float3, Vec3
|
|
72
|
+
|
|
73
|
+
__all__ = [
|
|
74
|
+
# facades
|
|
75
|
+
"Bool",
|
|
76
|
+
"Scalar",
|
|
77
|
+
"Vec2",
|
|
78
|
+
"Vec3",
|
|
79
|
+
"Direction2",
|
|
80
|
+
"Direction3",
|
|
81
|
+
"Transform",
|
|
82
|
+
"Transform2",
|
|
83
|
+
"Frame",
|
|
84
|
+
"Frame2",
|
|
85
|
+
"Point2",
|
|
86
|
+
"Point3",
|
|
87
|
+
"Plane",
|
|
88
|
+
"Region2",
|
|
89
|
+
"Face",
|
|
90
|
+
"Line",
|
|
91
|
+
"Line2",
|
|
92
|
+
"Ray",
|
|
93
|
+
"Ray2",
|
|
94
|
+
"Segment",
|
|
95
|
+
"Segment2",
|
|
96
|
+
# temporal
|
|
97
|
+
"Duration",
|
|
98
|
+
"Instant",
|
|
99
|
+
"Interval",
|
|
100
|
+
"Coverage",
|
|
101
|
+
"TimeMap",
|
|
102
|
+
"TimeWarp",
|
|
103
|
+
"Timeline",
|
|
104
|
+
"Sampling",
|
|
105
|
+
"Bundle",
|
|
106
|
+
"BoolBundle",
|
|
107
|
+
"ScalarBundle",
|
|
108
|
+
"Vec3Bundle",
|
|
109
|
+
"Direction3Bundle",
|
|
110
|
+
"TransformBundle",
|
|
111
|
+
"Point2Bundle",
|
|
112
|
+
"Point3Bundle",
|
|
113
|
+
"PlaneSignal",
|
|
114
|
+
"Point3BundleSignal",
|
|
115
|
+
"ScalarBundleSignal",
|
|
116
|
+
"TransformBundleSignal",
|
|
117
|
+
"BoolSignal",
|
|
118
|
+
"Roster",
|
|
119
|
+
"RosterMap",
|
|
120
|
+
"Interpolation",
|
|
121
|
+
"Boundary",
|
|
122
|
+
"ScalarSignal",
|
|
123
|
+
"Vec3Signal",
|
|
124
|
+
"Direction3Signal",
|
|
125
|
+
"TransformSignal",
|
|
126
|
+
"Point3Signal",
|
|
127
|
+
# value types
|
|
128
|
+
"IntervalValue",
|
|
129
|
+
"CoverageValue",
|
|
130
|
+
"AffineTimeMap",
|
|
131
|
+
"PiecewiseLinearWarp",
|
|
132
|
+
"Clock",
|
|
133
|
+
"MASTER_CLOCK",
|
|
134
|
+
"SamplingValue",
|
|
135
|
+
"BoolSeries",
|
|
136
|
+
"SampledSeries",
|
|
137
|
+
"BundleValue",
|
|
138
|
+
"RosterValue",
|
|
139
|
+
"KeyCorrespondence",
|
|
140
|
+
"Float2",
|
|
141
|
+
"Float3",
|
|
142
|
+
"Mat2",
|
|
143
|
+
"Mat3",
|
|
144
|
+
"Mat4",
|
|
145
|
+
"RigidTransform",
|
|
146
|
+
"RigidTransform2",
|
|
147
|
+
"CoordinateFrame",
|
|
148
|
+
"WORLD_FRAME",
|
|
149
|
+
"CoordinateFrame2",
|
|
150
|
+
"WORLD_FRAME2",
|
|
151
|
+
"Point2Value",
|
|
152
|
+
"Region2Value",
|
|
153
|
+
"FaceValue",
|
|
154
|
+
"Point3Value",
|
|
155
|
+
"PlaneValue",
|
|
156
|
+
"LineValue",
|
|
157
|
+
"Line2Value",
|
|
158
|
+
"RayValue",
|
|
159
|
+
"Ray2Value",
|
|
160
|
+
"SegmentValue",
|
|
161
|
+
"Segment2Value",
|
|
162
|
+
"Direction2Value",
|
|
163
|
+
"Direction3Value",
|
|
164
|
+
]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from fungeom.primitives.boolean.resolvers.base import Bool
|
|
2
|
+
from fungeom.primitives.boolean.resolvers.literal import LiteralBool
|
|
3
|
+
|
|
4
|
+
# The truth-value constants, as resolvers (see ``Bool.true`` / ``Bool.false``).
|
|
5
|
+
Bool.true = LiteralBool(value=True)
|
|
6
|
+
Bool.false = LiteralBool(value=False)
|
|
7
|
+
|
|
8
|
+
__all__ = ["Bool"]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Resolvability aliases for booleans."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from fungeom.core.resolvability import Resolvability, Resolvable, Unresolvable
|
|
6
|
+
|
|
7
|
+
type BoolResolvable = Resolvable[bool]
|
|
8
|
+
"""A boolean decision that succeeded — carries the truth value."""
|
|
9
|
+
|
|
10
|
+
type BoolUnresolvable = Unresolvable
|
|
11
|
+
"""A boolean decision that failed — carries the reason (e.g. an unresolvable operand)."""
|
|
12
|
+
|
|
13
|
+
type BoolDecision = Resolvability[bool]
|
|
14
|
+
"""The result of deciding a ``Bool``."""
|
|
File without changes
|