Module Beloch.Collapse

Single-vertex collapse: fold along n >= 4 material crease segments sharing one interior endpoint O — the flat end state of a multi-crease move (rabbit ear hull2020, Thm 8.5). Skips the 3D intermediate entirely: checks the end state exists (reflection closure = Kawasaki, Maekawa), assigns per-sector isometries, enumerates valid layer orders.

type elem = {
  1. cid : int;
  2. ea : Geom.point;
  3. eb : Geom.point;
  4. valley : bool;
}
val e_no_vertex : string
val e_count : string
val e_midpaper : string
val e_kawasaki : string
val e_maekawa : string
val e_selfint : string
val e_contra : string
val e_dup_ray : string
val e_ambig : int -> string
val e_out_of_paper : string
val e_stayer_collinear : string
val e_stayer_dead : string
val hint_of : string -> string option
type stayer =
  1. | Arc of Geom.point * Geom.point
  2. | Faces of int list
exception Stayer_collinear
val cross : (Num.t * Num.t) -> (Num.t * Num.t) -> (Num.t * Num.t) -> Num.t
val common_vertex : elem list -> Geom.point option
val far_of : Geom.point -> elem -> Geom.point
val sort_ccw : Geom.point -> elem list -> (Geom.point * elem) list
val has_duplicate_ray : Geom.point -> (Geom.point * 'a) array -> bool
val sector_isometries : Geom.point -> (Geom.point * 'a) array -> Isometry.t array
val effective_valley : bool -> Isometry.t -> Isometry.t -> bool
val is_identity : Isometry.t -> bool
val closure_ok : Geom.point -> (Geom.point * 'a) array -> bool
val on_unit_boundary : Geom.point -> bool
val strictly_interior : Geom.point -> bool
val linear_extensions : int -> (int * int) list -> int array list
val sector_of_poly : Geom.point -> (Geom.point * 'a) array -> (Geom.point array * Isometry.t) -> int
val in_ccw_arc : Geom.point -> Geom.point -> Geom.point -> Geom.point -> bool
val rotate_rays : 'a array -> int -> 'a array
val admissible_sectors : stayer:stayer -> Geom.point -> (Geom.point * 'a) array -> int array -> int -> int list
val prepipeline_geom : elem list -> (Geom.point * (Geom.point * elem) array, string) Stdlib.result
val maekawa_ok : bool list -> bool
val prepipeline : elem list -> (Geom.point * (Geom.point * elem) array, string) Stdlib.result
type pipeline = {
  1. root : int;
  2. candidate_at : root:int -> base:Isometry3.t -> int array -> (Fold_state.t, Fold_state.violation) Stdlib.result;
  3. distinct : int array list;
}
type sector_geom = {
  1. sg_g : Fold_state.t;
  2. sg_o : Geom.point;
  3. sg_rays : (Geom.point * elem) array;
  4. sg_faces : Geom.point array array;
  5. sg_nf : int;
  6. sg_n : int;
  7. sg_tsec : Isometry.t array;
  8. sg_sec : int array;
  9. sg_ray_rep : Isometry.t array;
  10. sg_g_rank : int array;
  11. sg_root : int;
  12. sg_marks : Fold_state.mark array;
  13. sg_old_hinges : Fold_state.hinge array;
  14. sg_hinge_ray : int option array;
  15. mutable sg_overlaps : (int * int) list option;
}
val mk_sector_geom : Fold_state.t -> o:Geom.point -> rays:(Geom.point * elem) array -> faces:Geom.point array array -> nf:int -> sector_geom
val pipeline_solve : sector_geom -> valley:bool array -> over:(int * int) list -> (pipeline, string) Stdlib.result
val pipeline_at : Fold_state.t -> o:Geom.point -> rays:(Geom.point * elem) array -> faces:Geom.point array array -> nf:int -> over:(int * int) list -> (pipeline, string) Stdlib.result
val in_bounds : Fold_state.t -> bool
val anchor_realization : Fold_state.t -> root:int -> candidate_at: (root:int -> base:Isometry3.t -> int array -> (Fold_state.t, Fold_state.violation) Stdlib.result) -> int array -> (Fold_state.t, string) Stdlib.result
val pool_of_runs : [ `Err of string | `Run of (Fold_state.t, string) Stdlib.result list ] list -> (Fold_state.t list, string) Stdlib.result
val collapse_runs : Fold_state.t -> elem list -> over:(int * int) list -> stayer:stayer -> (Fold_state.t list, string) Stdlib.result
val collapse_all_patterns : Fold_state.t -> elem list -> over:(int * int) list -> stayer:stayer -> patterns:bool list list -> (Fold_state.t list, string) Stdlib.result list
val collapse : Fold_state.t -> elem list -> over:(int * int) list -> stayer:stayer -> (Fold_state.t, string) Stdlib.result
val collapse_all : Fold_state.t -> elem list -> over:(int * int) list -> stayer:stayer -> (Fold_state.t list, string) Stdlib.result