sysmlpy 0.85.0__tar.gz → 0.86.0__tar.gz
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.
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/PKG-INFO +1 -1
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/pyproject.toml +1 -1
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/__init__.py +1 -1
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/store.py +213 -2
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/LICENSE +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/README.md +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/__main__.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/README.md +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr_parser.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr_visitor.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/boxes_view.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/definition.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/dfa_cache.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/diff.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/evaluator.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/examples/attribute_values.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/examples/part_attributes.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/formatting.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/classes.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/interchange.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/LICENSE +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/README.md +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/__init__.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/States.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/__init__.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/__main__.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/protocol.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/server.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/stdio.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/navigate.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/plantuml.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/project.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/semantic.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/sim.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/spreadsheet.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/traceability.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/us_customary_units.txt +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/usage.py +0 -0
- {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/validator.py +0 -0
|
@@ -34,7 +34,7 @@ __all__ = [
|
|
|
34
34
|
"render_state_transition_view_svg", "boxes_view",
|
|
35
35
|
]
|
|
36
36
|
__author__ = "Jon Fox"
|
|
37
|
-
__version__ = "0.
|
|
37
|
+
__version__ = "0.86.0"
|
|
38
38
|
|
|
39
39
|
from sysmlpy.usage import (
|
|
40
40
|
Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
|
|
@@ -980,6 +980,74 @@ class NetworkXStore(Store):
|
|
|
980
980
|
seen.discard(element_id)
|
|
981
981
|
return seen
|
|
982
982
|
|
|
983
|
+
def siblings(self, element_id: str) -> list[str]:
|
|
984
|
+
"""Elements sharing a structural parent with *element_id*.
|
|
985
|
+
|
|
986
|
+
Mirrors :meth:`KuzuStore.siblings` / :meth:`CayleyStore.siblings`
|
|
987
|
+
(parent-child edges only); deterministic parent-then-child
|
|
988
|
+
order, self excluded.
|
|
989
|
+
"""
|
|
990
|
+
result: list[str] = []
|
|
991
|
+
for parent in self.parents(element_id):
|
|
992
|
+
for sib in self.children(parent):
|
|
993
|
+
if sib != element_id and sib not in result:
|
|
994
|
+
result.append(sib)
|
|
995
|
+
return result
|
|
996
|
+
|
|
997
|
+
def hub_elements(self, min_degree: int = 3,
|
|
998
|
+
direction: str = "outgoing") -> list[tuple[str, int]]:
|
|
999
|
+
"""Elements with high relationship degree.
|
|
1000
|
+
|
|
1001
|
+
Mirrors :meth:`KuzuStore.hub_elements` — *(element_id, degree)*
|
|
1002
|
+
pairs with degree ≥ *min_degree*, sorted by degree descending
|
|
1003
|
+
(id ascending on ties). *direction* selects which edge
|
|
1004
|
+
direction to count.
|
|
1005
|
+
"""
|
|
1006
|
+
dirn = {"outgoing": "out", "incoming": "in", "both": "both"}.get(direction)
|
|
1007
|
+
if dirn is None:
|
|
1008
|
+
raise ValueError(
|
|
1009
|
+
f"direction must be 'outgoing', 'incoming' or 'both', "
|
|
1010
|
+
f"got {direction!r}")
|
|
1011
|
+
counts: list[tuple[str, int]] = []
|
|
1012
|
+
for eid in self.ids():
|
|
1013
|
+
degree = len(self.relationships(eid, direction=dirn))
|
|
1014
|
+
if degree >= min_degree:
|
|
1015
|
+
counts.append((eid, degree))
|
|
1016
|
+
counts.sort(key=lambda kv: (-kv[1], kv[0]))
|
|
1017
|
+
return counts
|
|
1018
|
+
|
|
1019
|
+
def shortest_path_between_named(self, source_name: str, target_name: str,
|
|
1020
|
+
max_hops: int = 10) -> Optional[list[str]]:
|
|
1021
|
+
"""Shortest structural path between two *named* elements.
|
|
1022
|
+
|
|
1023
|
+
Mirrors :meth:`CayleyStore.shortest_path_between_named` —
|
|
1024
|
+
multi-source BFS over all relationship types, one hop-level at
|
|
1025
|
+
a time up to *max_hops*; returns the ID path or ``None`` when
|
|
1026
|
+
disconnected. When several elements share a name, the first
|
|
1027
|
+
path reaching any target wins.
|
|
1028
|
+
"""
|
|
1029
|
+
sources = self.query(name=source_name)
|
|
1030
|
+
targets = set(self.query(name=target_name))
|
|
1031
|
+
if not sources or not targets:
|
|
1032
|
+
return None
|
|
1033
|
+
frontier = {sid: [sid] for sid in sources}
|
|
1034
|
+
visited = set(sources)
|
|
1035
|
+
for _ in range(max_hops):
|
|
1036
|
+
nxt_frontier = {}
|
|
1037
|
+
for node, path in frontier.items():
|
|
1038
|
+
for other, _rt, _d in self.relationships(node, direction="out"):
|
|
1039
|
+
if other in visited:
|
|
1040
|
+
continue
|
|
1041
|
+
new_path = path + [other]
|
|
1042
|
+
if other in targets:
|
|
1043
|
+
return new_path
|
|
1044
|
+
visited.add(other)
|
|
1045
|
+
nxt_frontier[other] = new_path
|
|
1046
|
+
if not nxt_frontier:
|
|
1047
|
+
break
|
|
1048
|
+
frontier = nxt_frontier
|
|
1049
|
+
return None
|
|
1050
|
+
|
|
983
1051
|
|
|
984
1052
|
# ── Kuzu Store ──────────────────────────────────────────────────────────────
|
|
985
1053
|
|
|
@@ -1658,15 +1726,158 @@ class KuzuStore(Store):
|
|
|
1658
1726
|
pattern = "MATCH (hub:Element)-[r:Relationship]->() WITH hub, count(r) AS deg"
|
|
1659
1727
|
elif direction == "incoming":
|
|
1660
1728
|
pattern = "MATCH ()-[r:Relationship]->(hub:Element) WITH hub, count(r) AS deg"
|
|
1661
|
-
|
|
1729
|
+
elif direction == "both":
|
|
1662
1730
|
pattern = (
|
|
1663
1731
|
"MATCH (hub:Element)-[r:Relationship]-() WITH hub, count(r) AS deg"
|
|
1664
1732
|
)
|
|
1733
|
+
else:
|
|
1734
|
+
raise ValueError(
|
|
1735
|
+
f"direction must be 'outgoing', 'incoming' or 'both', "
|
|
1736
|
+
f"got {direction!r}")
|
|
1665
1737
|
rows = self.execute_cypher(
|
|
1666
1738
|
f'{pattern} WHERE deg >= {min_degree} '
|
|
1667
1739
|
f'RETURN hub.id AS element_id, deg ORDER BY deg DESC'
|
|
1668
1740
|
)
|
|
1669
|
-
|
|
1741
|
+
# deterministic tie-break (degree desc, then id asc) so all
|
|
1742
|
+
# three backends agree when degrees are equal
|
|
1743
|
+
out = [(r["element_id"], r["deg"]) for r in rows]
|
|
1744
|
+
out.sort(key=lambda kv: (-kv[1], kv[0]))
|
|
1745
|
+
return out
|
|
1746
|
+
|
|
1747
|
+
# -- graph analytics (client-side; NetworkX/Cayley parity) ----------
|
|
1748
|
+
|
|
1749
|
+
def all_paths(self, source_id: str, target_id: str,
|
|
1750
|
+
rel_type: Optional[str] = None,
|
|
1751
|
+
max_paths: int = 20) -> list[list[str]]:
|
|
1752
|
+
"""Find up to *max_paths* simple paths between two elements.
|
|
1753
|
+
|
|
1754
|
+
Mirrors :meth:`NetworkXStore.all_paths` /
|
|
1755
|
+
:meth:`CayleyStore.all_paths`. Depth-first enumeration over the
|
|
1756
|
+
relationship edge list (any type when *rel_type* is None);
|
|
1757
|
+
client-side because Kùzu has no simple-path enumeration.
|
|
1758
|
+
"""
|
|
1759
|
+
if not self.has(source_id) or not self.has(target_id):
|
|
1760
|
+
return []
|
|
1761
|
+
results: list[list[str]] = []
|
|
1762
|
+
|
|
1763
|
+
def _dfs(node: str, path: list[str]) -> None:
|
|
1764
|
+
if len(results) >= max_paths:
|
|
1765
|
+
return
|
|
1766
|
+
if node == target_id:
|
|
1767
|
+
results.append(list(path))
|
|
1768
|
+
return
|
|
1769
|
+
for nxt, _rt, _d in self.relationships(
|
|
1770
|
+
node, rel_type=rel_type, direction="out"):
|
|
1771
|
+
if nxt in path: # simple paths only
|
|
1772
|
+
continue
|
|
1773
|
+
path.append(nxt)
|
|
1774
|
+
_dfs(nxt, path)
|
|
1775
|
+
path.pop()
|
|
1776
|
+
|
|
1777
|
+
_dfs(source_id, [source_id])
|
|
1778
|
+
return results
|
|
1779
|
+
|
|
1780
|
+
def in_degree_centrality(self, rel_type: Optional[str] = None) -> dict[str, float]:
|
|
1781
|
+
"""In-degree fraction per element (how many elements reference *me*).
|
|
1782
|
+
|
|
1783
|
+
Mirrors :meth:`NetworkXStore.in_degree_centrality` (degree
|
|
1784
|
+
divided by ``n - 1``).
|
|
1785
|
+
"""
|
|
1786
|
+
n = len(self)
|
|
1787
|
+
if n <= 1:
|
|
1788
|
+
return {eid: 0.0 for eid in self.ids()}
|
|
1789
|
+
denom = n - 1
|
|
1790
|
+
return {
|
|
1791
|
+
eid: len(self.relationships(eid, rel_type=rel_type,
|
|
1792
|
+
direction="in")) / denom
|
|
1793
|
+
for eid in self.ids()
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
def out_degree_centrality(self, rel_type: Optional[str] = None) -> dict[str, float]:
|
|
1797
|
+
"""Out-degree fraction per element (how many elements *I* reference)."""
|
|
1798
|
+
n = len(self)
|
|
1799
|
+
if n <= 1:
|
|
1800
|
+
return {eid: 0.0 for eid in self.ids()}
|
|
1801
|
+
denom = n - 1
|
|
1802
|
+
return {
|
|
1803
|
+
eid: len(self.relationships(eid, rel_type=rel_type,
|
|
1804
|
+
direction="out")) / denom
|
|
1805
|
+
for eid in self.ids()
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1808
|
+
def descendants_depth_limited(self, root_id: str, max_depth: int = 3,
|
|
1809
|
+
rel_type: str = REL_PARENT_CHILD) -> list[str]:
|
|
1810
|
+
"""Descendants within *max_depth* levels of *root_id*.
|
|
1811
|
+
|
|
1812
|
+
Mirrors :meth:`NetworkXStore.descendants_depth_limited` —
|
|
1813
|
+
breadth-first, each level sorted for deterministic output.
|
|
1814
|
+
"""
|
|
1815
|
+
if not self.has(root_id):
|
|
1816
|
+
return []
|
|
1817
|
+
result: list[str] = []
|
|
1818
|
+
frontier = {root_id}
|
|
1819
|
+
visited = {root_id}
|
|
1820
|
+
for _ in range(max_depth):
|
|
1821
|
+
nxt: set[str] = set()
|
|
1822
|
+
for node in frontier:
|
|
1823
|
+
for child in self.children(node, rel_type):
|
|
1824
|
+
if child not in visited:
|
|
1825
|
+
nxt.add(child)
|
|
1826
|
+
visited |= nxt
|
|
1827
|
+
result.extend(sorted(nxt))
|
|
1828
|
+
frontier = nxt
|
|
1829
|
+
if not frontier:
|
|
1830
|
+
break
|
|
1831
|
+
return result
|
|
1832
|
+
|
|
1833
|
+
def neighborhood(self, element_id: str, radius: int = 2,
|
|
1834
|
+
rel_type: Optional[str] = None) -> set[str]:
|
|
1835
|
+
"""Ego-neighborhood of *element_id* within *radius* hops.
|
|
1836
|
+
|
|
1837
|
+
Follows edges in both directions (like NetworkX's undirected
|
|
1838
|
+
ego graph); includes the element itself.
|
|
1839
|
+
"""
|
|
1840
|
+
if not self.has(element_id):
|
|
1841
|
+
return set()
|
|
1842
|
+
seen = {element_id}
|
|
1843
|
+
frontier = {element_id}
|
|
1844
|
+
for _ in range(radius):
|
|
1845
|
+
nxt: set[str] = set()
|
|
1846
|
+
for node in frontier:
|
|
1847
|
+
for other, _rt, _d in self.relationships(
|
|
1848
|
+
node, rel_type=rel_type, direction="both"):
|
|
1849
|
+
if other not in seen:
|
|
1850
|
+
nxt.add(other)
|
|
1851
|
+
seen |= nxt
|
|
1852
|
+
frontier = nxt
|
|
1853
|
+
if not frontier:
|
|
1854
|
+
break
|
|
1855
|
+
return seen
|
|
1856
|
+
|
|
1857
|
+
def impact_analysis(self, element_id: str,
|
|
1858
|
+
rel_types: Optional[list[str]] = None,
|
|
1859
|
+
direction: str = "downstream") -> set[str]:
|
|
1860
|
+
"""Elements transitively affected by changes to *element_id*.
|
|
1861
|
+
|
|
1862
|
+
Mirrors :meth:`NetworkXStore.impact_analysis` — *downstream*
|
|
1863
|
+
follows outgoing edges (what I affect), *upstream* follows
|
|
1864
|
+
incoming edges (what affects me).
|
|
1865
|
+
"""
|
|
1866
|
+
if not self.has(element_id):
|
|
1867
|
+
return set()
|
|
1868
|
+
dirn = "out" if direction == "downstream" else "in"
|
|
1869
|
+
seen = {element_id}
|
|
1870
|
+
frontier = [element_id]
|
|
1871
|
+
while frontier:
|
|
1872
|
+
current = frontier.pop()
|
|
1873
|
+
for other, rt, _d in self.relationships(current, direction=dirn):
|
|
1874
|
+
if rel_types and rt not in rel_types:
|
|
1875
|
+
continue
|
|
1876
|
+
if other not in seen:
|
|
1877
|
+
seen.add(other)
|
|
1878
|
+
frontier.append(other)
|
|
1879
|
+
seen.discard(element_id)
|
|
1880
|
+
return seen
|
|
1670
1881
|
|
|
1671
1882
|
|
|
1672
1883
|
# ── Cayley Store ──────────────────────────────────────────────────────────────
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp
RENAMED
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py
RENAMED
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml
RENAMED
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml
RENAMED
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml
RENAMED
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml
RENAMED
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml
RENAMED
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|