This is a public, read-only report. Striff reads this repository's docs, turns each sentence that makes a claim about the code into a rule, and checks the rule against the code on the default branch. How this works
When True, it triggers Wing._explode_wing to replace the supplied wing cross sections with single-strip cross sections.
Wing has _explode_wing
Holds
Every other callable (a custom spacing function, an AeroelasticWingMovement's spacingAnglesSecondDerivative_Gs_to_Wn_ixyz entry, or a FreeFlightUnsteadyProblem's external_loads_fn) serializes as an inert marker holding its qualified name, its dedented source text when inspect.getsource can retrieve it, and the SHA-256 hash of that text.
FreeFlightUnsteadyProblem has external_loads_fn
Holds
UnsteadyProblem extends CoreUnsteadyProblem.
UnsteadyProblem extends CoreUnsteadyProblem
Holds
Attribute movement, Type Movement, Defined On UnsteadyProblem, Notes Movement definition
UnsteadyProblem has a movement field
Holds
Attribute only_final_results, Type bool, Defined On CoreUnsteadyProblem, Notes Results flag
CoreUnsteadyProblem has an only_final_results field
Holds
Attribute num_steps, Type int, Defined On CoreUnsteadyProblem, Notes Copied from Movement
CoreUnsteadyProblem has a num_steps field
Holds
Attribute delta_time, Type float, Defined On CoreUnsteadyProblem, Notes Copied from Movement
CoreUnsteadyProblem has a delta_time field
Holds
Attribute first_averaging_step, Type int, Defined On CoreUnsteadyProblem, Notes Computed during init
CoreUnsteadyProblem has a first_averaging_step field
Holds
Attribute first_results_step, Type int, Defined On CoreUnsteadyProblem, Notes Computed during init
CoreUnsteadyProblem has a first_results_step field
Holds
Attribute max_wake_rows, Type int , Defined On None, Notes CoreUnsteadyProblem
CoreUnsteadyProblem has a max_wake_rows field
Holds
Attribute steady_problems, Type tuple[SteadyProblem, ...], Defined On UnsteadyProblem, Notes Generated during init
UnsteadyProblem has a steady_problems field
Holds
The mutable solver result lists are defined on CoreUnsteadyProblem and must remain mutable as they are populated after initialization by the solver.
6 rules from this sentence
CoreUnsteadyProblem has finalRmsForces_G, finalRmsForceCoefficients_G, finalRmsMoments_G_Cg and 3 more
Holdsall 6
It is the base for concrete subclasses (AeroelasticUnsteadyProblem and FreeFlightUnsteadyProblem, both documented below) whose per-step SteadyProblem depends on the solver's results from the previous step: deformed wing geometry for aeroelasticity, updated rigid body state for free flight.
Attribute movement, Type CoreMovement, Notes Source of delta_time , num_steps , max_wake_rows , and _lcm_period
CoupledUnsteadyProblem has a movement field
Holds
Attribute steady_problems, Type tuple[SteadyProblem, ...], Notes Read-only view of the _steady_problems backing list Returned tuple is frozen, but successive calls may return different-length tuples (see below)
CoupledUnsteadyProblem has a steady_problems field
Holds
On CoupledUnsteadyProblem, the first guarantee still holds (callers cannot mutate the tuple), but the second does not. The backing slot _steady_problems is a list[SteadyProblem] seeded at init with a single entry built from initial_airplanes and initial_operating_point.
CoupledUnsteadyProblem depends on SteadyProblem
Holds
Attribute wing_density, Type float, Notes Mass per unit span area (kg/m^2)
AeroelasticUnsteadyProblem has wing_density
Holds
Attribute spring_constant_rad, Type float, Notes Torsional spring stiffness (N m/rad)
AeroelasticUnsteadyProblem has spring_constant_rad
AeroelasticUnsteadyProblem has damping_constant_rad
Holds
Attribute step_discards, Type int, Notes Number of initial steps discarded for stability
AeroelasticUnsteadyProblem has step_discards
Holds
Property movement, Depends On _movement, Notes Overrides the inherited property, casting the inherited _movement slot to AeroelasticMovement (recomputed, uncached)
AeroelasticUnsteadyProblem has movement
Holds
Attribute listDeformationAnglesYRad_Wcsp_to_Wcs_ixyz, Type list[list[np.ndarray]], Notes Cumulative torsional angle time series (radians), indexed wing , seeded
AeroelasticUnsteadyProblem has listDeformationAnglesYRad_Wcsp_to_Wcs_ixyz
Holds
Attribute _listDeformationAnglesDerivativeYRad_Wcsp_to_Wcs_ixyz, Type list[list[np.ndarray]], Notes Torsional angle time derivative time series (rad/s), indexed wing , seeded
AeroelasticUnsteadyProblem has _listDeformationAnglesDerivativeYRad_Wcsp_to_Wcs_ixyz
Holds
It couples aerodynamic loads with six-degree-of-freedom rigid body dynamics, integrated by a MuJoCoModel, so that the Airplane's position, orientation, and velocity at a given time step are driven by the previous step's aerodynamic loads, gravity, and any external loads.
FreeFlightUnsteadyProblem depends on MuJoCoModel
Holds
Attribute I_BP1_CgP1, Type np.ndarray, Notes Inertia matrix in the first Airplane 's body axes about its CG (kg m^2) The array itself is set read-only
FreeFlightUnsteadyProblem has I_BP1_CgP1
Holds
Attribute mass, Type float, Notes Mass of the first Airplane (kg)
FreeFlightUnsteadyProblem has mass
Holds
Attribute k_max, Type int, Notes Maximum strongly coupled sub-iterations per free-flight time step (a capped step is accepted with a warning)
FreeFlightUnsteadyProblem has k_max
Holds
The rigid body dynamics engine lives in the private _mujoco_model slot (a MuJoCoModel).
FreeFlightUnsteadyProblem has _mujoco_model
Holds
Property movement, Depends On _movement, Notes Overrides the inherited property, casting the inherited _movement slot to FreeFlightMovement (recomputed, uncached)
FreeFlightUnsteadyProblem has movement
Holds
Attribute _external_loads_validated, Type bool, Notes Once-only guard Flips to True after the external_loads_fn return is validated on its first invocation
FreeFlightUnsteadyProblem has a _external_loads_validated field
Holds
Movement extends CoreMovement.
Movement extends CoreMovement
Holds_movements → _core.py
Movement adds cycle/chord counting, wake sizing parameters, and batch pre-generation of Airplanes and OperatingPoints.
2 rules from this sentence
Movement depends on Airplane
Holds_movements → _geometry
Movement depends on OperatingPoint
Holds_movements → _operating_point.py
FreeFlightMovement and AeroelasticMovement extend CoreMovement directly, as feature-specific siblings of Movement.
2 rules from this sentence
FreeFlightMovement extends CoreMovement
Holds_movements → _core.py
AeroelasticMovement extends CoreMovement
Holds_movements → _core.py
FreeFlightMovement pre-generates only Airplanes (the solver produces OperatingPoints from the rigid body dynamics), while AeroelasticMovement pre-generates only OperatingPoints (deformed Airplane geometry depends on the solver's structural response).
2 rules from this sentence
FreeFlightMovement depends on Airplane
checks “FreeFlightMovement pre-generates only Airplanes”
Holds_movements → _geometry
AeroelasticMovement depends on OperatingPoint
checks “AeroelasticMovement pre-generates only OperatingPoints”
Holds_movements → _operating_point.py
Attribute prescribed_num_steps, Type int, Defined On FreeFlightMovement, Notes Prescribed-flight time steps before the free-flight phase
FreeFlightMovement has prescribed_num_steps
Holds
Attribute free_num_steps, Type int, Defined On FreeFlightMovement, Notes Free-flight time steps after the prescribed phase
FreeFlightMovement has free_num_steps
Holds
Attribute _airplanes, Type tuple[tuple[Airplane, ...], ...], Defined On FreeFlightMovement, Notes Pre-generated prescribed Airplane geometry, indexed airplane_movement
FreeFlightMovement has _airplanes
Holds
Attribute _operating_points, Type tuple[OperatingPoint, ...], Defined On AeroelasticMovement, Notes Pre-generated prescribed OperatingPoint s
AeroelasticMovement has _operating_points
Holds
AirplaneMovement extends CoreAirplaneMovement.
AirplaneMovement extends CoreAirplaneMovement
Holds_movements → _core.py
AirplaneMovement has empty __slots__ and only narrows the wing_movements type to require WingMovement children.
3 rules from this sentence
AirplaneMovement depends on WingMovement
Holds
AirplaneMovement has __slots__
checks “AirplaneMovement has empty __slots__”
Holds
AirplaneMovement has wing_movements
Holds
WingMovement extends CoreWingMovement.
WingMovement extends CoreWingMovement
Holds_movements → _core.py
WingMovement has empty __slots__ and only narrows the wing_cross_section_movements type to require WingCrossSectionMovement children.
WingMovement has __slots__
Holds
AeroelasticWingMovement extends CoreWingMovement directly, as a feature-specific sibling of WingMovement.
AeroelasticWingMovement extends CoreWingMovement
Holds_movements → _core.py
Attribute spacingAnglesSecondDerivative_Gs_to_Wn_ixyz, Type tuple[Callable , Notes None, ...]
AeroelasticWingMovement has spacingAnglesSecondDerivative_Gs_to_Wn_ixyz
Attribute Ler_Gs_Cgs, Type np.ndarray, Notes Leading edge root position
Wing has a Ler_Gs_Cgs field
Holds
Attribute angles_Gs_to_Wn_ixyz, Type np.ndarray, Notes Rotation angles
Wing has an angles_Gs_to_Wn_ixyz field
Holds
Attribute num_chordwise_panels, Type int, Notes Chordwise panel count
Wing has a num_chordwise_panels field
Holds
Attribute chordwise_spacing, Type str, Notes "cosine" or "uniform"
Wing has a chordwise_spacing field
Holds
Attribute spanwise_mesh, Type str, Notes "trapezoidal" , "exploded" , or "edge_defined" , set by provenance during construction rather than as a constructor parameter
Wing has a spanwise_mesh field
Holds
Attribute leadingEdgePoints_Wn_Ler, Type np.ndarray , Notes None
Wing has a leadingEdgePoints_Wn_Ler field
Holds
Attribute trailingEdgePoints_Wn_Ler, Type np.ndarray , Notes None
Wing has a trailingEdgePoints_Wn_Ler field
Holds
Attribute tip_trim_fraction, Type float , Notes None
Wing has a tip_trim_fraction field
Holds
Property T_pas_G_Cg_to_Wn_Ler, Depends On Immutable attrs, Notes Transformation matrix
Wing has T_pas_G_Cg_to_Wn_Ler
Holds
Property T_pas_Wn_Ler_to_G_Cg, Depends On Above, Notes Inverse transformation
Property standard_mean_chord, Depends On projected_area , span, Notes Standard mean chord
Wing has standard_mean_chord
Holds
Property mean_aerodynamic_chord, Depends On projected_area , symmetry_type, Notes MAC
Wing has mean_aerodynamic_chord
Holds
Its value is the total area of the Wing's Panels, which lie on the mean camber surface, so it is not the Wing's wetted area.
Wing depends on Panel
Holds_geometry → _panel.py
Attribute symmetric, Type bool, Notes Modified to False for type 5
Wing has a symmetric field
Holds
Attribute mirror_only, Type bool, Notes Modified to False for type 5
Wing has a mirror_only field
Holds
Attribute symmetryNormal_G, Type np.ndarray , Notes None
Wing has a symmetryNormal_G field
Holds
Attribute symmetryPoint_G_Cg, Type np.ndarray , Notes None
Wing has a symmetryPoint_G_Cg field
Holds
These are modified by Airplane._process_wing_symmetry() when type 5 symmetry is detected. The original Wing becomes a type 1 wing and a new reflected Wing is created with type 3 symmetry.
Airplane depends on Wing
Holds
Attribute gridWrvp_GP1_CgP1, Type np.ndarray , Notes None
Wing has a gridWrvp_GP1_CgP1 field
Holds
The from_edge_points classmethod is the third source of the spanwise_mesh marker.
Wing has from_edge_points
Holds
Attribute airfoil, Type Airfoil, Notes Wing cross section airfoil
2 rules from this sentence
WingCrossSection depends on Airfoil
Holds
WingCrossSection has an airfoil field
Holds
Attribute num_spanwise_panels, Type int , Notes None
WingCrossSection has a num_spanwise_panels field
Holds
Attribute chord, Type float, Notes Chord length
WingCrossSection has a chord field
Holds
Attribute Lp_Wcsp_Lpp, Type np.ndarray, Notes Position in parent axes
WingCrossSection has a Lp_Wcsp_Lpp field
Holds
Attribute angles_Wcsp_to_Wcs_ixyz, Type np.ndarray, Notes Rotation angles
WingCrossSection has an angles_Wcsp_to_Wcs_ixyz field
Holds
Attribute control_surface_hinge_point, Type float, Notes Hinge location (0-1)
WingCrossSection has a control_surface_hinge_point field
Holds
Attribute control_surface_deflection, Type float, Notes Deflection in degrees
WingCrossSection has a control_surface_deflection field
Holds
Attribute spanwise_spacing, Type str , Notes None
WingCrossSection has a spanwise_spacing field
Holds
Property T_pas_Wcsp_Lpp_to_Wcs_Lp, Depends On Lp_Wcsp_Lpp , angles_, Notes Transformation matrix
WingCrossSection has T_pas_Wcsp_Lpp_to_Wcs_Lp
Holds
Property T_pas_Wcs_Lp_to_Wcsp_Lpp, Depends On Above, Notes Inverse transformation
WingCrossSection has T_pas_Wcs_Lp_to_Wcsp_Lpp
Holds
Attribute _validated, Type bool, Set By Wing.init , via _mark_validated, Notes Internal validation flag
WingCrossSection has a _validated field
Holds
Attribute symmetry_type, Type int , Set By None, Notes Wing._generate_mesh , via _set_symmetry_type
WingCrossSection has a symmetry_type field
Holds
Attribute control_surface_symmetry_type, Type str , Notes None
WingCrossSection has a control_surface_symmetry_type field
Holds
Attribute name, Type str, Notes Airfoil identifier
Airfoil has a name field
Holds
Attribute outline_A_Lp, Type np.ndarray, Notes Outline coordinates
Airfoil has an outline_A_Lp field
Holds
Attribute resample, Type bool, Notes Resampling flag
Airfoil has a resample field
Holds
Attribute n_points_per_side, Type int, Notes Points per side for resampling
Airfoil has a n_points_per_side field
Holds
Attribute mcl_A_Lp, Type np.ndarray, Notes Mean camber line coordinates
Airfoil has a mcl_A_Lp field
Holds
outline_A_lp and mcl_A_lp are deprecated read-only aliases for outline_A_Lp and mcl_A_Lp, and the constructor accepts a deprecated outline_A_lp alias for its outline_A_Lp parameter.
2 rules from this sentence
Airfoil has outline_A_lp
Holds
Airfoil has mcl_A_lp
Holds
Attribute Frpp_G_Cg, Type np.ndarray, Notes Front right corner (geometry axes)
Panel has a Frpp_G_Cg field
Holds
Attribute Flpp_G_Cg, Type np.ndarray, Notes Front left corner (geometry axes)
Panel has a Flpp_G_Cg field
Holds
Attribute Blpp_G_Cg, Type np.ndarray, Notes Back left corner (geometry axes)
Panel has a Blpp_G_Cg field
Holds
Attribute Brpp_G_Cg, Type np.ndarray, Notes Back right corner (geometry axes)
Panel has a Brpp_G_Cg field
Holds
Attribute is_leading_edge, Type bool, Notes Edge flag
Panel has an is_leading_edge field
Holds
Attribute is_trailing_edge, Type bool, Notes Edge flag
Panel has an is_trailing_edge field
Holds
Property rightLeg_G, Depends On Frpp_G_Cg , Brpp_G_Cg, Notes Right leg vector
Panel has rightLeg_G
Holds
Property frontLeg_G, Depends On Flpp_G_Cg , Frpp_G_Cg, Notes Front leg vector
Panel has frontLeg_G
Holds
Property leftLeg_G, Depends On Blpp_G_Cg , Flpp_G_Cg, Notes Left leg vector
Panel has leftLeg_G
Holds
Property backLeg_G, Depends On Brpp_G_Cg , Blpp_G_Cg, Notes Back leg vector
Panel has backLeg_G
Holds
Property Frbvp_G_Cg, Depends On Brpp_G_Cg , rightLeg_G, Notes Front right bound vortex point
Panel has Frbvp_G_Cg
Holds
Property Flbvp_G_Cg, Depends On Flpp_G_Cg , leftLeg_G, Notes Front left bound vortex point
Panel has Flbvp_G_Cg
Holds
Property Cpp_G_Cg, Depends On Multiple corners, Notes Collocation point
Panel has Cpp_G_Cg
Holds
Property unitNormal_G, Depends On All corners, Notes Unit normal vector
Panel has unitNormal_G
Holds
Property area, Depends On All corners, Notes Panel area
Panel has area
Holds
Property aspect_ratio, Depends On All legs, Notes Aspect ratio
Panel has aspect_ratio
Holds
Attribute xml_str, Type str, Notes Generated MuJoCo XML
MuJoCoModel has xml_str
Holds
Attribute model, Type mujoco.MjModel, Notes Compiled MuJoCo model Its backing slot is rebuilt by rebuild_engine on deserialization
MuJoCoModel has model
Holds
Attribute body_id, Type int, Notes MuJoCo body ID for the Airplane
MuJoCoModel has body_id
Holds
Attribute initial_key_frame_id, Type int, Notes MuJoCo key frame ID for initial conditions
MuJoCoModel has initial_key_frame_id
Holds
Attribute initial_qpos, Type np.ndarray, Notes Initial generalized positions (computed during init)
MuJoCoModel has initial_qpos
Holds
Attribute initial_qvel, Type np.ndarray, Notes Initial generalized velocities (computed during init)
MuJoCoModel has initial_qvel
Holds
Attribute mujoco_assets, Type dict[str, bytes] , Notes None
MuJoCoModel has mujoco_assets
Holds
Attribute data, Type mujoco.MjData, Notes Plain slot Mutated by apply_loads , step , reset , restore_state , mj_forward , and rebuild_engine
MuJoCoModel has a data field
Holds
mujoco_assets, by contrast, is retained in the _mujoco_assets slot after being passed to MuJoCo's from_xml_string: an asset-based model cannot be rebuilt from xml_str alone, so the slot is serialized alongside the XML string (with the asset bytes encoded as base64) and rebuild_engine passes the restored dict back to MuJoCo, which keeps saved files self-contained and load off the filesystem.
MuJoCoModel has _mujoco_assets
Holds
When multiple public classes share the same private parent (e.g., Movement, FreeFlightMovement, and AeroelasticMovement all extending CoreMovement), each sibling maintains its own self-contained docstring.
3 rules from this sentence
Movement extends CoreMovement
Holds_movements → _core.py
FreeFlightMovement extends CoreMovement
Holds_movements → _core.py
AeroelasticMovement extends CoreMovement
Holds_movements → _core.py
For a construction path that must skip the constructor's validation, allocate with object.__new__(Cls) and set the slots directly inside the class's own module, as Airfoil.__deepcopy__ and Airfoil._add_control_surface do.