diff --git a/.gitea/workflows/ci.yaml b/GNN/.gitea/workflows/ci.yaml similarity index 100% rename from .gitea/workflows/ci.yaml rename to GNN/.gitea/workflows/ci.yaml diff --git a/.github/workflows/build.yml b/GNN/.github/workflows/build.yml similarity index 100% rename from .github/workflows/build.yml rename to GNN/.github/workflows/build.yml diff --git a/.github/workflows/push-freecad.yml b/GNN/.github/workflows/push-freecad.yml similarity index 100% rename from .github/workflows/push-freecad.yml rename to GNN/.github/workflows/push-freecad.yml diff --git a/.pre-commit-config.yaml b/GNN/.pre-commit-config.yaml similarity index 100% rename from .pre-commit-config.yaml rename to GNN/.pre-commit-config.yaml diff --git a/CMakeLists.txt b/GNN/CMakeLists.txt similarity index 100% rename from CMakeLists.txt rename to GNN/CMakeLists.txt diff --git a/CONTRIBUTING.md b/GNN/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to GNN/CONTRIBUTING.md diff --git a/Dockerfile b/GNN/Dockerfile similarity index 100% rename from Dockerfile rename to GNN/Dockerfile diff --git a/Makefile b/GNN/Makefile similarity index 100% rename from Makefile rename to GNN/Makefile diff --git a/OndselSolver.pc.in b/GNN/OndselSolver.pc.in similarity index 100% rename from OndselSolver.pc.in rename to GNN/OndselSolver.pc.in diff --git a/OndselSolver/ASMTAllowRotation.cpp b/GNN/OndselSolver/ASMTAllowRotation.cpp similarity index 100% rename from OndselSolver/ASMTAllowRotation.cpp rename to GNN/OndselSolver/ASMTAllowRotation.cpp diff --git a/OndselSolver/ASMTAllowRotation.h b/GNN/OndselSolver/ASMTAllowRotation.h similarity index 100% rename from OndselSolver/ASMTAllowRotation.h rename to GNN/OndselSolver/ASMTAllowRotation.h diff --git a/OndselSolver/ASMTAngleJoint.cpp b/GNN/OndselSolver/ASMTAngleJoint.cpp similarity index 100% rename from OndselSolver/ASMTAngleJoint.cpp rename to GNN/OndselSolver/ASMTAngleJoint.cpp diff --git a/OndselSolver/ASMTAngleJoint.h b/GNN/OndselSolver/ASMTAngleJoint.h similarity index 100% rename from OndselSolver/ASMTAngleJoint.h rename to GNN/OndselSolver/ASMTAngleJoint.h diff --git a/OndselSolver/ASMTAnimationParameters.cpp b/GNN/OndselSolver/ASMTAnimationParameters.cpp similarity index 100% rename from OndselSolver/ASMTAnimationParameters.cpp rename to GNN/OndselSolver/ASMTAnimationParameters.cpp diff --git a/OndselSolver/ASMTAnimationParameters.h b/GNN/OndselSolver/ASMTAnimationParameters.h similarity index 100% rename from OndselSolver/ASMTAnimationParameters.h rename to GNN/OndselSolver/ASMTAnimationParameters.h diff --git a/OndselSolver/ASMTAssembly.cpp b/GNN/OndselSolver/ASMTAssembly.cpp similarity index 100% rename from OndselSolver/ASMTAssembly.cpp rename to GNN/OndselSolver/ASMTAssembly.cpp diff --git a/OndselSolver/ASMTAssembly.h b/GNN/OndselSolver/ASMTAssembly.h similarity index 100% rename from OndselSolver/ASMTAssembly.h rename to GNN/OndselSolver/ASMTAssembly.h diff --git a/OndselSolver/ASMTAtPointJoint.cpp b/GNN/OndselSolver/ASMTAtPointJoint.cpp similarity index 100% rename from OndselSolver/ASMTAtPointJoint.cpp rename to GNN/OndselSolver/ASMTAtPointJoint.cpp diff --git a/OndselSolver/ASMTAtPointJoint.h b/GNN/OndselSolver/ASMTAtPointJoint.h similarity index 100% rename from OndselSolver/ASMTAtPointJoint.h rename to GNN/OndselSolver/ASMTAtPointJoint.h diff --git a/OndselSolver/ASMTCompoundJoint.cpp b/GNN/OndselSolver/ASMTCompoundJoint.cpp similarity index 100% rename from OndselSolver/ASMTCompoundJoint.cpp rename to GNN/OndselSolver/ASMTCompoundJoint.cpp diff --git a/OndselSolver/ASMTCompoundJoint.h b/GNN/OndselSolver/ASMTCompoundJoint.h similarity index 100% rename from OndselSolver/ASMTCompoundJoint.h rename to GNN/OndselSolver/ASMTCompoundJoint.h diff --git a/OndselSolver/ASMTConeConeContact.cpp b/GNN/OndselSolver/ASMTConeConeContact.cpp similarity index 100% rename from OndselSolver/ASMTConeConeContact.cpp rename to GNN/OndselSolver/ASMTConeConeContact.cpp diff --git a/OndselSolver/ASMTConeConeContact.h b/GNN/OndselSolver/ASMTConeConeContact.h similarity index 100% rename from OndselSolver/ASMTConeConeContact.h rename to GNN/OndselSolver/ASMTConeConeContact.h diff --git a/OndselSolver/ASMTConstantGravity.cpp b/GNN/OndselSolver/ASMTConstantGravity.cpp similarity index 100% rename from OndselSolver/ASMTConstantGravity.cpp rename to GNN/OndselSolver/ASMTConstantGravity.cpp diff --git a/OndselSolver/ASMTConstantGravity.h b/GNN/OndselSolver/ASMTConstantGravity.h similarity index 100% rename from OndselSolver/ASMTConstantGravity.h rename to GNN/OndselSolver/ASMTConstantGravity.h diff --git a/OndselSolver/ASMTConstantVelocityJoint.cpp b/GNN/OndselSolver/ASMTConstantVelocityJoint.cpp similarity index 100% rename from OndselSolver/ASMTConstantVelocityJoint.cpp rename to GNN/OndselSolver/ASMTConstantVelocityJoint.cpp diff --git a/OndselSolver/ASMTConstantVelocityJoint.h b/GNN/OndselSolver/ASMTConstantVelocityJoint.h similarity index 100% rename from OndselSolver/ASMTConstantVelocityJoint.h rename to GNN/OndselSolver/ASMTConstantVelocityJoint.h diff --git a/OndselSolver/ASMTConstraintSet.cpp b/GNN/OndselSolver/ASMTConstraintSet.cpp similarity index 100% rename from OndselSolver/ASMTConstraintSet.cpp rename to GNN/OndselSolver/ASMTConstraintSet.cpp diff --git a/OndselSolver/ASMTConstraintSet.h b/GNN/OndselSolver/ASMTConstraintSet.h similarity index 100% rename from OndselSolver/ASMTConstraintSet.h rename to GNN/OndselSolver/ASMTConstraintSet.h diff --git a/OndselSolver/ASMTContact.cpp b/GNN/OndselSolver/ASMTContact.cpp similarity index 100% rename from OndselSolver/ASMTContact.cpp rename to GNN/OndselSolver/ASMTContact.cpp diff --git a/OndselSolver/ASMTContact.h b/GNN/OndselSolver/ASMTContact.h similarity index 100% rename from OndselSolver/ASMTContact.h rename to GNN/OndselSolver/ASMTContact.h diff --git a/OndselSolver/ASMTCylConeContact.cpp b/GNN/OndselSolver/ASMTCylConeContact.cpp similarity index 100% rename from OndselSolver/ASMTCylConeContact.cpp rename to GNN/OndselSolver/ASMTCylConeContact.cpp diff --git a/OndselSolver/ASMTCylConeContact.h b/GNN/OndselSolver/ASMTCylConeContact.h similarity index 100% rename from OndselSolver/ASMTCylConeContact.h rename to GNN/OndselSolver/ASMTCylConeContact.h diff --git a/OndselSolver/ASMTCylCylContact.cpp b/GNN/OndselSolver/ASMTCylCylContact.cpp similarity index 100% rename from OndselSolver/ASMTCylCylContact.cpp rename to GNN/OndselSolver/ASMTCylCylContact.cpp diff --git a/OndselSolver/ASMTCylCylContact.h b/GNN/OndselSolver/ASMTCylCylContact.h similarity index 100% rename from OndselSolver/ASMTCylCylContact.h rename to GNN/OndselSolver/ASMTCylCylContact.h diff --git a/OndselSolver/ASMTCylSphJoint.cpp b/GNN/OndselSolver/ASMTCylSphJoint.cpp similarity index 100% rename from OndselSolver/ASMTCylSphJoint.cpp rename to GNN/OndselSolver/ASMTCylSphJoint.cpp diff --git a/OndselSolver/ASMTCylSphJoint.h b/GNN/OndselSolver/ASMTCylSphJoint.h similarity index 100% rename from OndselSolver/ASMTCylSphJoint.h rename to GNN/OndselSolver/ASMTCylSphJoint.h diff --git a/OndselSolver/ASMTCylindricalJoint.cpp b/GNN/OndselSolver/ASMTCylindricalJoint.cpp similarity index 100% rename from OndselSolver/ASMTCylindricalJoint.cpp rename to GNN/OndselSolver/ASMTCylindricalJoint.cpp diff --git a/OndselSolver/ASMTCylindricalJoint.h b/GNN/OndselSolver/ASMTCylindricalJoint.h similarity index 100% rename from OndselSolver/ASMTCylindricalJoint.h rename to GNN/OndselSolver/ASMTCylindricalJoint.h diff --git a/OndselSolver/ASMTExtrusion.cpp b/GNN/OndselSolver/ASMTExtrusion.cpp similarity index 100% rename from OndselSolver/ASMTExtrusion.cpp rename to GNN/OndselSolver/ASMTExtrusion.cpp diff --git a/OndselSolver/ASMTExtrusion.h b/GNN/OndselSolver/ASMTExtrusion.h similarity index 100% rename from OndselSolver/ASMTExtrusion.h rename to GNN/OndselSolver/ASMTExtrusion.h diff --git a/OndselSolver/ASMTFixedJoint.cpp b/GNN/OndselSolver/ASMTFixedJoint.cpp similarity index 100% rename from OndselSolver/ASMTFixedJoint.cpp rename to GNN/OndselSolver/ASMTFixedJoint.cpp diff --git a/OndselSolver/ASMTFixedJoint.h b/GNN/OndselSolver/ASMTFixedJoint.h similarity index 100% rename from OndselSolver/ASMTFixedJoint.h rename to GNN/OndselSolver/ASMTFixedJoint.h diff --git a/OndselSolver/ASMTForceTorque.cpp b/GNN/OndselSolver/ASMTForceTorque.cpp similarity index 100% rename from OndselSolver/ASMTForceTorque.cpp rename to GNN/OndselSolver/ASMTForceTorque.cpp diff --git a/OndselSolver/ASMTForceTorque.h b/GNN/OndselSolver/ASMTForceTorque.h similarity index 100% rename from OndselSolver/ASMTForceTorque.h rename to GNN/OndselSolver/ASMTForceTorque.h diff --git a/OndselSolver/ASMTGearJoint.cpp b/GNN/OndselSolver/ASMTGearJoint.cpp similarity index 100% rename from OndselSolver/ASMTGearJoint.cpp rename to GNN/OndselSolver/ASMTGearJoint.cpp diff --git a/OndselSolver/ASMTGearJoint.h b/GNN/OndselSolver/ASMTGearJoint.h similarity index 100% rename from OndselSolver/ASMTGearJoint.h rename to GNN/OndselSolver/ASMTGearJoint.h diff --git a/OndselSolver/ASMTGeneralMotion.cpp b/GNN/OndselSolver/ASMTGeneralMotion.cpp similarity index 100% rename from OndselSolver/ASMTGeneralMotion.cpp rename to GNN/OndselSolver/ASMTGeneralMotion.cpp diff --git a/OndselSolver/ASMTGeneralMotion.h b/GNN/OndselSolver/ASMTGeneralMotion.h similarity index 100% rename from OndselSolver/ASMTGeneralMotion.h rename to GNN/OndselSolver/ASMTGeneralMotion.h diff --git a/OndselSolver/ASMTInLineJoint.cpp b/GNN/OndselSolver/ASMTInLineJoint.cpp similarity index 100% rename from OndselSolver/ASMTInLineJoint.cpp rename to GNN/OndselSolver/ASMTInLineJoint.cpp diff --git a/OndselSolver/ASMTInLineJoint.h b/GNN/OndselSolver/ASMTInLineJoint.h similarity index 100% rename from OndselSolver/ASMTInLineJoint.h rename to GNN/OndselSolver/ASMTInLineJoint.h diff --git a/OndselSolver/ASMTInPlaneJoint.cpp b/GNN/OndselSolver/ASMTInPlaneJoint.cpp similarity index 100% rename from OndselSolver/ASMTInPlaneJoint.cpp rename to GNN/OndselSolver/ASMTInPlaneJoint.cpp diff --git a/OndselSolver/ASMTInPlaneJoint.h b/GNN/OndselSolver/ASMTInPlaneJoint.h similarity index 100% rename from OndselSolver/ASMTInPlaneJoint.h rename to GNN/OndselSolver/ASMTInPlaneJoint.h diff --git a/OndselSolver/ASMTItem.cpp b/GNN/OndselSolver/ASMTItem.cpp similarity index 100% rename from OndselSolver/ASMTItem.cpp rename to GNN/OndselSolver/ASMTItem.cpp diff --git a/OndselSolver/ASMTItem.h b/GNN/OndselSolver/ASMTItem.h similarity index 100% rename from OndselSolver/ASMTItem.h rename to GNN/OndselSolver/ASMTItem.h diff --git a/OndselSolver/ASMTItemIJ.cpp b/GNN/OndselSolver/ASMTItemIJ.cpp similarity index 100% rename from OndselSolver/ASMTItemIJ.cpp rename to GNN/OndselSolver/ASMTItemIJ.cpp diff --git a/OndselSolver/ASMTItemIJ.h b/GNN/OndselSolver/ASMTItemIJ.h similarity index 100% rename from OndselSolver/ASMTItemIJ.h rename to GNN/OndselSolver/ASMTItemIJ.h diff --git a/OndselSolver/ASMTJoint.cpp b/GNN/OndselSolver/ASMTJoint.cpp similarity index 100% rename from OndselSolver/ASMTJoint.cpp rename to GNN/OndselSolver/ASMTJoint.cpp diff --git a/OndselSolver/ASMTJoint.h b/GNN/OndselSolver/ASMTJoint.h similarity index 100% rename from OndselSolver/ASMTJoint.h rename to GNN/OndselSolver/ASMTJoint.h diff --git a/OndselSolver/ASMTKinematicIJ.cpp b/GNN/OndselSolver/ASMTKinematicIJ.cpp similarity index 100% rename from OndselSolver/ASMTKinematicIJ.cpp rename to GNN/OndselSolver/ASMTKinematicIJ.cpp diff --git a/OndselSolver/ASMTKinematicIJ.h b/GNN/OndselSolver/ASMTKinematicIJ.h similarity index 100% rename from OndselSolver/ASMTKinematicIJ.h rename to GNN/OndselSolver/ASMTKinematicIJ.h diff --git a/OndselSolver/ASMTLimit.cpp b/GNN/OndselSolver/ASMTLimit.cpp similarity index 100% rename from OndselSolver/ASMTLimit.cpp rename to GNN/OndselSolver/ASMTLimit.cpp diff --git a/OndselSolver/ASMTLimit.h b/GNN/OndselSolver/ASMTLimit.h similarity index 100% rename from OndselSolver/ASMTLimit.h rename to GNN/OndselSolver/ASMTLimit.h diff --git a/OndselSolver/ASMTLineInPlaneJoint.cpp b/GNN/OndselSolver/ASMTLineInPlaneJoint.cpp similarity index 100% rename from OndselSolver/ASMTLineInPlaneJoint.cpp rename to GNN/OndselSolver/ASMTLineInPlaneJoint.cpp diff --git a/OndselSolver/ASMTLineInPlaneJoint.h b/GNN/OndselSolver/ASMTLineInPlaneJoint.h similarity index 100% rename from OndselSolver/ASMTLineInPlaneJoint.h rename to GNN/OndselSolver/ASMTLineInPlaneJoint.h diff --git a/OndselSolver/ASMTMarker.cpp b/GNN/OndselSolver/ASMTMarker.cpp similarity index 100% rename from OndselSolver/ASMTMarker.cpp rename to GNN/OndselSolver/ASMTMarker.cpp diff --git a/OndselSolver/ASMTMarker.h b/GNN/OndselSolver/ASMTMarker.h similarity index 100% rename from OndselSolver/ASMTMarker.h rename to GNN/OndselSolver/ASMTMarker.h diff --git a/OndselSolver/ASMTMotion.cpp b/GNN/OndselSolver/ASMTMotion.cpp similarity index 100% rename from OndselSolver/ASMTMotion.cpp rename to GNN/OndselSolver/ASMTMotion.cpp diff --git a/OndselSolver/ASMTMotion.h b/GNN/OndselSolver/ASMTMotion.h similarity index 100% rename from OndselSolver/ASMTMotion.h rename to GNN/OndselSolver/ASMTMotion.h diff --git a/OndselSolver/ASMTNoRotationJoint.cpp b/GNN/OndselSolver/ASMTNoRotationJoint.cpp similarity index 100% rename from OndselSolver/ASMTNoRotationJoint.cpp rename to GNN/OndselSolver/ASMTNoRotationJoint.cpp diff --git a/OndselSolver/ASMTNoRotationJoint.h b/GNN/OndselSolver/ASMTNoRotationJoint.h similarity index 100% rename from OndselSolver/ASMTNoRotationJoint.h rename to GNN/OndselSolver/ASMTNoRotationJoint.h diff --git a/OndselSolver/ASMTParallelAxesJoint.cpp b/GNN/OndselSolver/ASMTParallelAxesJoint.cpp similarity index 100% rename from OndselSolver/ASMTParallelAxesJoint.cpp rename to GNN/OndselSolver/ASMTParallelAxesJoint.cpp diff --git a/OndselSolver/ASMTParallelAxesJoint.h b/GNN/OndselSolver/ASMTParallelAxesJoint.h similarity index 100% rename from OndselSolver/ASMTParallelAxesJoint.h rename to GNN/OndselSolver/ASMTParallelAxesJoint.h diff --git a/OndselSolver/ASMTPart.cpp b/GNN/OndselSolver/ASMTPart.cpp similarity index 100% rename from OndselSolver/ASMTPart.cpp rename to GNN/OndselSolver/ASMTPart.cpp diff --git a/OndselSolver/ASMTPart.h b/GNN/OndselSolver/ASMTPart.h similarity index 100% rename from OndselSolver/ASMTPart.h rename to GNN/OndselSolver/ASMTPart.h diff --git a/OndselSolver/ASMTPerpendicularJoint.cpp b/GNN/OndselSolver/ASMTPerpendicularJoint.cpp similarity index 100% rename from OndselSolver/ASMTPerpendicularJoint.cpp rename to GNN/OndselSolver/ASMTPerpendicularJoint.cpp diff --git a/OndselSolver/ASMTPerpendicularJoint.h b/GNN/OndselSolver/ASMTPerpendicularJoint.h similarity index 100% rename from OndselSolver/ASMTPerpendicularJoint.h rename to GNN/OndselSolver/ASMTPerpendicularJoint.h diff --git a/OndselSolver/ASMTPlanarJoint.cpp b/GNN/OndselSolver/ASMTPlanarJoint.cpp similarity index 100% rename from OndselSolver/ASMTPlanarJoint.cpp rename to GNN/OndselSolver/ASMTPlanarJoint.cpp diff --git a/OndselSolver/ASMTPlanarJoint.h b/GNN/OndselSolver/ASMTPlanarJoint.h similarity index 100% rename from OndselSolver/ASMTPlanarJoint.h rename to GNN/OndselSolver/ASMTPlanarJoint.h diff --git a/OndselSolver/ASMTPointInLineJoint.cpp b/GNN/OndselSolver/ASMTPointInLineJoint.cpp similarity index 100% rename from OndselSolver/ASMTPointInLineJoint.cpp rename to GNN/OndselSolver/ASMTPointInLineJoint.cpp diff --git a/OndselSolver/ASMTPointInLineJoint.h b/GNN/OndselSolver/ASMTPointInLineJoint.h similarity index 100% rename from OndselSolver/ASMTPointInLineJoint.h rename to GNN/OndselSolver/ASMTPointInLineJoint.h diff --git a/OndselSolver/ASMTPointInPlaneJoint.cpp b/GNN/OndselSolver/ASMTPointInPlaneJoint.cpp similarity index 100% rename from OndselSolver/ASMTPointInPlaneJoint.cpp rename to GNN/OndselSolver/ASMTPointInPlaneJoint.cpp diff --git a/OndselSolver/ASMTPointInPlaneJoint.h b/GNN/OndselSolver/ASMTPointInPlaneJoint.h similarity index 100% rename from OndselSolver/ASMTPointInPlaneJoint.h rename to GNN/OndselSolver/ASMTPointInPlaneJoint.h diff --git a/OndselSolver/ASMTPrincipalMassMarker.cpp b/GNN/OndselSolver/ASMTPrincipalMassMarker.cpp similarity index 100% rename from OndselSolver/ASMTPrincipalMassMarker.cpp rename to GNN/OndselSolver/ASMTPrincipalMassMarker.cpp diff --git a/OndselSolver/ASMTPrincipalMassMarker.h b/GNN/OndselSolver/ASMTPrincipalMassMarker.h similarity index 100% rename from OndselSolver/ASMTPrincipalMassMarker.h rename to GNN/OndselSolver/ASMTPrincipalMassMarker.h diff --git a/OndselSolver/ASMTRackPinionJoint.cpp b/GNN/OndselSolver/ASMTRackPinionJoint.cpp similarity index 100% rename from OndselSolver/ASMTRackPinionJoint.cpp rename to GNN/OndselSolver/ASMTRackPinionJoint.cpp diff --git a/OndselSolver/ASMTRackPinionJoint.h b/GNN/OndselSolver/ASMTRackPinionJoint.h similarity index 100% rename from OndselSolver/ASMTRackPinionJoint.h rename to GNN/OndselSolver/ASMTRackPinionJoint.h diff --git a/OndselSolver/ASMTRefCurve.cpp b/GNN/OndselSolver/ASMTRefCurve.cpp similarity index 100% rename from OndselSolver/ASMTRefCurve.cpp rename to GNN/OndselSolver/ASMTRefCurve.cpp diff --git a/OndselSolver/ASMTRefCurve.h b/GNN/OndselSolver/ASMTRefCurve.h similarity index 100% rename from OndselSolver/ASMTRefCurve.h rename to GNN/OndselSolver/ASMTRefCurve.h diff --git a/OndselSolver/ASMTRefItem.cpp b/GNN/OndselSolver/ASMTRefItem.cpp similarity index 100% rename from OndselSolver/ASMTRefItem.cpp rename to GNN/OndselSolver/ASMTRefItem.cpp diff --git a/OndselSolver/ASMTRefItem.h b/GNN/OndselSolver/ASMTRefItem.h similarity index 100% rename from OndselSolver/ASMTRefItem.h rename to GNN/OndselSolver/ASMTRefItem.h diff --git a/OndselSolver/ASMTRefPoint.cpp b/GNN/OndselSolver/ASMTRefPoint.cpp similarity index 100% rename from OndselSolver/ASMTRefPoint.cpp rename to GNN/OndselSolver/ASMTRefPoint.cpp diff --git a/OndselSolver/ASMTRefPoint.h b/GNN/OndselSolver/ASMTRefPoint.h similarity index 100% rename from OndselSolver/ASMTRefPoint.h rename to GNN/OndselSolver/ASMTRefPoint.h diff --git a/OndselSolver/ASMTRefSurface.cpp b/GNN/OndselSolver/ASMTRefSurface.cpp similarity index 100% rename from OndselSolver/ASMTRefSurface.cpp rename to GNN/OndselSolver/ASMTRefSurface.cpp diff --git a/OndselSolver/ASMTRefSurface.h b/GNN/OndselSolver/ASMTRefSurface.h similarity index 100% rename from OndselSolver/ASMTRefSurface.h rename to GNN/OndselSolver/ASMTRefSurface.h diff --git a/OndselSolver/ASMTRevCylJoint.cpp b/GNN/OndselSolver/ASMTRevCylJoint.cpp similarity index 100% rename from OndselSolver/ASMTRevCylJoint.cpp rename to GNN/OndselSolver/ASMTRevCylJoint.cpp diff --git a/OndselSolver/ASMTRevCylJoint.h b/GNN/OndselSolver/ASMTRevCylJoint.h similarity index 100% rename from OndselSolver/ASMTRevCylJoint.h rename to GNN/OndselSolver/ASMTRevCylJoint.h diff --git a/OndselSolver/ASMTRevRevJoint.cpp b/GNN/OndselSolver/ASMTRevRevJoint.cpp similarity index 100% rename from OndselSolver/ASMTRevRevJoint.cpp rename to GNN/OndselSolver/ASMTRevRevJoint.cpp diff --git a/OndselSolver/ASMTRevRevJoint.h b/GNN/OndselSolver/ASMTRevRevJoint.h similarity index 100% rename from OndselSolver/ASMTRevRevJoint.h rename to GNN/OndselSolver/ASMTRevRevJoint.h diff --git a/OndselSolver/ASMTRevoluteJoint.cpp b/GNN/OndselSolver/ASMTRevoluteJoint.cpp similarity index 100% rename from OndselSolver/ASMTRevoluteJoint.cpp rename to GNN/OndselSolver/ASMTRevoluteJoint.cpp diff --git a/OndselSolver/ASMTRevoluteJoint.h b/GNN/OndselSolver/ASMTRevoluteJoint.h similarity index 100% rename from OndselSolver/ASMTRevoluteJoint.h rename to GNN/OndselSolver/ASMTRevoluteJoint.h diff --git a/OndselSolver/ASMTRotationLimit.cpp b/GNN/OndselSolver/ASMTRotationLimit.cpp similarity index 100% rename from OndselSolver/ASMTRotationLimit.cpp rename to GNN/OndselSolver/ASMTRotationLimit.cpp diff --git a/OndselSolver/ASMTRotationLimit.h b/GNN/OndselSolver/ASMTRotationLimit.h similarity index 100% rename from OndselSolver/ASMTRotationLimit.h rename to GNN/OndselSolver/ASMTRotationLimit.h diff --git a/OndselSolver/ASMTRotationalMotion.cpp b/GNN/OndselSolver/ASMTRotationalMotion.cpp similarity index 100% rename from OndselSolver/ASMTRotationalMotion.cpp rename to GNN/OndselSolver/ASMTRotationalMotion.cpp diff --git a/OndselSolver/ASMTRotationalMotion.h b/GNN/OndselSolver/ASMTRotationalMotion.h similarity index 100% rename from OndselSolver/ASMTRotationalMotion.h rename to GNN/OndselSolver/ASMTRotationalMotion.h diff --git a/OndselSolver/ASMTScrewJoint.cpp b/GNN/OndselSolver/ASMTScrewJoint.cpp similarity index 100% rename from OndselSolver/ASMTScrewJoint.cpp rename to GNN/OndselSolver/ASMTScrewJoint.cpp diff --git a/OndselSolver/ASMTScrewJoint.h b/GNN/OndselSolver/ASMTScrewJoint.h similarity index 100% rename from OndselSolver/ASMTScrewJoint.h rename to GNN/OndselSolver/ASMTScrewJoint.h diff --git a/OndselSolver/ASMTSimulationParameters.cpp b/GNN/OndselSolver/ASMTSimulationParameters.cpp similarity index 100% rename from OndselSolver/ASMTSimulationParameters.cpp rename to GNN/OndselSolver/ASMTSimulationParameters.cpp diff --git a/OndselSolver/ASMTSimulationParameters.h b/GNN/OndselSolver/ASMTSimulationParameters.h similarity index 100% rename from OndselSolver/ASMTSimulationParameters.h rename to GNN/OndselSolver/ASMTSimulationParameters.h diff --git a/OndselSolver/ASMTSpatialContainer.cpp b/GNN/OndselSolver/ASMTSpatialContainer.cpp similarity index 100% rename from OndselSolver/ASMTSpatialContainer.cpp rename to GNN/OndselSolver/ASMTSpatialContainer.cpp diff --git a/OndselSolver/ASMTSpatialContainer.h b/GNN/OndselSolver/ASMTSpatialContainer.h similarity index 100% rename from OndselSolver/ASMTSpatialContainer.h rename to GNN/OndselSolver/ASMTSpatialContainer.h diff --git a/OndselSolver/ASMTSpatialItem.cpp b/GNN/OndselSolver/ASMTSpatialItem.cpp similarity index 100% rename from OndselSolver/ASMTSpatialItem.cpp rename to GNN/OndselSolver/ASMTSpatialItem.cpp diff --git a/OndselSolver/ASMTSpatialItem.h b/GNN/OndselSolver/ASMTSpatialItem.h similarity index 100% rename from OndselSolver/ASMTSpatialItem.h rename to GNN/OndselSolver/ASMTSpatialItem.h diff --git a/OndselSolver/ASMTSphSphJoint.cpp b/GNN/OndselSolver/ASMTSphSphJoint.cpp similarity index 100% rename from OndselSolver/ASMTSphSphJoint.cpp rename to GNN/OndselSolver/ASMTSphSphJoint.cpp diff --git a/OndselSolver/ASMTSphSphJoint.h b/GNN/OndselSolver/ASMTSphSphJoint.h similarity index 100% rename from OndselSolver/ASMTSphSphJoint.h rename to GNN/OndselSolver/ASMTSphSphJoint.h diff --git a/OndselSolver/ASMTSphericalJoint.cpp b/GNN/OndselSolver/ASMTSphericalJoint.cpp similarity index 100% rename from OndselSolver/ASMTSphericalJoint.cpp rename to GNN/OndselSolver/ASMTSphericalJoint.cpp diff --git a/OndselSolver/ASMTSphericalJoint.h b/GNN/OndselSolver/ASMTSphericalJoint.h similarity index 100% rename from OndselSolver/ASMTSphericalJoint.h rename to GNN/OndselSolver/ASMTSphericalJoint.h diff --git a/OndselSolver/ASMTTime.cpp b/GNN/OndselSolver/ASMTTime.cpp similarity index 100% rename from OndselSolver/ASMTTime.cpp rename to GNN/OndselSolver/ASMTTime.cpp diff --git a/OndselSolver/ASMTTime.h b/GNN/OndselSolver/ASMTTime.h similarity index 100% rename from OndselSolver/ASMTTime.h rename to GNN/OndselSolver/ASMTTime.h diff --git a/OndselSolver/ASMTTranslationLimit.cpp b/GNN/OndselSolver/ASMTTranslationLimit.cpp similarity index 100% rename from OndselSolver/ASMTTranslationLimit.cpp rename to GNN/OndselSolver/ASMTTranslationLimit.cpp diff --git a/OndselSolver/ASMTTranslationLimit.h b/GNN/OndselSolver/ASMTTranslationLimit.h similarity index 100% rename from OndselSolver/ASMTTranslationLimit.h rename to GNN/OndselSolver/ASMTTranslationLimit.h diff --git a/OndselSolver/ASMTTranslationalJoint.cpp b/GNN/OndselSolver/ASMTTranslationalJoint.cpp similarity index 100% rename from OndselSolver/ASMTTranslationalJoint.cpp rename to GNN/OndselSolver/ASMTTranslationalJoint.cpp diff --git a/OndselSolver/ASMTTranslationalJoint.h b/GNN/OndselSolver/ASMTTranslationalJoint.h similarity index 100% rename from OndselSolver/ASMTTranslationalJoint.h rename to GNN/OndselSolver/ASMTTranslationalJoint.h diff --git a/OndselSolver/ASMTTranslationalMotion.cpp b/GNN/OndselSolver/ASMTTranslationalMotion.cpp similarity index 100% rename from OndselSolver/ASMTTranslationalMotion.cpp rename to GNN/OndselSolver/ASMTTranslationalMotion.cpp diff --git a/OndselSolver/ASMTTranslationalMotion.h b/GNN/OndselSolver/ASMTTranslationalMotion.h similarity index 100% rename from OndselSolver/ASMTTranslationalMotion.h rename to GNN/OndselSolver/ASMTTranslationalMotion.h diff --git a/OndselSolver/ASMTUniversalJoint.cpp b/GNN/OndselSolver/ASMTUniversalJoint.cpp similarity index 100% rename from OndselSolver/ASMTUniversalJoint.cpp rename to GNN/OndselSolver/ASMTUniversalJoint.cpp diff --git a/OndselSolver/ASMTUniversalJoint.h b/GNN/OndselSolver/ASMTUniversalJoint.h similarity index 100% rename from OndselSolver/ASMTUniversalJoint.h rename to GNN/OndselSolver/ASMTUniversalJoint.h diff --git a/OndselSolver/Abs.cpp b/GNN/OndselSolver/Abs.cpp similarity index 100% rename from OndselSolver/Abs.cpp rename to GNN/OndselSolver/Abs.cpp diff --git a/OndselSolver/Abs.h b/GNN/OndselSolver/Abs.h similarity index 100% rename from OndselSolver/Abs.h rename to GNN/OndselSolver/Abs.h diff --git a/OndselSolver/AbsConstraint.cpp b/GNN/OndselSolver/AbsConstraint.cpp similarity index 100% rename from OndselSolver/AbsConstraint.cpp rename to GNN/OndselSolver/AbsConstraint.cpp diff --git a/OndselSolver/AbsConstraint.h b/GNN/OndselSolver/AbsConstraint.h similarity index 100% rename from OndselSolver/AbsConstraint.h rename to GNN/OndselSolver/AbsConstraint.h diff --git a/OndselSolver/AccICKineNewtonRaphson.cpp b/GNN/OndselSolver/AccICKineNewtonRaphson.cpp similarity index 100% rename from OndselSolver/AccICKineNewtonRaphson.cpp rename to GNN/OndselSolver/AccICKineNewtonRaphson.cpp diff --git a/OndselSolver/AccICKineNewtonRaphson.h b/GNN/OndselSolver/AccICKineNewtonRaphson.h similarity index 100% rename from OndselSolver/AccICKineNewtonRaphson.h rename to GNN/OndselSolver/AccICKineNewtonRaphson.h diff --git a/OndselSolver/AccICNewtonRaphson.cpp b/GNN/OndselSolver/AccICNewtonRaphson.cpp similarity index 100% rename from OndselSolver/AccICNewtonRaphson.cpp rename to GNN/OndselSolver/AccICNewtonRaphson.cpp diff --git a/OndselSolver/AccICNewtonRaphson.h b/GNN/OndselSolver/AccICNewtonRaphson.h similarity index 100% rename from OndselSolver/AccICNewtonRaphson.h rename to GNN/OndselSolver/AccICNewtonRaphson.h diff --git a/OndselSolver/AccKineNewtonRaphson.cpp b/GNN/OndselSolver/AccKineNewtonRaphson.cpp similarity index 100% rename from OndselSolver/AccKineNewtonRaphson.cpp rename to GNN/OndselSolver/AccKineNewtonRaphson.cpp diff --git a/OndselSolver/AccKineNewtonRaphson.h b/GNN/OndselSolver/AccKineNewtonRaphson.h similarity index 100% rename from OndselSolver/AccKineNewtonRaphson.h rename to GNN/OndselSolver/AccKineNewtonRaphson.h diff --git a/OndselSolver/AccNewtonRaphson.cpp b/GNN/OndselSolver/AccNewtonRaphson.cpp similarity index 100% rename from OndselSolver/AccNewtonRaphson.cpp rename to GNN/OndselSolver/AccNewtonRaphson.cpp diff --git a/OndselSolver/AccNewtonRaphson.h b/GNN/OndselSolver/AccNewtonRaphson.h similarity index 100% rename from OndselSolver/AccNewtonRaphson.h rename to GNN/OndselSolver/AccNewtonRaphson.h diff --git a/OndselSolver/AllowZRotation.cpp b/GNN/OndselSolver/AllowZRotation.cpp similarity index 100% rename from OndselSolver/AllowZRotation.cpp rename to GNN/OndselSolver/AllowZRotation.cpp diff --git a/OndselSolver/AllowZRotation.h b/GNN/OndselSolver/AllowZRotation.h similarity index 100% rename from OndselSolver/AllowZRotation.h rename to GNN/OndselSolver/AllowZRotation.h diff --git a/OndselSolver/AllowZRotationConstraintIqctJqc.cpp b/GNN/OndselSolver/AllowZRotationConstraintIqctJqc.cpp similarity index 100% rename from OndselSolver/AllowZRotationConstraintIqctJqc.cpp rename to GNN/OndselSolver/AllowZRotationConstraintIqctJqc.cpp diff --git a/OndselSolver/AllowZRotationConstraintIqctJqc.h b/GNN/OndselSolver/AllowZRotationConstraintIqctJqc.h similarity index 100% rename from OndselSolver/AllowZRotationConstraintIqctJqc.h rename to GNN/OndselSolver/AllowZRotationConstraintIqctJqc.h diff --git a/OndselSolver/AngleJoint.cpp b/GNN/OndselSolver/AngleJoint.cpp similarity index 100% rename from OndselSolver/AngleJoint.cpp rename to GNN/OndselSolver/AngleJoint.cpp diff --git a/OndselSolver/AngleJoint.h b/GNN/OndselSolver/AngleJoint.h similarity index 100% rename from OndselSolver/AngleJoint.h rename to GNN/OndselSolver/AngleJoint.h diff --git a/OndselSolver/AngleZConstraintIJ.cpp b/GNN/OndselSolver/AngleZConstraintIJ.cpp similarity index 100% rename from OndselSolver/AngleZConstraintIJ.cpp rename to GNN/OndselSolver/AngleZConstraintIJ.cpp diff --git a/OndselSolver/AngleZConstraintIJ.h b/GNN/OndselSolver/AngleZConstraintIJ.h similarity index 100% rename from OndselSolver/AngleZConstraintIJ.h rename to GNN/OndselSolver/AngleZConstraintIJ.h diff --git a/OndselSolver/AngleZConstraintIqcJc.cpp b/GNN/OndselSolver/AngleZConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/AngleZConstraintIqcJc.cpp rename to GNN/OndselSolver/AngleZConstraintIqcJc.cpp diff --git a/OndselSolver/AngleZConstraintIqcJc.h b/GNN/OndselSolver/AngleZConstraintIqcJc.h similarity index 100% rename from OndselSolver/AngleZConstraintIqcJc.h rename to GNN/OndselSolver/AngleZConstraintIqcJc.h diff --git a/OndselSolver/AngleZConstraintIqcJqc.cpp b/GNN/OndselSolver/AngleZConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/AngleZConstraintIqcJqc.cpp rename to GNN/OndselSolver/AngleZConstraintIqcJqc.cpp diff --git a/OndselSolver/AngleZConstraintIqcJqc.h b/GNN/OndselSolver/AngleZConstraintIqcJqc.h similarity index 100% rename from OndselSolver/AngleZConstraintIqcJqc.h rename to GNN/OndselSolver/AngleZConstraintIqcJqc.h diff --git a/OndselSolver/AngleZIecJec.cpp b/GNN/OndselSolver/AngleZIecJec.cpp similarity index 100% rename from OndselSolver/AngleZIecJec.cpp rename to GNN/OndselSolver/AngleZIecJec.cpp diff --git a/OndselSolver/AngleZIecJec.h b/GNN/OndselSolver/AngleZIecJec.h similarity index 100% rename from OndselSolver/AngleZIecJec.h rename to GNN/OndselSolver/AngleZIecJec.h diff --git a/OndselSolver/AngleZIeqcJec.cpp b/GNN/OndselSolver/AngleZIeqcJec.cpp similarity index 100% rename from OndselSolver/AngleZIeqcJec.cpp rename to GNN/OndselSolver/AngleZIeqcJec.cpp diff --git a/OndselSolver/AngleZIeqcJec.h b/GNN/OndselSolver/AngleZIeqcJec.h similarity index 100% rename from OndselSolver/AngleZIeqcJec.h rename to GNN/OndselSolver/AngleZIeqcJec.h diff --git a/OndselSolver/AngleZIeqcJeqc.cpp b/GNN/OndselSolver/AngleZIeqcJeqc.cpp similarity index 100% rename from OndselSolver/AngleZIeqcJeqc.cpp rename to GNN/OndselSolver/AngleZIeqcJeqc.cpp diff --git a/OndselSolver/AngleZIeqcJeqc.h b/GNN/OndselSolver/AngleZIeqcJeqc.h similarity index 100% rename from OndselSolver/AngleZIeqcJeqc.h rename to GNN/OndselSolver/AngleZIeqcJeqc.h diff --git a/OndselSolver/AnyGeneralSpline.cpp b/GNN/OndselSolver/AnyGeneralSpline.cpp similarity index 100% rename from OndselSolver/AnyGeneralSpline.cpp rename to GNN/OndselSolver/AnyGeneralSpline.cpp diff --git a/OndselSolver/AnyGeneralSpline.h b/GNN/OndselSolver/AnyGeneralSpline.h similarity index 100% rename from OndselSolver/AnyGeneralSpline.h rename to GNN/OndselSolver/AnyGeneralSpline.h diff --git a/OndselSolver/AnyPosICNewtonRaphson.cpp b/GNN/OndselSolver/AnyPosICNewtonRaphson.cpp similarity index 100% rename from OndselSolver/AnyPosICNewtonRaphson.cpp rename to GNN/OndselSolver/AnyPosICNewtonRaphson.cpp diff --git a/OndselSolver/AnyPosICNewtonRaphson.h b/GNN/OndselSolver/AnyPosICNewtonRaphson.h similarity index 100% rename from OndselSolver/AnyPosICNewtonRaphson.h rename to GNN/OndselSolver/AnyPosICNewtonRaphson.h diff --git a/OndselSolver/ArcSine.cpp b/GNN/OndselSolver/ArcSine.cpp similarity index 100% rename from OndselSolver/ArcSine.cpp rename to GNN/OndselSolver/ArcSine.cpp diff --git a/OndselSolver/ArcSine.h b/GNN/OndselSolver/ArcSine.h similarity index 100% rename from OndselSolver/ArcSine.h rename to GNN/OndselSolver/ArcSine.h diff --git a/OndselSolver/ArcTan.cpp b/GNN/OndselSolver/ArcTan.cpp similarity index 100% rename from OndselSolver/ArcTan.cpp rename to GNN/OndselSolver/ArcTan.cpp diff --git a/OndselSolver/ArcTan.h b/GNN/OndselSolver/ArcTan.h similarity index 100% rename from OndselSolver/ArcTan.h rename to GNN/OndselSolver/ArcTan.h diff --git a/OndselSolver/ArcTan2.cpp b/GNN/OndselSolver/ArcTan2.cpp similarity index 100% rename from OndselSolver/ArcTan2.cpp rename to GNN/OndselSolver/ArcTan2.cpp diff --git a/OndselSolver/ArcTan2.h b/GNN/OndselSolver/ArcTan2.h similarity index 100% rename from OndselSolver/ArcTan2.h rename to GNN/OndselSolver/ArcTan2.h diff --git a/OndselSolver/Arguments.cpp b/GNN/OndselSolver/Arguments.cpp similarity index 100% rename from OndselSolver/Arguments.cpp rename to GNN/OndselSolver/Arguments.cpp diff --git a/OndselSolver/Arguments.h b/GNN/OndselSolver/Arguments.h similarity index 100% rename from OndselSolver/Arguments.h rename to GNN/OndselSolver/Arguments.h diff --git a/OndselSolver/Array.cpp b/GNN/OndselSolver/Array.cpp similarity index 100% rename from OndselSolver/Array.cpp rename to GNN/OndselSolver/Array.cpp diff --git a/OndselSolver/Array.h b/GNN/OndselSolver/Array.h similarity index 100% rename from OndselSolver/Array.h rename to GNN/OndselSolver/Array.h diff --git a/OndselSolver/AtPointConstraintIJ.cpp b/GNN/OndselSolver/AtPointConstraintIJ.cpp similarity index 100% rename from OndselSolver/AtPointConstraintIJ.cpp rename to GNN/OndselSolver/AtPointConstraintIJ.cpp diff --git a/OndselSolver/AtPointConstraintIJ.h b/GNN/OndselSolver/AtPointConstraintIJ.h similarity index 100% rename from OndselSolver/AtPointConstraintIJ.h rename to GNN/OndselSolver/AtPointConstraintIJ.h diff --git a/OndselSolver/AtPointConstraintIqcJc.cpp b/GNN/OndselSolver/AtPointConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/AtPointConstraintIqcJc.cpp rename to GNN/OndselSolver/AtPointConstraintIqcJc.cpp diff --git a/OndselSolver/AtPointConstraintIqcJc.h b/GNN/OndselSolver/AtPointConstraintIqcJc.h similarity index 100% rename from OndselSolver/AtPointConstraintIqcJc.h rename to GNN/OndselSolver/AtPointConstraintIqcJc.h diff --git a/OndselSolver/AtPointConstraintIqcJqc.cpp b/GNN/OndselSolver/AtPointConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/AtPointConstraintIqcJqc.cpp rename to GNN/OndselSolver/AtPointConstraintIqcJqc.cpp diff --git a/OndselSolver/AtPointConstraintIqcJqc.h b/GNN/OndselSolver/AtPointConstraintIqcJqc.h similarity index 100% rename from OndselSolver/AtPointConstraintIqcJqc.h rename to GNN/OndselSolver/AtPointConstraintIqcJqc.h diff --git a/OndselSolver/AtPointConstraintIqctJqc.cpp b/GNN/OndselSolver/AtPointConstraintIqctJqc.cpp similarity index 100% rename from OndselSolver/AtPointConstraintIqctJqc.cpp rename to GNN/OndselSolver/AtPointConstraintIqctJqc.cpp diff --git a/OndselSolver/AtPointConstraintIqctJqc.h b/GNN/OndselSolver/AtPointConstraintIqctJqc.h similarity index 100% rename from OndselSolver/AtPointConstraintIqctJqc.h rename to GNN/OndselSolver/AtPointConstraintIqctJqc.h diff --git a/OndselSolver/AtPointJoint.cpp b/GNN/OndselSolver/AtPointJoint.cpp similarity index 100% rename from OndselSolver/AtPointJoint.cpp rename to GNN/OndselSolver/AtPointJoint.cpp diff --git a/OndselSolver/AtPointJoint.h b/GNN/OndselSolver/AtPointJoint.h similarity index 100% rename from OndselSolver/AtPointJoint.h rename to GNN/OndselSolver/AtPointJoint.h diff --git a/OndselSolver/BasicIntegrator.cpp b/GNN/OndselSolver/BasicIntegrator.cpp similarity index 100% rename from OndselSolver/BasicIntegrator.cpp rename to GNN/OndselSolver/BasicIntegrator.cpp diff --git a/OndselSolver/BasicIntegrator.h b/GNN/OndselSolver/BasicIntegrator.h similarity index 100% rename from OndselSolver/BasicIntegrator.h rename to GNN/OndselSolver/BasicIntegrator.h diff --git a/OndselSolver/BasicQuasiIntegrator.cpp b/GNN/OndselSolver/BasicQuasiIntegrator.cpp similarity index 100% rename from OndselSolver/BasicQuasiIntegrator.cpp rename to GNN/OndselSolver/BasicQuasiIntegrator.cpp diff --git a/OndselSolver/BasicQuasiIntegrator.h b/GNN/OndselSolver/BasicQuasiIntegrator.h similarity index 100% rename from OndselSolver/BasicQuasiIntegrator.h rename to GNN/OndselSolver/BasicQuasiIntegrator.h diff --git a/OndselSolver/BasicUserFunction.cpp b/GNN/OndselSolver/BasicUserFunction.cpp similarity index 100% rename from OndselSolver/BasicUserFunction.cpp rename to GNN/OndselSolver/BasicUserFunction.cpp diff --git a/OndselSolver/BasicUserFunction.h b/GNN/OndselSolver/BasicUserFunction.h similarity index 100% rename from OndselSolver/BasicUserFunction.h rename to GNN/OndselSolver/BasicUserFunction.h diff --git a/OndselSolver/CADSystem.cpp b/GNN/OndselSolver/CADSystem.cpp similarity index 100% rename from OndselSolver/CADSystem.cpp rename to GNN/OndselSolver/CADSystem.cpp diff --git a/OndselSolver/CADSystem.h b/GNN/OndselSolver/CADSystem.h similarity index 100% rename from OndselSolver/CADSystem.h rename to GNN/OndselSolver/CADSystem.h diff --git a/OndselSolver/CMakeLists.txt b/GNN/OndselSolver/CMakeLists.txt similarity index 100% rename from OndselSolver/CMakeLists.txt rename to GNN/OndselSolver/CMakeLists.txt diff --git a/OndselSolver/CREATE.cpp b/GNN/OndselSolver/CREATE.cpp similarity index 100% rename from OndselSolver/CREATE.cpp rename to GNN/OndselSolver/CREATE.cpp diff --git a/OndselSolver/CREATE.h b/GNN/OndselSolver/CREATE.h similarity index 100% rename from OndselSolver/CREATE.h rename to GNN/OndselSolver/CREATE.h diff --git a/OndselSolver/CartesianFrame.cpp b/GNN/OndselSolver/CartesianFrame.cpp similarity index 100% rename from OndselSolver/CartesianFrame.cpp rename to GNN/OndselSolver/CartesianFrame.cpp diff --git a/OndselSolver/CartesianFrame.h b/GNN/OndselSolver/CartesianFrame.h similarity index 100% rename from OndselSolver/CartesianFrame.h rename to GNN/OndselSolver/CartesianFrame.h diff --git a/OndselSolver/CompoundJoint.cpp b/GNN/OndselSolver/CompoundJoint.cpp similarity index 100% rename from OndselSolver/CompoundJoint.cpp rename to GNN/OndselSolver/CompoundJoint.cpp diff --git a/OndselSolver/CompoundJoint.h b/GNN/OndselSolver/CompoundJoint.h similarity index 100% rename from OndselSolver/CompoundJoint.h rename to GNN/OndselSolver/CompoundJoint.h diff --git a/OndselSolver/ConstVelConstraintIJ.cpp b/GNN/OndselSolver/ConstVelConstraintIJ.cpp similarity index 100% rename from OndselSolver/ConstVelConstraintIJ.cpp rename to GNN/OndselSolver/ConstVelConstraintIJ.cpp diff --git a/OndselSolver/ConstVelConstraintIJ.h b/GNN/OndselSolver/ConstVelConstraintIJ.h similarity index 100% rename from OndselSolver/ConstVelConstraintIJ.h rename to GNN/OndselSolver/ConstVelConstraintIJ.h diff --git a/OndselSolver/ConstVelConstraintIqcJc.cpp b/GNN/OndselSolver/ConstVelConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/ConstVelConstraintIqcJc.cpp rename to GNN/OndselSolver/ConstVelConstraintIqcJc.cpp diff --git a/OndselSolver/ConstVelConstraintIqcJc.h b/GNN/OndselSolver/ConstVelConstraintIqcJc.h similarity index 100% rename from OndselSolver/ConstVelConstraintIqcJc.h rename to GNN/OndselSolver/ConstVelConstraintIqcJc.h diff --git a/OndselSolver/ConstVelConstraintIqcJqc.cpp b/GNN/OndselSolver/ConstVelConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/ConstVelConstraintIqcJqc.cpp rename to GNN/OndselSolver/ConstVelConstraintIqcJqc.cpp diff --git a/OndselSolver/ConstVelConstraintIqcJqc.h b/GNN/OndselSolver/ConstVelConstraintIqcJqc.h similarity index 100% rename from OndselSolver/ConstVelConstraintIqcJqc.h rename to GNN/OndselSolver/ConstVelConstraintIqcJqc.h diff --git a/OndselSolver/Constant.cpp b/GNN/OndselSolver/Constant.cpp similarity index 100% rename from OndselSolver/Constant.cpp rename to GNN/OndselSolver/Constant.cpp diff --git a/OndselSolver/Constant.h b/GNN/OndselSolver/Constant.h similarity index 100% rename from OndselSolver/Constant.h rename to GNN/OndselSolver/Constant.h diff --git a/OndselSolver/ConstantGravity.cpp b/GNN/OndselSolver/ConstantGravity.cpp similarity index 100% rename from OndselSolver/ConstantGravity.cpp rename to GNN/OndselSolver/ConstantGravity.cpp diff --git a/OndselSolver/ConstantGravity.h b/GNN/OndselSolver/ConstantGravity.h similarity index 100% rename from OndselSolver/ConstantGravity.h rename to GNN/OndselSolver/ConstantGravity.h diff --git a/OndselSolver/ConstantVelocityJoint.cpp b/GNN/OndselSolver/ConstantVelocityJoint.cpp similarity index 100% rename from OndselSolver/ConstantVelocityJoint.cpp rename to GNN/OndselSolver/ConstantVelocityJoint.cpp diff --git a/OndselSolver/ConstantVelocityJoint.h b/GNN/OndselSolver/ConstantVelocityJoint.h similarity index 100% rename from OndselSolver/ConstantVelocityJoint.h rename to GNN/OndselSolver/ConstantVelocityJoint.h diff --git a/OndselSolver/Constraint.cpp b/GNN/OndselSolver/Constraint.cpp similarity index 100% rename from OndselSolver/Constraint.cpp rename to GNN/OndselSolver/Constraint.cpp diff --git a/OndselSolver/Constraint.h b/GNN/OndselSolver/Constraint.h similarity index 100% rename from OndselSolver/Constraint.h rename to GNN/OndselSolver/Constraint.h diff --git a/OndselSolver/ConstraintIJ.cpp b/GNN/OndselSolver/ConstraintIJ.cpp similarity index 100% rename from OndselSolver/ConstraintIJ.cpp rename to GNN/OndselSolver/ConstraintIJ.cpp diff --git a/OndselSolver/ConstraintIJ.h b/GNN/OndselSolver/ConstraintIJ.h similarity index 100% rename from OndselSolver/ConstraintIJ.h rename to GNN/OndselSolver/ConstraintIJ.h diff --git a/OndselSolver/ConstraintSet.cpp b/GNN/OndselSolver/ConstraintSet.cpp similarity index 100% rename from OndselSolver/ConstraintSet.cpp rename to GNN/OndselSolver/ConstraintSet.cpp diff --git a/OndselSolver/ConstraintSet.h b/GNN/OndselSolver/ConstraintSet.h similarity index 100% rename from OndselSolver/ConstraintSet.h rename to GNN/OndselSolver/ConstraintSet.h diff --git a/OndselSolver/Cosine.cpp b/GNN/OndselSolver/Cosine.cpp similarity index 100% rename from OndselSolver/Cosine.cpp rename to GNN/OndselSolver/Cosine.cpp diff --git a/OndselSolver/Cosine.h b/GNN/OndselSolver/Cosine.h similarity index 100% rename from OndselSolver/Cosine.h rename to GNN/OndselSolver/Cosine.h diff --git a/OndselSolver/CrankSlider2.mbd b/GNN/OndselSolver/CrankSlider2.mbd similarity index 100% rename from OndselSolver/CrankSlider2.mbd rename to GNN/OndselSolver/CrankSlider2.mbd diff --git a/OndselSolver/CrankSlider2.mov b/GNN/OndselSolver/CrankSlider2.mov similarity index 100% rename from OndselSolver/CrankSlider2.mov rename to GNN/OndselSolver/CrankSlider2.mov diff --git a/OndselSolver/CylSphJoint.cpp b/GNN/OndselSolver/CylSphJoint.cpp similarity index 100% rename from OndselSolver/CylSphJoint.cpp rename to GNN/OndselSolver/CylSphJoint.cpp diff --git a/OndselSolver/CylSphJoint.h b/GNN/OndselSolver/CylSphJoint.h similarity index 100% rename from OndselSolver/CylSphJoint.h rename to GNN/OndselSolver/CylSphJoint.h diff --git a/OndselSolver/CylindricalJoint.cpp b/GNN/OndselSolver/CylindricalJoint.cpp similarity index 100% rename from OndselSolver/CylindricalJoint.cpp rename to GNN/OndselSolver/CylindricalJoint.cpp diff --git a/OndselSolver/CylindricalJoint.h b/GNN/OndselSolver/CylindricalJoint.h similarity index 100% rename from OndselSolver/CylindricalJoint.h rename to GNN/OndselSolver/CylindricalJoint.h diff --git a/OndselSolver/DiagonalMatrix.cpp b/GNN/OndselSolver/DiagonalMatrix.cpp similarity index 100% rename from OndselSolver/DiagonalMatrix.cpp rename to GNN/OndselSolver/DiagonalMatrix.cpp diff --git a/OndselSolver/DiagonalMatrix.h b/GNN/OndselSolver/DiagonalMatrix.h similarity index 100% rename from OndselSolver/DiagonalMatrix.h rename to GNN/OndselSolver/DiagonalMatrix.h diff --git a/OndselSolver/DifferenceOperator.cpp b/GNN/OndselSolver/DifferenceOperator.cpp similarity index 100% rename from OndselSolver/DifferenceOperator.cpp rename to GNN/OndselSolver/DifferenceOperator.cpp diff --git a/OndselSolver/DifferenceOperator.h b/GNN/OndselSolver/DifferenceOperator.h similarity index 100% rename from OndselSolver/DifferenceOperator.h rename to GNN/OndselSolver/DifferenceOperator.h diff --git a/OndselSolver/DifferentiatedGeneralSpline.cpp b/GNN/OndselSolver/DifferentiatedGeneralSpline.cpp similarity index 100% rename from OndselSolver/DifferentiatedGeneralSpline.cpp rename to GNN/OndselSolver/DifferentiatedGeneralSpline.cpp diff --git a/OndselSolver/DifferentiatedGeneralSpline.h b/GNN/OndselSolver/DifferentiatedGeneralSpline.h similarity index 100% rename from OndselSolver/DifferentiatedGeneralSpline.h rename to GNN/OndselSolver/DifferentiatedGeneralSpline.h diff --git a/OndselSolver/DirectionCosineConstraintIJ.cpp b/GNN/OndselSolver/DirectionCosineConstraintIJ.cpp similarity index 100% rename from OndselSolver/DirectionCosineConstraintIJ.cpp rename to GNN/OndselSolver/DirectionCosineConstraintIJ.cpp diff --git a/OndselSolver/DirectionCosineConstraintIJ.h b/GNN/OndselSolver/DirectionCosineConstraintIJ.h similarity index 100% rename from OndselSolver/DirectionCosineConstraintIJ.h rename to GNN/OndselSolver/DirectionCosineConstraintIJ.h diff --git a/OndselSolver/DirectionCosineConstraintIqcJc.cpp b/GNN/OndselSolver/DirectionCosineConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/DirectionCosineConstraintIqcJc.cpp rename to GNN/OndselSolver/DirectionCosineConstraintIqcJc.cpp diff --git a/OndselSolver/DirectionCosineConstraintIqcJc.h b/GNN/OndselSolver/DirectionCosineConstraintIqcJc.h similarity index 100% rename from OndselSolver/DirectionCosineConstraintIqcJc.h rename to GNN/OndselSolver/DirectionCosineConstraintIqcJc.h diff --git a/OndselSolver/DirectionCosineConstraintIqcJqc.cpp b/GNN/OndselSolver/DirectionCosineConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/DirectionCosineConstraintIqcJqc.cpp rename to GNN/OndselSolver/DirectionCosineConstraintIqcJqc.cpp diff --git a/OndselSolver/DirectionCosineConstraintIqcJqc.h b/GNN/OndselSolver/DirectionCosineConstraintIqcJqc.h similarity index 100% rename from OndselSolver/DirectionCosineConstraintIqcJqc.h rename to GNN/OndselSolver/DirectionCosineConstraintIqcJqc.h diff --git a/OndselSolver/DirectionCosineConstraintIqctJqc.cpp b/GNN/OndselSolver/DirectionCosineConstraintIqctJqc.cpp similarity index 100% rename from OndselSolver/DirectionCosineConstraintIqctJqc.cpp rename to GNN/OndselSolver/DirectionCosineConstraintIqctJqc.cpp diff --git a/OndselSolver/DirectionCosineConstraintIqctJqc.h b/GNN/OndselSolver/DirectionCosineConstraintIqctJqc.h similarity index 100% rename from OndselSolver/DirectionCosineConstraintIqctJqc.h rename to GNN/OndselSolver/DirectionCosineConstraintIqctJqc.h diff --git a/OndselSolver/DirectionCosineIecJec.cpp b/GNN/OndselSolver/DirectionCosineIecJec.cpp similarity index 100% rename from OndselSolver/DirectionCosineIecJec.cpp rename to GNN/OndselSolver/DirectionCosineIecJec.cpp diff --git a/OndselSolver/DirectionCosineIecJec.h b/GNN/OndselSolver/DirectionCosineIecJec.h similarity index 100% rename from OndselSolver/DirectionCosineIecJec.h rename to GNN/OndselSolver/DirectionCosineIecJec.h diff --git a/OndselSolver/DirectionCosineIeqcJec.cpp b/GNN/OndselSolver/DirectionCosineIeqcJec.cpp similarity index 100% rename from OndselSolver/DirectionCosineIeqcJec.cpp rename to GNN/OndselSolver/DirectionCosineIeqcJec.cpp diff --git a/OndselSolver/DirectionCosineIeqcJec.h b/GNN/OndselSolver/DirectionCosineIeqcJec.h similarity index 100% rename from OndselSolver/DirectionCosineIeqcJec.h rename to GNN/OndselSolver/DirectionCosineIeqcJec.h diff --git a/OndselSolver/DirectionCosineIeqcJeqc.cpp b/GNN/OndselSolver/DirectionCosineIeqcJeqc.cpp similarity index 100% rename from OndselSolver/DirectionCosineIeqcJeqc.cpp rename to GNN/OndselSolver/DirectionCosineIeqcJeqc.cpp diff --git a/OndselSolver/DirectionCosineIeqcJeqc.h b/GNN/OndselSolver/DirectionCosineIeqcJeqc.h similarity index 100% rename from OndselSolver/DirectionCosineIeqcJeqc.h rename to GNN/OndselSolver/DirectionCosineIeqcJeqc.h diff --git a/OndselSolver/DirectionCosineIeqctJeqc.cpp b/GNN/OndselSolver/DirectionCosineIeqctJeqc.cpp similarity index 100% rename from OndselSolver/DirectionCosineIeqctJeqc.cpp rename to GNN/OndselSolver/DirectionCosineIeqctJeqc.cpp diff --git a/OndselSolver/DirectionCosineIeqctJeqc.h b/GNN/OndselSolver/DirectionCosineIeqctJeqc.h similarity index 100% rename from OndselSolver/DirectionCosineIeqctJeqc.h rename to GNN/OndselSolver/DirectionCosineIeqctJeqc.h diff --git a/OndselSolver/DiscontinuityError.cpp b/GNN/OndselSolver/DiscontinuityError.cpp similarity index 100% rename from OndselSolver/DiscontinuityError.cpp rename to GNN/OndselSolver/DiscontinuityError.cpp diff --git a/OndselSolver/DiscontinuityError.h b/GNN/OndselSolver/DiscontinuityError.h similarity index 100% rename from OndselSolver/DiscontinuityError.h rename to GNN/OndselSolver/DiscontinuityError.h diff --git a/OndselSolver/DispCompIecJecIe.cpp b/GNN/OndselSolver/DispCompIecJecIe.cpp similarity index 100% rename from OndselSolver/DispCompIecJecIe.cpp rename to GNN/OndselSolver/DispCompIecJecIe.cpp diff --git a/OndselSolver/DispCompIecJecIe.h b/GNN/OndselSolver/DispCompIecJecIe.h similarity index 100% rename from OndselSolver/DispCompIecJecIe.h rename to GNN/OndselSolver/DispCompIecJecIe.h diff --git a/OndselSolver/DispCompIecJecKec.cpp b/GNN/OndselSolver/DispCompIecJecKec.cpp similarity index 100% rename from OndselSolver/DispCompIecJecKec.cpp rename to GNN/OndselSolver/DispCompIecJecKec.cpp diff --git a/OndselSolver/DispCompIecJecKec.h b/GNN/OndselSolver/DispCompIecJecKec.h similarity index 100% rename from OndselSolver/DispCompIecJecKec.h rename to GNN/OndselSolver/DispCompIecJecKec.h diff --git a/OndselSolver/DispCompIecJecKeqc.cpp b/GNN/OndselSolver/DispCompIecJecKeqc.cpp similarity index 100% rename from OndselSolver/DispCompIecJecKeqc.cpp rename to GNN/OndselSolver/DispCompIecJecKeqc.cpp diff --git a/OndselSolver/DispCompIecJecKeqc.h b/GNN/OndselSolver/DispCompIecJecKeqc.h similarity index 100% rename from OndselSolver/DispCompIecJecKeqc.h rename to GNN/OndselSolver/DispCompIecJecKeqc.h diff --git a/OndselSolver/DispCompIecJecO.cpp b/GNN/OndselSolver/DispCompIecJecO.cpp similarity index 100% rename from OndselSolver/DispCompIecJecO.cpp rename to GNN/OndselSolver/DispCompIecJecO.cpp diff --git a/OndselSolver/DispCompIecJecO.h b/GNN/OndselSolver/DispCompIecJecO.h similarity index 100% rename from OndselSolver/DispCompIecJecO.h rename to GNN/OndselSolver/DispCompIecJecO.h diff --git a/OndselSolver/DispCompIeqcJecIe.cpp b/GNN/OndselSolver/DispCompIeqcJecIe.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJecIe.cpp rename to GNN/OndselSolver/DispCompIeqcJecIe.cpp diff --git a/OndselSolver/DispCompIeqcJecIe.h b/GNN/OndselSolver/DispCompIeqcJecIe.h similarity index 100% rename from OndselSolver/DispCompIeqcJecIe.h rename to GNN/OndselSolver/DispCompIeqcJecIe.h diff --git a/OndselSolver/DispCompIeqcJecKeqc.cpp b/GNN/OndselSolver/DispCompIeqcJecKeqc.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJecKeqc.cpp rename to GNN/OndselSolver/DispCompIeqcJecKeqc.cpp diff --git a/OndselSolver/DispCompIeqcJecKeqc.h b/GNN/OndselSolver/DispCompIeqcJecKeqc.h similarity index 100% rename from OndselSolver/DispCompIeqcJecKeqc.h rename to GNN/OndselSolver/DispCompIeqcJecKeqc.h diff --git a/OndselSolver/DispCompIeqcJecO.cpp b/GNN/OndselSolver/DispCompIeqcJecO.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJecO.cpp rename to GNN/OndselSolver/DispCompIeqcJecO.cpp diff --git a/OndselSolver/DispCompIeqcJecO.h b/GNN/OndselSolver/DispCompIeqcJecO.h similarity index 100% rename from OndselSolver/DispCompIeqcJecO.h rename to GNN/OndselSolver/DispCompIeqcJecO.h diff --git a/OndselSolver/DispCompIeqcJeqcIe.cpp b/GNN/OndselSolver/DispCompIeqcJeqcIe.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJeqcIe.cpp rename to GNN/OndselSolver/DispCompIeqcJeqcIe.cpp diff --git a/OndselSolver/DispCompIeqcJeqcIe.h b/GNN/OndselSolver/DispCompIeqcJeqcIe.h similarity index 100% rename from OndselSolver/DispCompIeqcJeqcIe.h rename to GNN/OndselSolver/DispCompIeqcJeqcIe.h diff --git a/OndselSolver/DispCompIeqcJeqcKeqc.cpp b/GNN/OndselSolver/DispCompIeqcJeqcKeqc.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJeqcKeqc.cpp rename to GNN/OndselSolver/DispCompIeqcJeqcKeqc.cpp diff --git a/OndselSolver/DispCompIeqcJeqcKeqc.h b/GNN/OndselSolver/DispCompIeqcJeqcKeqc.h similarity index 100% rename from OndselSolver/DispCompIeqcJeqcKeqc.h rename to GNN/OndselSolver/DispCompIeqcJeqcKeqc.h diff --git a/OndselSolver/DispCompIeqcJeqcKeqct.cpp b/GNN/OndselSolver/DispCompIeqcJeqcKeqct.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJeqcKeqct.cpp rename to GNN/OndselSolver/DispCompIeqcJeqcKeqct.cpp diff --git a/OndselSolver/DispCompIeqcJeqcKeqct.h b/GNN/OndselSolver/DispCompIeqcJeqcKeqct.h similarity index 100% rename from OndselSolver/DispCompIeqcJeqcKeqct.h rename to GNN/OndselSolver/DispCompIeqcJeqcKeqct.h diff --git a/OndselSolver/DispCompIeqcJeqcO.cpp b/GNN/OndselSolver/DispCompIeqcJeqcO.cpp similarity index 100% rename from OndselSolver/DispCompIeqcJeqcO.cpp rename to GNN/OndselSolver/DispCompIeqcJeqcO.cpp diff --git a/OndselSolver/DispCompIeqcJeqcO.h b/GNN/OndselSolver/DispCompIeqcJeqcO.h similarity index 100% rename from OndselSolver/DispCompIeqcJeqcO.h rename to GNN/OndselSolver/DispCompIeqcJeqcO.h diff --git a/OndselSolver/DispCompIeqctJeqcIe.cpp b/GNN/OndselSolver/DispCompIeqctJeqcIe.cpp similarity index 100% rename from OndselSolver/DispCompIeqctJeqcIe.cpp rename to GNN/OndselSolver/DispCompIeqctJeqcIe.cpp diff --git a/OndselSolver/DispCompIeqctJeqcIe.h b/GNN/OndselSolver/DispCompIeqctJeqcIe.h similarity index 100% rename from OndselSolver/DispCompIeqctJeqcIe.h rename to GNN/OndselSolver/DispCompIeqctJeqcIe.h diff --git a/OndselSolver/DispCompIeqctJeqcKeqct.cpp b/GNN/OndselSolver/DispCompIeqctJeqcKeqct.cpp similarity index 100% rename from OndselSolver/DispCompIeqctJeqcKeqct.cpp rename to GNN/OndselSolver/DispCompIeqctJeqcKeqct.cpp diff --git a/OndselSolver/DispCompIeqctJeqcKeqct.h b/GNN/OndselSolver/DispCompIeqctJeqcKeqct.h similarity index 100% rename from OndselSolver/DispCompIeqctJeqcKeqct.h rename to GNN/OndselSolver/DispCompIeqctJeqcKeqct.h diff --git a/OndselSolver/DispCompIeqctJeqcO.cpp b/GNN/OndselSolver/DispCompIeqctJeqcO.cpp similarity index 100% rename from OndselSolver/DispCompIeqctJeqcO.cpp rename to GNN/OndselSolver/DispCompIeqctJeqcO.cpp diff --git a/OndselSolver/DispCompIeqctJeqcO.h b/GNN/OndselSolver/DispCompIeqctJeqcO.h similarity index 100% rename from OndselSolver/DispCompIeqctJeqcO.h rename to GNN/OndselSolver/DispCompIeqctJeqcO.h diff --git a/OndselSolver/DistIecJec.cpp b/GNN/OndselSolver/DistIecJec.cpp similarity index 100% rename from OndselSolver/DistIecJec.cpp rename to GNN/OndselSolver/DistIecJec.cpp diff --git a/OndselSolver/DistIecJec.h b/GNN/OndselSolver/DistIecJec.h similarity index 100% rename from OndselSolver/DistIecJec.h rename to GNN/OndselSolver/DistIecJec.h diff --git a/OndselSolver/DistIeqcJec.cpp b/GNN/OndselSolver/DistIeqcJec.cpp similarity index 100% rename from OndselSolver/DistIeqcJec.cpp rename to GNN/OndselSolver/DistIeqcJec.cpp diff --git a/OndselSolver/DistIeqcJec.h b/GNN/OndselSolver/DistIeqcJec.h similarity index 100% rename from OndselSolver/DistIeqcJec.h rename to GNN/OndselSolver/DistIeqcJec.h diff --git a/OndselSolver/DistIeqcJeqc.cpp b/GNN/OndselSolver/DistIeqcJeqc.cpp similarity index 100% rename from OndselSolver/DistIeqcJeqc.cpp rename to GNN/OndselSolver/DistIeqcJeqc.cpp diff --git a/OndselSolver/DistIeqcJeqc.h b/GNN/OndselSolver/DistIeqcJeqc.h similarity index 100% rename from OndselSolver/DistIeqcJeqc.h rename to GNN/OndselSolver/DistIeqcJeqc.h diff --git a/OndselSolver/DistIeqctJeqc.cpp b/GNN/OndselSolver/DistIeqctJeqc.cpp similarity index 100% rename from OndselSolver/DistIeqctJeqc.cpp rename to GNN/OndselSolver/DistIeqctJeqc.cpp diff --git a/OndselSolver/DistIeqctJeqc.h b/GNN/OndselSolver/DistIeqctJeqc.h similarity index 100% rename from OndselSolver/DistIeqctJeqc.h rename to GNN/OndselSolver/DistIeqctJeqc.h diff --git a/OndselSolver/DistanceConstraintIJ.cpp b/GNN/OndselSolver/DistanceConstraintIJ.cpp similarity index 100% rename from OndselSolver/DistanceConstraintIJ.cpp rename to GNN/OndselSolver/DistanceConstraintIJ.cpp diff --git a/OndselSolver/DistanceConstraintIJ.h b/GNN/OndselSolver/DistanceConstraintIJ.h similarity index 100% rename from OndselSolver/DistanceConstraintIJ.h rename to GNN/OndselSolver/DistanceConstraintIJ.h diff --git a/OndselSolver/DistanceConstraintIqcJc.cpp b/GNN/OndselSolver/DistanceConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/DistanceConstraintIqcJc.cpp rename to GNN/OndselSolver/DistanceConstraintIqcJc.cpp diff --git a/OndselSolver/DistanceConstraintIqcJc.h b/GNN/OndselSolver/DistanceConstraintIqcJc.h similarity index 100% rename from OndselSolver/DistanceConstraintIqcJc.h rename to GNN/OndselSolver/DistanceConstraintIqcJc.h diff --git a/OndselSolver/DistanceConstraintIqcJqc.cpp b/GNN/OndselSolver/DistanceConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/DistanceConstraintIqcJqc.cpp rename to GNN/OndselSolver/DistanceConstraintIqcJqc.cpp diff --git a/OndselSolver/DistanceConstraintIqcJqc.h b/GNN/OndselSolver/DistanceConstraintIqcJqc.h similarity index 100% rename from OndselSolver/DistanceConstraintIqcJqc.h rename to GNN/OndselSolver/DistanceConstraintIqcJqc.h diff --git a/OndselSolver/DistanceConstraintIqctJqc.cpp b/GNN/OndselSolver/DistanceConstraintIqctJqc.cpp similarity index 100% rename from OndselSolver/DistanceConstraintIqctJqc.cpp rename to GNN/OndselSolver/DistanceConstraintIqctJqc.cpp diff --git a/OndselSolver/DistanceConstraintIqctJqc.h b/GNN/OndselSolver/DistanceConstraintIqctJqc.h similarity index 100% rename from OndselSolver/DistanceConstraintIqctJqc.h rename to GNN/OndselSolver/DistanceConstraintIqctJqc.h diff --git a/OndselSolver/DistancexyConstraintIJ.cpp b/GNN/OndselSolver/DistancexyConstraintIJ.cpp similarity index 100% rename from OndselSolver/DistancexyConstraintIJ.cpp rename to GNN/OndselSolver/DistancexyConstraintIJ.cpp diff --git a/OndselSolver/DistancexyConstraintIJ.h b/GNN/OndselSolver/DistancexyConstraintIJ.h similarity index 100% rename from OndselSolver/DistancexyConstraintIJ.h rename to GNN/OndselSolver/DistancexyConstraintIJ.h diff --git a/OndselSolver/DistancexyConstraintIqcJc.cpp b/GNN/OndselSolver/DistancexyConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/DistancexyConstraintIqcJc.cpp rename to GNN/OndselSolver/DistancexyConstraintIqcJc.cpp diff --git a/OndselSolver/DistancexyConstraintIqcJc.h b/GNN/OndselSolver/DistancexyConstraintIqcJc.h similarity index 100% rename from OndselSolver/DistancexyConstraintIqcJc.h rename to GNN/OndselSolver/DistancexyConstraintIqcJc.h diff --git a/OndselSolver/DistancexyConstraintIqcJqc.cpp b/GNN/OndselSolver/DistancexyConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/DistancexyConstraintIqcJqc.cpp rename to GNN/OndselSolver/DistancexyConstraintIqcJqc.cpp diff --git a/OndselSolver/DistancexyConstraintIqcJqc.h b/GNN/OndselSolver/DistancexyConstraintIqcJqc.h similarity index 100% rename from OndselSolver/DistancexyConstraintIqcJqc.h rename to GNN/OndselSolver/DistancexyConstraintIqcJqc.h diff --git a/OndselSolver/DistxyIecJec.cpp b/GNN/OndselSolver/DistxyIecJec.cpp similarity index 100% rename from OndselSolver/DistxyIecJec.cpp rename to GNN/OndselSolver/DistxyIecJec.cpp diff --git a/OndselSolver/DistxyIecJec.h b/GNN/OndselSolver/DistxyIecJec.h similarity index 100% rename from OndselSolver/DistxyIecJec.h rename to GNN/OndselSolver/DistxyIecJec.h diff --git a/OndselSolver/DistxyIeqcJec.cpp b/GNN/OndselSolver/DistxyIeqcJec.cpp similarity index 100% rename from OndselSolver/DistxyIeqcJec.cpp rename to GNN/OndselSolver/DistxyIeqcJec.cpp diff --git a/OndselSolver/DistxyIeqcJec.h b/GNN/OndselSolver/DistxyIeqcJec.h similarity index 100% rename from OndselSolver/DistxyIeqcJec.h rename to GNN/OndselSolver/DistxyIeqcJec.h diff --git a/OndselSolver/DistxyIeqcJeqc.cpp b/GNN/OndselSolver/DistxyIeqcJeqc.cpp similarity index 100% rename from OndselSolver/DistxyIeqcJeqc.cpp rename to GNN/OndselSolver/DistxyIeqcJeqc.cpp diff --git a/OndselSolver/DistxyIeqcJeqc.h b/GNN/OndselSolver/DistxyIeqcJeqc.h similarity index 100% rename from OndselSolver/DistxyIeqcJeqc.h rename to GNN/OndselSolver/DistxyIeqcJeqc.h diff --git a/OndselSolver/DistxyIeqctJeqc.cpp b/GNN/OndselSolver/DistxyIeqctJeqc.cpp similarity index 100% rename from OndselSolver/DistxyIeqctJeqc.cpp rename to GNN/OndselSolver/DistxyIeqctJeqc.cpp diff --git a/OndselSolver/DistxyIeqctJeqc.h b/GNN/OndselSolver/DistxyIeqctJeqc.h similarity index 100% rename from OndselSolver/DistxyIeqctJeqc.h rename to GNN/OndselSolver/DistxyIeqctJeqc.h diff --git a/OndselSolver/EigenDecomposition.cpp b/GNN/OndselSolver/EigenDecomposition.cpp similarity index 100% rename from OndselSolver/EigenDecomposition.cpp rename to GNN/OndselSolver/EigenDecomposition.cpp diff --git a/OndselSolver/EigenDecomposition.h b/GNN/OndselSolver/EigenDecomposition.h similarity index 100% rename from OndselSolver/EigenDecomposition.h rename to GNN/OndselSolver/EigenDecomposition.h diff --git a/OndselSolver/EndFramec.cpp b/GNN/OndselSolver/EndFramec.cpp similarity index 100% rename from OndselSolver/EndFramec.cpp rename to GNN/OndselSolver/EndFramec.cpp diff --git a/OndselSolver/EndFramec.h b/GNN/OndselSolver/EndFramec.h similarity index 100% rename from OndselSolver/EndFramec.h rename to GNN/OndselSolver/EndFramec.h diff --git a/OndselSolver/EndFrameqc.cpp b/GNN/OndselSolver/EndFrameqc.cpp similarity index 100% rename from OndselSolver/EndFrameqc.cpp rename to GNN/OndselSolver/EndFrameqc.cpp diff --git a/OndselSolver/EndFrameqc.h b/GNN/OndselSolver/EndFrameqc.h similarity index 100% rename from OndselSolver/EndFrameqc.h rename to GNN/OndselSolver/EndFrameqc.h diff --git a/OndselSolver/EndFrameqct.cpp b/GNN/OndselSolver/EndFrameqct.cpp similarity index 100% rename from OndselSolver/EndFrameqct.cpp rename to GNN/OndselSolver/EndFrameqct.cpp diff --git a/OndselSolver/EndFrameqct.h b/GNN/OndselSolver/EndFrameqct.h similarity index 100% rename from OndselSolver/EndFrameqct.h rename to GNN/OndselSolver/EndFrameqct.h diff --git a/OndselSolver/EndFrameqct2.cpp b/GNN/OndselSolver/EndFrameqct2.cpp similarity index 100% rename from OndselSolver/EndFrameqct2.cpp rename to GNN/OndselSolver/EndFrameqct2.cpp diff --git a/OndselSolver/EndFrameqct2.h b/GNN/OndselSolver/EndFrameqct2.h similarity index 100% rename from OndselSolver/EndFrameqct2.h rename to GNN/OndselSolver/EndFrameqct2.h diff --git a/OndselSolver/EulerAngles.cpp b/GNN/OndselSolver/EulerAngles.cpp similarity index 100% rename from OndselSolver/EulerAngles.cpp rename to GNN/OndselSolver/EulerAngles.cpp diff --git a/OndselSolver/EulerAngles.h b/GNN/OndselSolver/EulerAngles.h similarity index 100% rename from OndselSolver/EulerAngles.h rename to GNN/OndselSolver/EulerAngles.h diff --git a/OndselSolver/EulerAnglesDDot.cpp b/GNN/OndselSolver/EulerAnglesDDot.cpp similarity index 100% rename from OndselSolver/EulerAnglesDDot.cpp rename to GNN/OndselSolver/EulerAnglesDDot.cpp diff --git a/OndselSolver/EulerAnglesDDot.h b/GNN/OndselSolver/EulerAnglesDDot.h similarity index 100% rename from OndselSolver/EulerAnglesDDot.h rename to GNN/OndselSolver/EulerAnglesDDot.h diff --git a/OndselSolver/EulerAnglesDot.cpp b/GNN/OndselSolver/EulerAnglesDot.cpp similarity index 100% rename from OndselSolver/EulerAnglesDot.cpp rename to GNN/OndselSolver/EulerAnglesDot.cpp diff --git a/OndselSolver/EulerAnglesDot.h b/GNN/OndselSolver/EulerAnglesDot.h similarity index 100% rename from OndselSolver/EulerAnglesDot.h rename to GNN/OndselSolver/EulerAnglesDot.h diff --git a/OndselSolver/EulerAngleszxz.cpp b/GNN/OndselSolver/EulerAngleszxz.cpp similarity index 100% rename from OndselSolver/EulerAngleszxz.cpp rename to GNN/OndselSolver/EulerAngleszxz.cpp diff --git a/OndselSolver/EulerAngleszxz.h b/GNN/OndselSolver/EulerAngleszxz.h similarity index 100% rename from OndselSolver/EulerAngleszxz.h rename to GNN/OndselSolver/EulerAngleszxz.h diff --git a/OndselSolver/EulerAngleszxzDDot.cpp b/GNN/OndselSolver/EulerAngleszxzDDot.cpp similarity index 100% rename from OndselSolver/EulerAngleszxzDDot.cpp rename to GNN/OndselSolver/EulerAngleszxzDDot.cpp diff --git a/OndselSolver/EulerAngleszxzDDot.h b/GNN/OndselSolver/EulerAngleszxzDDot.h similarity index 100% rename from OndselSolver/EulerAngleszxzDDot.h rename to GNN/OndselSolver/EulerAngleszxzDDot.h diff --git a/OndselSolver/EulerAngleszxzDot.cpp b/GNN/OndselSolver/EulerAngleszxzDot.cpp similarity index 100% rename from OndselSolver/EulerAngleszxzDot.cpp rename to GNN/OndselSolver/EulerAngleszxzDot.cpp diff --git a/OndselSolver/EulerAngleszxzDot.h b/GNN/OndselSolver/EulerAngleszxzDot.h similarity index 100% rename from OndselSolver/EulerAngleszxzDot.h rename to GNN/OndselSolver/EulerAngleszxzDot.h diff --git a/OndselSolver/EulerArray.cpp b/GNN/OndselSolver/EulerArray.cpp similarity index 100% rename from OndselSolver/EulerArray.cpp rename to GNN/OndselSolver/EulerArray.cpp diff --git a/OndselSolver/EulerArray.h b/GNN/OndselSolver/EulerArray.h similarity index 100% rename from OndselSolver/EulerArray.h rename to GNN/OndselSolver/EulerArray.h diff --git a/OndselSolver/EulerConstraint.cpp b/GNN/OndselSolver/EulerConstraint.cpp similarity index 100% rename from OndselSolver/EulerConstraint.cpp rename to GNN/OndselSolver/EulerConstraint.cpp diff --git a/OndselSolver/EulerConstraint.h b/GNN/OndselSolver/EulerConstraint.h similarity index 100% rename from OndselSolver/EulerConstraint.h rename to GNN/OndselSolver/EulerConstraint.h diff --git a/OndselSolver/EulerParameters.cpp b/GNN/OndselSolver/EulerParameters.cpp similarity index 100% rename from OndselSolver/EulerParameters.cpp rename to GNN/OndselSolver/EulerParameters.cpp diff --git a/OndselSolver/EulerParameters.h b/GNN/OndselSolver/EulerParameters.h similarity index 100% rename from OndselSolver/EulerParameters.h rename to GNN/OndselSolver/EulerParameters.h diff --git a/OndselSolver/EulerParametersDDot.cpp b/GNN/OndselSolver/EulerParametersDDot.cpp similarity index 100% rename from OndselSolver/EulerParametersDDot.cpp rename to GNN/OndselSolver/EulerParametersDDot.cpp diff --git a/OndselSolver/EulerParametersDDot.h b/GNN/OndselSolver/EulerParametersDDot.h similarity index 100% rename from OndselSolver/EulerParametersDDot.h rename to GNN/OndselSolver/EulerParametersDDot.h diff --git a/OndselSolver/EulerParametersDot.cpp b/GNN/OndselSolver/EulerParametersDot.cpp similarity index 100% rename from OndselSolver/EulerParametersDot.cpp rename to GNN/OndselSolver/EulerParametersDot.cpp diff --git a/OndselSolver/EulerParametersDot.h b/GNN/OndselSolver/EulerParametersDot.h similarity index 100% rename from OndselSolver/EulerParametersDot.h rename to GNN/OndselSolver/EulerParametersDot.h diff --git a/OndselSolver/Exponential.cpp b/GNN/OndselSolver/Exponential.cpp similarity index 100% rename from OndselSolver/Exponential.cpp rename to GNN/OndselSolver/Exponential.cpp diff --git a/OndselSolver/Exponential.h b/GNN/OndselSolver/Exponential.h similarity index 100% rename from OndselSolver/Exponential.h rename to GNN/OndselSolver/Exponential.h diff --git a/OndselSolver/ExpressionX.cpp b/GNN/OndselSolver/ExpressionX.cpp similarity index 100% rename from OndselSolver/ExpressionX.cpp rename to GNN/OndselSolver/ExpressionX.cpp diff --git a/OndselSolver/ExpressionX.h b/GNN/OndselSolver/ExpressionX.h similarity index 100% rename from OndselSolver/ExpressionX.h rename to GNN/OndselSolver/ExpressionX.h diff --git a/OndselSolver/ExternalSystem.cpp b/GNN/OndselSolver/ExternalSystem.cpp similarity index 100% rename from OndselSolver/ExternalSystem.cpp rename to GNN/OndselSolver/ExternalSystem.cpp diff --git a/OndselSolver/ExternalSystem.h b/GNN/OndselSolver/ExternalSystem.h similarity index 100% rename from OndselSolver/ExternalSystem.h rename to GNN/OndselSolver/ExternalSystem.h diff --git a/OndselSolver/FixedJoint.cpp b/GNN/OndselSolver/FixedJoint.cpp similarity index 100% rename from OndselSolver/FixedJoint.cpp rename to GNN/OndselSolver/FixedJoint.cpp diff --git a/OndselSolver/FixedJoint.h b/GNN/OndselSolver/FixedJoint.h similarity index 100% rename from OndselSolver/FixedJoint.h rename to GNN/OndselSolver/FixedJoint.h diff --git a/OndselSolver/ForceTorqueData.cpp b/GNN/OndselSolver/ForceTorqueData.cpp similarity index 100% rename from OndselSolver/ForceTorqueData.cpp rename to GNN/OndselSolver/ForceTorqueData.cpp diff --git a/OndselSolver/ForceTorqueData.h b/GNN/OndselSolver/ForceTorqueData.h similarity index 100% rename from OndselSolver/ForceTorqueData.h rename to GNN/OndselSolver/ForceTorqueData.h diff --git a/OndselSolver/ForceTorqueItem.cpp b/GNN/OndselSolver/ForceTorqueItem.cpp similarity index 100% rename from OndselSolver/ForceTorqueItem.cpp rename to GNN/OndselSolver/ForceTorqueItem.cpp diff --git a/OndselSolver/ForceTorqueItem.h b/GNN/OndselSolver/ForceTorqueItem.h similarity index 100% rename from OndselSolver/ForceTorqueItem.h rename to GNN/OndselSolver/ForceTorqueItem.h diff --git a/OndselSolver/FullColumn.cpp b/GNN/OndselSolver/FullColumn.cpp similarity index 100% rename from OndselSolver/FullColumn.cpp rename to GNN/OndselSolver/FullColumn.cpp diff --git a/OndselSolver/FullColumn.h b/GNN/OndselSolver/FullColumn.h similarity index 100% rename from OndselSolver/FullColumn.h rename to GNN/OndselSolver/FullColumn.h diff --git a/OndselSolver/FullMatrix.cpp b/GNN/OndselSolver/FullMatrix.cpp similarity index 100% rename from OndselSolver/FullMatrix.cpp rename to GNN/OndselSolver/FullMatrix.cpp diff --git a/OndselSolver/FullMatrix.h b/GNN/OndselSolver/FullMatrix.h similarity index 100% rename from OndselSolver/FullMatrix.h rename to GNN/OndselSolver/FullMatrix.h diff --git a/OndselSolver/FullMotion.cpp b/GNN/OndselSolver/FullMotion.cpp similarity index 100% rename from OndselSolver/FullMotion.cpp rename to GNN/OndselSolver/FullMotion.cpp diff --git a/OndselSolver/FullMotion.h b/GNN/OndselSolver/FullMotion.h similarity index 100% rename from OndselSolver/FullMotion.h rename to GNN/OndselSolver/FullMotion.h diff --git a/OndselSolver/FullRow.cpp b/GNN/OndselSolver/FullRow.cpp similarity index 100% rename from OndselSolver/FullRow.cpp rename to GNN/OndselSolver/FullRow.cpp diff --git a/OndselSolver/FullRow.h b/GNN/OndselSolver/FullRow.h similarity index 100% rename from OndselSolver/FullRow.h rename to GNN/OndselSolver/FullRow.h diff --git a/OndselSolver/FullVector.cpp b/GNN/OndselSolver/FullVector.cpp similarity index 100% rename from OndselSolver/FullVector.cpp rename to GNN/OndselSolver/FullVector.cpp diff --git a/OndselSolver/FullVector.h b/GNN/OndselSolver/FullVector.h similarity index 100% rename from OndselSolver/FullVector.h rename to GNN/OndselSolver/FullVector.h diff --git a/OndselSolver/Function.cpp b/GNN/OndselSolver/Function.cpp similarity index 100% rename from OndselSolver/Function.cpp rename to GNN/OndselSolver/Function.cpp diff --git a/OndselSolver/Function.h b/GNN/OndselSolver/Function.h similarity index 100% rename from OndselSolver/Function.h rename to GNN/OndselSolver/Function.h diff --git a/OndselSolver/FunctionFromData.cpp b/GNN/OndselSolver/FunctionFromData.cpp similarity index 100% rename from OndselSolver/FunctionFromData.cpp rename to GNN/OndselSolver/FunctionFromData.cpp diff --git a/OndselSolver/FunctionFromData.h b/GNN/OndselSolver/FunctionFromData.h similarity index 100% rename from OndselSolver/FunctionFromData.h rename to GNN/OndselSolver/FunctionFromData.h diff --git a/OndselSolver/FunctionWithManyArgs.cpp b/GNN/OndselSolver/FunctionWithManyArgs.cpp similarity index 100% rename from OndselSolver/FunctionWithManyArgs.cpp rename to GNN/OndselSolver/FunctionWithManyArgs.cpp diff --git a/OndselSolver/FunctionWithManyArgs.h b/GNN/OndselSolver/FunctionWithManyArgs.h similarity index 100% rename from OndselSolver/FunctionWithManyArgs.h rename to GNN/OndselSolver/FunctionWithManyArgs.h diff --git a/OndselSolver/FunctionX.cpp b/GNN/OndselSolver/FunctionX.cpp similarity index 100% rename from OndselSolver/FunctionX.cpp rename to GNN/OndselSolver/FunctionX.cpp diff --git a/OndselSolver/FunctionX.h b/GNN/OndselSolver/FunctionX.h similarity index 100% rename from OndselSolver/FunctionX.h rename to GNN/OndselSolver/FunctionX.h diff --git a/OndselSolver/FunctionXY.cpp b/GNN/OndselSolver/FunctionXY.cpp similarity index 100% rename from OndselSolver/FunctionXY.cpp rename to GNN/OndselSolver/FunctionXY.cpp diff --git a/OndselSolver/FunctionXY.h b/GNN/OndselSolver/FunctionXY.h similarity index 100% rename from OndselSolver/FunctionXY.h rename to GNN/OndselSolver/FunctionXY.h diff --git a/OndselSolver/FunctionXcParameter.cpp b/GNN/OndselSolver/FunctionXcParameter.cpp similarity index 100% rename from OndselSolver/FunctionXcParameter.cpp rename to GNN/OndselSolver/FunctionXcParameter.cpp diff --git a/OndselSolver/FunctionXcParameter.h b/GNN/OndselSolver/FunctionXcParameter.h similarity index 100% rename from OndselSolver/FunctionXcParameter.h rename to GNN/OndselSolver/FunctionXcParameter.h diff --git a/OndselSolver/Functions.cpp b/GNN/OndselSolver/Functions.cpp similarity index 100% rename from OndselSolver/Functions.cpp rename to GNN/OndselSolver/Functions.cpp diff --git a/OndselSolver/Functions.h b/GNN/OndselSolver/Functions.h similarity index 100% rename from OndselSolver/Functions.h rename to GNN/OndselSolver/Functions.h diff --git a/OndselSolver/GEFullMat.cpp b/GNN/OndselSolver/GEFullMat.cpp similarity index 100% rename from OndselSolver/GEFullMat.cpp rename to GNN/OndselSolver/GEFullMat.cpp diff --git a/OndselSolver/GEFullMat.h b/GNN/OndselSolver/GEFullMat.h similarity index 100% rename from OndselSolver/GEFullMat.h rename to GNN/OndselSolver/GEFullMat.h diff --git a/OndselSolver/GEFullMatFullPv.cpp b/GNN/OndselSolver/GEFullMatFullPv.cpp similarity index 100% rename from OndselSolver/GEFullMatFullPv.cpp rename to GNN/OndselSolver/GEFullMatFullPv.cpp diff --git a/OndselSolver/GEFullMatFullPv.h b/GNN/OndselSolver/GEFullMatFullPv.h similarity index 100% rename from OndselSolver/GEFullMatFullPv.h rename to GNN/OndselSolver/GEFullMatFullPv.h diff --git a/OndselSolver/GEFullMatParPv.cpp b/GNN/OndselSolver/GEFullMatParPv.cpp similarity index 100% rename from OndselSolver/GEFullMatParPv.cpp rename to GNN/OndselSolver/GEFullMatParPv.cpp diff --git a/OndselSolver/GEFullMatParPv.h b/GNN/OndselSolver/GEFullMatParPv.h similarity index 100% rename from OndselSolver/GEFullMatParPv.h rename to GNN/OndselSolver/GEFullMatParPv.h diff --git a/OndselSolver/GESpMat.cpp b/GNN/OndselSolver/GESpMat.cpp similarity index 100% rename from OndselSolver/GESpMat.cpp rename to GNN/OndselSolver/GESpMat.cpp diff --git a/OndselSolver/GESpMat.h b/GNN/OndselSolver/GESpMat.h similarity index 100% rename from OndselSolver/GESpMat.h rename to GNN/OndselSolver/GESpMat.h diff --git a/OndselSolver/GESpMatFullPv.cpp b/GNN/OndselSolver/GESpMatFullPv.cpp similarity index 100% rename from OndselSolver/GESpMatFullPv.cpp rename to GNN/OndselSolver/GESpMatFullPv.cpp diff --git a/OndselSolver/GESpMatFullPv.h b/GNN/OndselSolver/GESpMatFullPv.h similarity index 100% rename from OndselSolver/GESpMatFullPv.h rename to GNN/OndselSolver/GESpMatFullPv.h diff --git a/OndselSolver/GESpMatFullPvPosIC.cpp b/GNN/OndselSolver/GESpMatFullPvPosIC.cpp similarity index 100% rename from OndselSolver/GESpMatFullPvPosIC.cpp rename to GNN/OndselSolver/GESpMatFullPvPosIC.cpp diff --git a/OndselSolver/GESpMatFullPvPosIC.h b/GNN/OndselSolver/GESpMatFullPvPosIC.h similarity index 100% rename from OndselSolver/GESpMatFullPvPosIC.h rename to GNN/OndselSolver/GESpMatFullPvPosIC.h diff --git a/OndselSolver/GESpMatParPv.cpp b/GNN/OndselSolver/GESpMatParPv.cpp similarity index 100% rename from OndselSolver/GESpMatParPv.cpp rename to GNN/OndselSolver/GESpMatParPv.cpp diff --git a/OndselSolver/GESpMatParPv.h b/GNN/OndselSolver/GESpMatParPv.h similarity index 100% rename from OndselSolver/GESpMatParPv.h rename to GNN/OndselSolver/GESpMatParPv.h diff --git a/OndselSolver/GESpMatParPvMarko.cpp b/GNN/OndselSolver/GESpMatParPvMarko.cpp similarity index 100% rename from OndselSolver/GESpMatParPvMarko.cpp rename to GNN/OndselSolver/GESpMatParPvMarko.cpp diff --git a/OndselSolver/GESpMatParPvMarko.h b/GNN/OndselSolver/GESpMatParPvMarko.h similarity index 100% rename from OndselSolver/GESpMatParPvMarko.h rename to GNN/OndselSolver/GESpMatParPvMarko.h diff --git a/OndselSolver/GESpMatParPvMarkoFast.cpp b/GNN/OndselSolver/GESpMatParPvMarkoFast.cpp similarity index 100% rename from OndselSolver/GESpMatParPvMarkoFast.cpp rename to GNN/OndselSolver/GESpMatParPvMarkoFast.cpp diff --git a/OndselSolver/GESpMatParPvMarkoFast.h b/GNN/OndselSolver/GESpMatParPvMarkoFast.h similarity index 100% rename from OndselSolver/GESpMatParPvMarkoFast.h rename to GNN/OndselSolver/GESpMatParPvMarkoFast.h diff --git a/OndselSolver/GESpMatParPvPrecise.cpp b/GNN/OndselSolver/GESpMatParPvPrecise.cpp similarity index 100% rename from OndselSolver/GESpMatParPvPrecise.cpp rename to GNN/OndselSolver/GESpMatParPvPrecise.cpp diff --git a/OndselSolver/GESpMatParPvPrecise.h b/GNN/OndselSolver/GESpMatParPvPrecise.h similarity index 100% rename from OndselSolver/GESpMatParPvPrecise.h rename to GNN/OndselSolver/GESpMatParPvPrecise.h diff --git a/OndselSolver/GearConstraintIJ.cpp b/GNN/OndselSolver/GearConstraintIJ.cpp similarity index 100% rename from OndselSolver/GearConstraintIJ.cpp rename to GNN/OndselSolver/GearConstraintIJ.cpp diff --git a/OndselSolver/GearConstraintIJ.h b/GNN/OndselSolver/GearConstraintIJ.h similarity index 100% rename from OndselSolver/GearConstraintIJ.h rename to GNN/OndselSolver/GearConstraintIJ.h diff --git a/OndselSolver/GearConstraintIqcJc.cpp b/GNN/OndselSolver/GearConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/GearConstraintIqcJc.cpp rename to GNN/OndselSolver/GearConstraintIqcJc.cpp diff --git a/OndselSolver/GearConstraintIqcJc.h b/GNN/OndselSolver/GearConstraintIqcJc.h similarity index 100% rename from OndselSolver/GearConstraintIqcJc.h rename to GNN/OndselSolver/GearConstraintIqcJc.h diff --git a/OndselSolver/GearConstraintIqcJqc.cpp b/GNN/OndselSolver/GearConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/GearConstraintIqcJqc.cpp rename to GNN/OndselSolver/GearConstraintIqcJqc.cpp diff --git a/OndselSolver/GearConstraintIqcJqc.h b/GNN/OndselSolver/GearConstraintIqcJqc.h similarity index 100% rename from OndselSolver/GearConstraintIqcJqc.h rename to GNN/OndselSolver/GearConstraintIqcJqc.h diff --git a/OndselSolver/GearJoint.cpp b/GNN/OndselSolver/GearJoint.cpp similarity index 100% rename from OndselSolver/GearJoint.cpp rename to GNN/OndselSolver/GearJoint.cpp diff --git a/OndselSolver/GearJoint.h b/GNN/OndselSolver/GearJoint.h similarity index 100% rename from OndselSolver/GearJoint.h rename to GNN/OndselSolver/GearJoint.h diff --git a/OndselSolver/GeneralSpline.cpp b/GNN/OndselSolver/GeneralSpline.cpp similarity index 100% rename from OndselSolver/GeneralSpline.cpp rename to GNN/OndselSolver/GeneralSpline.cpp diff --git a/OndselSolver/GeneralSpline.h b/GNN/OndselSolver/GeneralSpline.h similarity index 100% rename from OndselSolver/GeneralSpline.h rename to GNN/OndselSolver/GeneralSpline.h diff --git a/OndselSolver/ICKineIntegrator.cpp b/GNN/OndselSolver/ICKineIntegrator.cpp similarity index 100% rename from OndselSolver/ICKineIntegrator.cpp rename to GNN/OndselSolver/ICKineIntegrator.cpp diff --git a/OndselSolver/ICKineIntegrator.h b/GNN/OndselSolver/ICKineIntegrator.h similarity index 100% rename from OndselSolver/ICKineIntegrator.h rename to GNN/OndselSolver/ICKineIntegrator.h diff --git a/OndselSolver/InLineJoint.cpp b/GNN/OndselSolver/InLineJoint.cpp similarity index 100% rename from OndselSolver/InLineJoint.cpp rename to GNN/OndselSolver/InLineJoint.cpp diff --git a/OndselSolver/InLineJoint.h b/GNN/OndselSolver/InLineJoint.h similarity index 100% rename from OndselSolver/InLineJoint.h rename to GNN/OndselSolver/InLineJoint.h diff --git a/OndselSolver/InPlaneJoint.cpp b/GNN/OndselSolver/InPlaneJoint.cpp similarity index 100% rename from OndselSolver/InPlaneJoint.cpp rename to GNN/OndselSolver/InPlaneJoint.cpp diff --git a/OndselSolver/InPlaneJoint.h b/GNN/OndselSolver/InPlaneJoint.h similarity index 100% rename from OndselSolver/InPlaneJoint.h rename to GNN/OndselSolver/InPlaneJoint.h diff --git a/OndselSolver/IndependentVariable.cpp b/GNN/OndselSolver/IndependentVariable.cpp similarity index 100% rename from OndselSolver/IndependentVariable.cpp rename to GNN/OndselSolver/IndependentVariable.cpp diff --git a/OndselSolver/IndependentVariable.h b/GNN/OndselSolver/IndependentVariable.h similarity index 100% rename from OndselSolver/IndependentVariable.h rename to GNN/OndselSolver/IndependentVariable.h diff --git a/OndselSolver/Integral.cpp b/GNN/OndselSolver/Integral.cpp similarity index 100% rename from OndselSolver/Integral.cpp rename to GNN/OndselSolver/Integral.cpp diff --git a/OndselSolver/Integral.h b/GNN/OndselSolver/Integral.h similarity index 100% rename from OndselSolver/Integral.h rename to GNN/OndselSolver/Integral.h diff --git a/OndselSolver/Integrator.cpp b/GNN/OndselSolver/Integrator.cpp similarity index 100% rename from OndselSolver/Integrator.cpp rename to GNN/OndselSolver/Integrator.cpp diff --git a/OndselSolver/Integrator.h b/GNN/OndselSolver/Integrator.h similarity index 100% rename from OndselSolver/Integrator.h rename to GNN/OndselSolver/Integrator.h diff --git a/OndselSolver/IntegratorInterface.cpp b/GNN/OndselSolver/IntegratorInterface.cpp similarity index 100% rename from OndselSolver/IntegratorInterface.cpp rename to GNN/OndselSolver/IntegratorInterface.cpp diff --git a/OndselSolver/IntegratorInterface.h b/GNN/OndselSolver/IntegratorInterface.h similarity index 100% rename from OndselSolver/IntegratorInterface.h rename to GNN/OndselSolver/IntegratorInterface.h diff --git a/OndselSolver/Item.cpp b/GNN/OndselSolver/Item.cpp similarity index 100% rename from OndselSolver/Item.cpp rename to GNN/OndselSolver/Item.cpp diff --git a/OndselSolver/Item.h b/GNN/OndselSolver/Item.h similarity index 100% rename from OndselSolver/Item.h rename to GNN/OndselSolver/Item.h diff --git a/OndselSolver/ItemIJ.cpp b/GNN/OndselSolver/ItemIJ.cpp similarity index 100% rename from OndselSolver/ItemIJ.cpp rename to GNN/OndselSolver/ItemIJ.cpp diff --git a/OndselSolver/ItemIJ.h b/GNN/OndselSolver/ItemIJ.h similarity index 100% rename from OndselSolver/ItemIJ.h rename to GNN/OndselSolver/ItemIJ.h diff --git a/OndselSolver/Joint.cpp b/GNN/OndselSolver/Joint.cpp similarity index 100% rename from OndselSolver/Joint.cpp rename to GNN/OndselSolver/Joint.cpp diff --git a/OndselSolver/Joint.h b/GNN/OndselSolver/Joint.h similarity index 100% rename from OndselSolver/Joint.h rename to GNN/OndselSolver/Joint.h diff --git a/OndselSolver/KineIntegrator.cpp b/GNN/OndselSolver/KineIntegrator.cpp similarity index 100% rename from OndselSolver/KineIntegrator.cpp rename to GNN/OndselSolver/KineIntegrator.cpp diff --git a/OndselSolver/KineIntegrator.h b/GNN/OndselSolver/KineIntegrator.h similarity index 100% rename from OndselSolver/KineIntegrator.h rename to GNN/OndselSolver/KineIntegrator.h diff --git a/OndselSolver/KinematicIeJe.cpp b/GNN/OndselSolver/KinematicIeJe.cpp similarity index 100% rename from OndselSolver/KinematicIeJe.cpp rename to GNN/OndselSolver/KinematicIeJe.cpp diff --git a/OndselSolver/KinematicIeJe.h b/GNN/OndselSolver/KinematicIeJe.h similarity index 100% rename from OndselSolver/KinematicIeJe.h rename to GNN/OndselSolver/KinematicIeJe.h diff --git a/OndselSolver/LDUFullMat.cpp b/GNN/OndselSolver/LDUFullMat.cpp similarity index 100% rename from OndselSolver/LDUFullMat.cpp rename to GNN/OndselSolver/LDUFullMat.cpp diff --git a/OndselSolver/LDUFullMat.h b/GNN/OndselSolver/LDUFullMat.h similarity index 100% rename from OndselSolver/LDUFullMat.h rename to GNN/OndselSolver/LDUFullMat.h diff --git a/OndselSolver/LDUFullMatParPv.cpp b/GNN/OndselSolver/LDUFullMatParPv.cpp similarity index 100% rename from OndselSolver/LDUFullMatParPv.cpp rename to GNN/OndselSolver/LDUFullMatParPv.cpp diff --git a/OndselSolver/LDUFullMatParPv.h b/GNN/OndselSolver/LDUFullMatParPv.h similarity index 100% rename from OndselSolver/LDUFullMatParPv.h rename to GNN/OndselSolver/LDUFullMatParPv.h diff --git a/OndselSolver/LDUSpMat.cpp b/GNN/OndselSolver/LDUSpMat.cpp similarity index 100% rename from OndselSolver/LDUSpMat.cpp rename to GNN/OndselSolver/LDUSpMat.cpp diff --git a/OndselSolver/LDUSpMat.h b/GNN/OndselSolver/LDUSpMat.h similarity index 100% rename from OndselSolver/LDUSpMat.h rename to GNN/OndselSolver/LDUSpMat.h diff --git a/OndselSolver/LDUSpMatParPv.cpp b/GNN/OndselSolver/LDUSpMatParPv.cpp similarity index 100% rename from OndselSolver/LDUSpMatParPv.cpp rename to GNN/OndselSolver/LDUSpMatParPv.cpp diff --git a/OndselSolver/LDUSpMatParPv.h b/GNN/OndselSolver/LDUSpMatParPv.h similarity index 100% rename from OndselSolver/LDUSpMatParPv.h rename to GNN/OndselSolver/LDUSpMatParPv.h diff --git a/OndselSolver/LDUSpMatParPvMarko.cpp b/GNN/OndselSolver/LDUSpMatParPvMarko.cpp similarity index 100% rename from OndselSolver/LDUSpMatParPvMarko.cpp rename to GNN/OndselSolver/LDUSpMatParPvMarko.cpp diff --git a/OndselSolver/LDUSpMatParPvMarko.h b/GNN/OndselSolver/LDUSpMatParPvMarko.h similarity index 100% rename from OndselSolver/LDUSpMatParPvMarko.h rename to GNN/OndselSolver/LDUSpMatParPvMarko.h diff --git a/OndselSolver/LDUSpMatParPvPrecise.cpp b/GNN/OndselSolver/LDUSpMatParPvPrecise.cpp similarity index 100% rename from OndselSolver/LDUSpMatParPvPrecise.cpp rename to GNN/OndselSolver/LDUSpMatParPvPrecise.cpp diff --git a/OndselSolver/LDUSpMatParPvPrecise.h b/GNN/OndselSolver/LDUSpMatParPvPrecise.h similarity index 100% rename from OndselSolver/LDUSpMatParPvPrecise.h rename to GNN/OndselSolver/LDUSpMatParPvPrecise.h diff --git a/OndselSolver/LimitIJ.cpp b/GNN/OndselSolver/LimitIJ.cpp similarity index 100% rename from OndselSolver/LimitIJ.cpp rename to GNN/OndselSolver/LimitIJ.cpp diff --git a/OndselSolver/LimitIJ.h b/GNN/OndselSolver/LimitIJ.h similarity index 100% rename from OndselSolver/LimitIJ.h rename to GNN/OndselSolver/LimitIJ.h diff --git a/OndselSolver/LineInPlaneJoint.cpp b/GNN/OndselSolver/LineInPlaneJoint.cpp similarity index 100% rename from OndselSolver/LineInPlaneJoint.cpp rename to GNN/OndselSolver/LineInPlaneJoint.cpp diff --git a/OndselSolver/LineInPlaneJoint.h b/GNN/OndselSolver/LineInPlaneJoint.h similarity index 100% rename from OndselSolver/LineInPlaneJoint.h rename to GNN/OndselSolver/LineInPlaneJoint.h diff --git a/OndselSolver/LinearMultiStepMethod.cpp b/GNN/OndselSolver/LinearMultiStepMethod.cpp similarity index 100% rename from OndselSolver/LinearMultiStepMethod.cpp rename to GNN/OndselSolver/LinearMultiStepMethod.cpp diff --git a/OndselSolver/LinearMultiStepMethod.h b/GNN/OndselSolver/LinearMultiStepMethod.h similarity index 100% rename from OndselSolver/LinearMultiStepMethod.h rename to GNN/OndselSolver/LinearMultiStepMethod.h diff --git a/OndselSolver/Ln.cpp b/GNN/OndselSolver/Ln.cpp similarity index 100% rename from OndselSolver/Ln.cpp rename to GNN/OndselSolver/Ln.cpp diff --git a/OndselSolver/Ln.h b/GNN/OndselSolver/Ln.h similarity index 100% rename from OndselSolver/Ln.h rename to GNN/OndselSolver/Ln.h diff --git a/OndselSolver/Log10.cpp b/GNN/OndselSolver/Log10.cpp similarity index 100% rename from OndselSolver/Log10.cpp rename to GNN/OndselSolver/Log10.cpp diff --git a/OndselSolver/Log10.h b/GNN/OndselSolver/Log10.h similarity index 100% rename from OndselSolver/Log10.h rename to GNN/OndselSolver/Log10.h diff --git a/OndselSolver/LogN.cpp b/GNN/OndselSolver/LogN.cpp similarity index 100% rename from OndselSolver/LogN.cpp rename to GNN/OndselSolver/LogN.cpp diff --git a/OndselSolver/LogN.h b/GNN/OndselSolver/LogN.h similarity index 100% rename from OndselSolver/LogN.h rename to GNN/OndselSolver/LogN.h diff --git a/OndselSolver/MBDynCase.mov b/GNN/OndselSolver/MBDynCase.mov similarity index 100% rename from OndselSolver/MBDynCase.mov rename to GNN/OndselSolver/MBDynCase.mov diff --git a/OndselSolver/MBDynCase2.mbd b/GNN/OndselSolver/MBDynCase2.mbd similarity index 100% rename from OndselSolver/MBDynCase2.mbd rename to GNN/OndselSolver/MBDynCase2.mbd diff --git a/OndselSolver/MBDynCase2.mov b/GNN/OndselSolver/MBDynCase2.mov similarity index 100% rename from OndselSolver/MBDynCase2.mov rename to GNN/OndselSolver/MBDynCase2.mov diff --git a/OndselSolver/MBDynCase2orig.mbd b/GNN/OndselSolver/MBDynCase2orig.mbd similarity index 100% rename from OndselSolver/MBDynCase2orig.mbd rename to GNN/OndselSolver/MBDynCase2orig.mbd diff --git a/OndselSolver/MBDynCase2orig.mov b/GNN/OndselSolver/MBDynCase2orig.mov similarity index 100% rename from OndselSolver/MBDynCase2orig.mov rename to GNN/OndselSolver/MBDynCase2orig.mov diff --git a/OndselSolver/MBDynCaseDebug1.mbd b/GNN/OndselSolver/MBDynCaseDebug1.mbd similarity index 100% rename from OndselSolver/MBDynCaseDebug1.mbd rename to GNN/OndselSolver/MBDynCaseDebug1.mbd diff --git a/OndselSolver/MBDynCaseDebug1.mov b/GNN/OndselSolver/MBDynCaseDebug1.mov similarity index 100% rename from OndselSolver/MBDynCaseDebug1.mov rename to GNN/OndselSolver/MBDynCaseDebug1.mov diff --git a/OndselSolver/MBDynCaseDebug2.mbd b/GNN/OndselSolver/MBDynCaseDebug2.mbd similarity index 100% rename from OndselSolver/MBDynCaseDebug2.mbd rename to GNN/OndselSolver/MBDynCaseDebug2.mbd diff --git a/OndselSolver/MBDynCaseDebug2.mov b/GNN/OndselSolver/MBDynCaseDebug2.mov similarity index 100% rename from OndselSolver/MBDynCaseDebug2.mov rename to GNN/OndselSolver/MBDynCaseDebug2.mov diff --git a/OndselSolver/MarkerFrame.cpp b/GNN/OndselSolver/MarkerFrame.cpp similarity index 100% rename from OndselSolver/MarkerFrame.cpp rename to GNN/OndselSolver/MarkerFrame.cpp diff --git a/OndselSolver/MarkerFrame.h b/GNN/OndselSolver/MarkerFrame.h similarity index 100% rename from OndselSolver/MarkerFrame.h rename to GNN/OndselSolver/MarkerFrame.h diff --git a/OndselSolver/MatrixDecomposition.cpp b/GNN/OndselSolver/MatrixDecomposition.cpp similarity index 100% rename from OndselSolver/MatrixDecomposition.cpp rename to GNN/OndselSolver/MatrixDecomposition.cpp diff --git a/OndselSolver/MatrixDecomposition.h b/GNN/OndselSolver/MatrixDecomposition.h similarity index 100% rename from OndselSolver/MatrixDecomposition.h rename to GNN/OndselSolver/MatrixDecomposition.h diff --git a/OndselSolver/MatrixGaussElimination.cpp b/GNN/OndselSolver/MatrixGaussElimination.cpp similarity index 100% rename from OndselSolver/MatrixGaussElimination.cpp rename to GNN/OndselSolver/MatrixGaussElimination.cpp diff --git a/OndselSolver/MatrixGaussElimination.h b/GNN/OndselSolver/MatrixGaussElimination.h similarity index 100% rename from OndselSolver/MatrixGaussElimination.h rename to GNN/OndselSolver/MatrixGaussElimination.h diff --git a/OndselSolver/MatrixLDU.cpp b/GNN/OndselSolver/MatrixLDU.cpp similarity index 100% rename from OndselSolver/MatrixLDU.cpp rename to GNN/OndselSolver/MatrixLDU.cpp diff --git a/OndselSolver/MatrixLDU.h b/GNN/OndselSolver/MatrixLDU.h similarity index 100% rename from OndselSolver/MatrixLDU.h rename to GNN/OndselSolver/MatrixLDU.h diff --git a/OndselSolver/MatrixSolver.cpp b/GNN/OndselSolver/MatrixSolver.cpp similarity index 100% rename from OndselSolver/MatrixSolver.cpp rename to GNN/OndselSolver/MatrixSolver.cpp diff --git a/OndselSolver/MatrixSolver.h b/GNN/OndselSolver/MatrixSolver.h similarity index 100% rename from OndselSolver/MatrixSolver.h rename to GNN/OndselSolver/MatrixSolver.h diff --git a/OndselSolver/MaximumIterationError.cpp b/GNN/OndselSolver/MaximumIterationError.cpp similarity index 100% rename from OndselSolver/MaximumIterationError.cpp rename to GNN/OndselSolver/MaximumIterationError.cpp diff --git a/OndselSolver/MaximumIterationError.h b/GNN/OndselSolver/MaximumIterationError.h similarity index 100% rename from OndselSolver/MaximumIterationError.h rename to GNN/OndselSolver/MaximumIterationError.h diff --git a/OndselSolver/MbDMath.cpp b/GNN/OndselSolver/MbDMath.cpp similarity index 100% rename from OndselSolver/MbDMath.cpp rename to GNN/OndselSolver/MbDMath.cpp diff --git a/OndselSolver/MbDMath.h b/GNN/OndselSolver/MbDMath.h similarity index 100% rename from OndselSolver/MbDMath.h rename to GNN/OndselSolver/MbDMath.h diff --git a/OndselSolver/MomentOfInertiaSolver.cpp b/GNN/OndselSolver/MomentOfInertiaSolver.cpp similarity index 100% rename from OndselSolver/MomentOfInertiaSolver.cpp rename to GNN/OndselSolver/MomentOfInertiaSolver.cpp diff --git a/OndselSolver/MomentOfInertiaSolver.h b/GNN/OndselSolver/MomentOfInertiaSolver.h similarity index 100% rename from OndselSolver/MomentOfInertiaSolver.h rename to GNN/OndselSolver/MomentOfInertiaSolver.h diff --git a/OndselSolver/Negative.cpp b/GNN/OndselSolver/Negative.cpp similarity index 100% rename from OndselSolver/Negative.cpp rename to GNN/OndselSolver/Negative.cpp diff --git a/OndselSolver/Negative.h b/GNN/OndselSolver/Negative.h similarity index 100% rename from OndselSolver/Negative.h rename to GNN/OndselSolver/Negative.h diff --git a/OndselSolver/NewtonRaphson.cpp b/GNN/OndselSolver/NewtonRaphson.cpp similarity index 100% rename from OndselSolver/NewtonRaphson.cpp rename to GNN/OndselSolver/NewtonRaphson.cpp diff --git a/OndselSolver/NewtonRaphson.h b/GNN/OndselSolver/NewtonRaphson.h similarity index 100% rename from OndselSolver/NewtonRaphson.h rename to GNN/OndselSolver/NewtonRaphson.h diff --git a/OndselSolver/NewtonRaphsonError.cpp b/GNN/OndselSolver/NewtonRaphsonError.cpp similarity index 100% rename from OndselSolver/NewtonRaphsonError.cpp rename to GNN/OndselSolver/NewtonRaphsonError.cpp diff --git a/OndselSolver/NewtonRaphsonError.h b/GNN/OndselSolver/NewtonRaphsonError.h similarity index 100% rename from OndselSolver/NewtonRaphsonError.h rename to GNN/OndselSolver/NewtonRaphsonError.h diff --git a/OndselSolver/NoRotationJoint.cpp b/GNN/OndselSolver/NoRotationJoint.cpp similarity index 100% rename from OndselSolver/NoRotationJoint.cpp rename to GNN/OndselSolver/NoRotationJoint.cpp diff --git a/OndselSolver/NoRotationJoint.h b/GNN/OndselSolver/NoRotationJoint.h similarity index 100% rename from OndselSolver/NoRotationJoint.h rename to GNN/OndselSolver/NoRotationJoint.h diff --git a/OndselSolver/NotKinematicError.cpp b/GNN/OndselSolver/NotKinematicError.cpp similarity index 100% rename from OndselSolver/NotKinematicError.cpp rename to GNN/OndselSolver/NotKinematicError.cpp diff --git a/OndselSolver/NotKinematicError.h b/GNN/OndselSolver/NotKinematicError.h similarity index 100% rename from OndselSolver/NotKinematicError.h rename to GNN/OndselSolver/NotKinematicError.h diff --git a/OndselSolver/Numeric.cpp b/GNN/OndselSolver/Numeric.cpp similarity index 100% rename from OndselSolver/Numeric.cpp rename to GNN/OndselSolver/Numeric.cpp diff --git a/OndselSolver/Numeric.h b/GNN/OndselSolver/Numeric.h similarity index 100% rename from OndselSolver/Numeric.h rename to GNN/OndselSolver/Numeric.h diff --git a/OndselSolver/OndselSolver.aps b/GNN/OndselSolver/OndselSolver.aps similarity index 100% rename from OndselSolver/OndselSolver.aps rename to GNN/OndselSolver/OndselSolver.aps diff --git a/OndselSolver/OndselSolver.rc b/GNN/OndselSolver/OndselSolver.rc similarity index 100% rename from OndselSolver/OndselSolver.rc rename to GNN/OndselSolver/OndselSolver.rc diff --git a/OndselSolver/OndselSolver.vcxproj b/GNN/OndselSolver/OndselSolver.vcxproj similarity index 100% rename from OndselSolver/OndselSolver.vcxproj rename to GNN/OndselSolver/OndselSolver.vcxproj diff --git a/OndselSolver/OndselSolver.vcxproj.filters b/GNN/OndselSolver/OndselSolver.vcxproj.filters similarity index 100% rename from OndselSolver/OndselSolver.vcxproj.filters rename to GNN/OndselSolver/OndselSolver.vcxproj.filters diff --git a/OndselSolver/OndselSolver.vcxproj.user b/GNN/OndselSolver/OndselSolver.vcxproj.user similarity index 100% rename from OndselSolver/OndselSolver.vcxproj.user rename to GNN/OndselSolver/OndselSolver.vcxproj.user diff --git a/OndselSolver/OrbitAngleZIecJec.cpp b/GNN/OndselSolver/OrbitAngleZIecJec.cpp similarity index 100% rename from OndselSolver/OrbitAngleZIecJec.cpp rename to GNN/OndselSolver/OrbitAngleZIecJec.cpp diff --git a/OndselSolver/OrbitAngleZIecJec.h b/GNN/OndselSolver/OrbitAngleZIecJec.h similarity index 100% rename from OndselSolver/OrbitAngleZIecJec.h rename to GNN/OndselSolver/OrbitAngleZIecJec.h diff --git a/OndselSolver/OrbitAngleZIeqcJec.cpp b/GNN/OndselSolver/OrbitAngleZIeqcJec.cpp similarity index 100% rename from OndselSolver/OrbitAngleZIeqcJec.cpp rename to GNN/OndselSolver/OrbitAngleZIeqcJec.cpp diff --git a/OndselSolver/OrbitAngleZIeqcJec.h b/GNN/OndselSolver/OrbitAngleZIeqcJec.h similarity index 100% rename from OndselSolver/OrbitAngleZIeqcJec.h rename to GNN/OndselSolver/OrbitAngleZIeqcJec.h diff --git a/OndselSolver/OrbitAngleZIeqcJeqc.cpp b/GNN/OndselSolver/OrbitAngleZIeqcJeqc.cpp similarity index 100% rename from OndselSolver/OrbitAngleZIeqcJeqc.cpp rename to GNN/OndselSolver/OrbitAngleZIeqcJeqc.cpp diff --git a/OndselSolver/OrbitAngleZIeqcJeqc.h b/GNN/OndselSolver/OrbitAngleZIeqcJeqc.h similarity index 100% rename from OndselSolver/OrbitAngleZIeqcJeqc.h rename to GNN/OndselSolver/OrbitAngleZIeqcJeqc.h diff --git a/OndselSolver/Orientation.cpp b/GNN/OndselSolver/Orientation.cpp similarity index 100% rename from OndselSolver/Orientation.cpp rename to GNN/OndselSolver/Orientation.cpp diff --git a/OndselSolver/Orientation.h b/GNN/OndselSolver/Orientation.h similarity index 100% rename from OndselSolver/Orientation.h rename to GNN/OndselSolver/Orientation.h diff --git a/OndselSolver/ParallelAxesJoint.cpp b/GNN/OndselSolver/ParallelAxesJoint.cpp similarity index 100% rename from OndselSolver/ParallelAxesJoint.cpp rename to GNN/OndselSolver/ParallelAxesJoint.cpp diff --git a/OndselSolver/ParallelAxesJoint.h b/GNN/OndselSolver/ParallelAxesJoint.h similarity index 100% rename from OndselSolver/ParallelAxesJoint.h rename to GNN/OndselSolver/ParallelAxesJoint.h diff --git a/OndselSolver/Part.cpp b/GNN/OndselSolver/Part.cpp similarity index 100% rename from OndselSolver/Part.cpp rename to GNN/OndselSolver/Part.cpp diff --git a/OndselSolver/Part.h b/GNN/OndselSolver/Part.h similarity index 100% rename from OndselSolver/Part.h rename to GNN/OndselSolver/Part.h diff --git a/OndselSolver/PartFrame.cpp b/GNN/OndselSolver/PartFrame.cpp similarity index 100% rename from OndselSolver/PartFrame.cpp rename to GNN/OndselSolver/PartFrame.cpp diff --git a/OndselSolver/PartFrame.h b/GNN/OndselSolver/PartFrame.h similarity index 100% rename from OndselSolver/PartFrame.h rename to GNN/OndselSolver/PartFrame.h diff --git a/OndselSolver/PerpendicularJoint.cpp b/GNN/OndselSolver/PerpendicularJoint.cpp similarity index 100% rename from OndselSolver/PerpendicularJoint.cpp rename to GNN/OndselSolver/PerpendicularJoint.cpp diff --git a/OndselSolver/PerpendicularJoint.h b/GNN/OndselSolver/PerpendicularJoint.h similarity index 100% rename from OndselSolver/PerpendicularJoint.h rename to GNN/OndselSolver/PerpendicularJoint.h diff --git a/OndselSolver/PiecewiseFunction.cpp b/GNN/OndselSolver/PiecewiseFunction.cpp similarity index 100% rename from OndselSolver/PiecewiseFunction.cpp rename to GNN/OndselSolver/PiecewiseFunction.cpp diff --git a/OndselSolver/PiecewiseFunction.h b/GNN/OndselSolver/PiecewiseFunction.h similarity index 100% rename from OndselSolver/PiecewiseFunction.h rename to GNN/OndselSolver/PiecewiseFunction.h diff --git a/OndselSolver/PlanarJoint.cpp b/GNN/OndselSolver/PlanarJoint.cpp similarity index 100% rename from OndselSolver/PlanarJoint.cpp rename to GNN/OndselSolver/PlanarJoint.cpp diff --git a/OndselSolver/PlanarJoint.h b/GNN/OndselSolver/PlanarJoint.h similarity index 100% rename from OndselSolver/PlanarJoint.h rename to GNN/OndselSolver/PlanarJoint.h diff --git a/OndselSolver/PointInLineJoint.cpp b/GNN/OndselSolver/PointInLineJoint.cpp similarity index 100% rename from OndselSolver/PointInLineJoint.cpp rename to GNN/OndselSolver/PointInLineJoint.cpp diff --git a/OndselSolver/PointInLineJoint.h b/GNN/OndselSolver/PointInLineJoint.h similarity index 100% rename from OndselSolver/PointInLineJoint.h rename to GNN/OndselSolver/PointInLineJoint.h diff --git a/OndselSolver/PointInPlaneJoint.cpp b/GNN/OndselSolver/PointInPlaneJoint.cpp similarity index 100% rename from OndselSolver/PointInPlaneJoint.cpp rename to GNN/OndselSolver/PointInPlaneJoint.cpp diff --git a/OndselSolver/PointInPlaneJoint.h b/GNN/OndselSolver/PointInPlaneJoint.h similarity index 100% rename from OndselSolver/PointInPlaneJoint.h rename to GNN/OndselSolver/PointInPlaneJoint.h diff --git a/OndselSolver/Polynomial.cpp b/GNN/OndselSolver/Polynomial.cpp similarity index 100% rename from OndselSolver/Polynomial.cpp rename to GNN/OndselSolver/Polynomial.cpp diff --git a/OndselSolver/Polynomial.h b/GNN/OndselSolver/Polynomial.h similarity index 100% rename from OndselSolver/Polynomial.h rename to GNN/OndselSolver/Polynomial.h diff --git a/OndselSolver/PosICDragLimitNewtonRaphson.cpp b/GNN/OndselSolver/PosICDragLimitNewtonRaphson.cpp similarity index 100% rename from OndselSolver/PosICDragLimitNewtonRaphson.cpp rename to GNN/OndselSolver/PosICDragLimitNewtonRaphson.cpp diff --git a/OndselSolver/PosICDragLimitNewtonRaphson.h b/GNN/OndselSolver/PosICDragLimitNewtonRaphson.h similarity index 100% rename from OndselSolver/PosICDragLimitNewtonRaphson.h rename to GNN/OndselSolver/PosICDragLimitNewtonRaphson.h diff --git a/OndselSolver/PosICDragNewtonRaphson.cpp b/GNN/OndselSolver/PosICDragNewtonRaphson.cpp similarity index 100% rename from OndselSolver/PosICDragNewtonRaphson.cpp rename to GNN/OndselSolver/PosICDragNewtonRaphson.cpp diff --git a/OndselSolver/PosICDragNewtonRaphson.h b/GNN/OndselSolver/PosICDragNewtonRaphson.h similarity index 100% rename from OndselSolver/PosICDragNewtonRaphson.h rename to GNN/OndselSolver/PosICDragNewtonRaphson.h diff --git a/OndselSolver/PosICKineNewtonRaphson.cpp b/GNN/OndselSolver/PosICKineNewtonRaphson.cpp similarity index 100% rename from OndselSolver/PosICKineNewtonRaphson.cpp rename to GNN/OndselSolver/PosICKineNewtonRaphson.cpp diff --git a/OndselSolver/PosICKineNewtonRaphson.h b/GNN/OndselSolver/PosICKineNewtonRaphson.h similarity index 100% rename from OndselSolver/PosICKineNewtonRaphson.h rename to GNN/OndselSolver/PosICKineNewtonRaphson.h diff --git a/OndselSolver/PosICNewtonRaphson.cpp b/GNN/OndselSolver/PosICNewtonRaphson.cpp similarity index 100% rename from OndselSolver/PosICNewtonRaphson.cpp rename to GNN/OndselSolver/PosICNewtonRaphson.cpp diff --git a/OndselSolver/PosICNewtonRaphson.h b/GNN/OndselSolver/PosICNewtonRaphson.h similarity index 100% rename from OndselSolver/PosICNewtonRaphson.h rename to GNN/OndselSolver/PosICNewtonRaphson.h diff --git a/OndselSolver/PosKineNewtonRaphson.cpp b/GNN/OndselSolver/PosKineNewtonRaphson.cpp similarity index 100% rename from OndselSolver/PosKineNewtonRaphson.cpp rename to GNN/OndselSolver/PosKineNewtonRaphson.cpp diff --git a/OndselSolver/PosKineNewtonRaphson.h b/GNN/OndselSolver/PosKineNewtonRaphson.h similarity index 100% rename from OndselSolver/PosKineNewtonRaphson.h rename to GNN/OndselSolver/PosKineNewtonRaphson.h diff --git a/OndselSolver/PosNewtonRaphson.cpp b/GNN/OndselSolver/PosNewtonRaphson.cpp similarity index 100% rename from OndselSolver/PosNewtonRaphson.cpp rename to GNN/OndselSolver/PosNewtonRaphson.cpp diff --git a/OndselSolver/PosNewtonRaphson.h b/GNN/OndselSolver/PosNewtonRaphson.h similarity index 100% rename from OndselSolver/PosNewtonRaphson.h rename to GNN/OndselSolver/PosNewtonRaphson.h diff --git a/OndselSolver/PosVelAccData.cpp b/GNN/OndselSolver/PosVelAccData.cpp similarity index 100% rename from OndselSolver/PosVelAccData.cpp rename to GNN/OndselSolver/PosVelAccData.cpp diff --git a/OndselSolver/PosVelAccData.h b/GNN/OndselSolver/PosVelAccData.h similarity index 100% rename from OndselSolver/PosVelAccData.h rename to GNN/OndselSolver/PosVelAccData.h diff --git a/OndselSolver/Power.cpp b/GNN/OndselSolver/Power.cpp similarity index 100% rename from OndselSolver/Power.cpp rename to GNN/OndselSolver/Power.cpp diff --git a/OndselSolver/Power.h b/GNN/OndselSolver/Power.h similarity index 100% rename from OndselSolver/Power.h rename to GNN/OndselSolver/Power.h diff --git a/OndselSolver/PrescribedMotion.cpp b/GNN/OndselSolver/PrescribedMotion.cpp similarity index 100% rename from OndselSolver/PrescribedMotion.cpp rename to GNN/OndselSolver/PrescribedMotion.cpp diff --git a/OndselSolver/PrescribedMotion.h b/GNN/OndselSolver/PrescribedMotion.h similarity index 100% rename from OndselSolver/PrescribedMotion.h rename to GNN/OndselSolver/PrescribedMotion.h diff --git a/OndselSolver/Product.cpp b/GNN/OndselSolver/Product.cpp similarity index 100% rename from OndselSolver/Product.cpp rename to GNN/OndselSolver/Product.cpp diff --git a/OndselSolver/Product.h b/GNN/OndselSolver/Product.h similarity index 100% rename from OndselSolver/Product.h rename to GNN/OndselSolver/Product.h diff --git a/OndselSolver/QuasiIntegrator.cpp b/GNN/OndselSolver/QuasiIntegrator.cpp similarity index 100% rename from OndselSolver/QuasiIntegrator.cpp rename to GNN/OndselSolver/QuasiIntegrator.cpp diff --git a/OndselSolver/QuasiIntegrator.h b/GNN/OndselSolver/QuasiIntegrator.h similarity index 100% rename from OndselSolver/QuasiIntegrator.h rename to GNN/OndselSolver/QuasiIntegrator.h diff --git a/OndselSolver/RackPinConstraintIJ.cpp b/GNN/OndselSolver/RackPinConstraintIJ.cpp similarity index 100% rename from OndselSolver/RackPinConstraintIJ.cpp rename to GNN/OndselSolver/RackPinConstraintIJ.cpp diff --git a/OndselSolver/RackPinConstraintIJ.h b/GNN/OndselSolver/RackPinConstraintIJ.h similarity index 100% rename from OndselSolver/RackPinConstraintIJ.h rename to GNN/OndselSolver/RackPinConstraintIJ.h diff --git a/OndselSolver/RackPinConstraintIqcJc.cpp b/GNN/OndselSolver/RackPinConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/RackPinConstraintIqcJc.cpp rename to GNN/OndselSolver/RackPinConstraintIqcJc.cpp diff --git a/OndselSolver/RackPinConstraintIqcJc.h b/GNN/OndselSolver/RackPinConstraintIqcJc.h similarity index 100% rename from OndselSolver/RackPinConstraintIqcJc.h rename to GNN/OndselSolver/RackPinConstraintIqcJc.h diff --git a/OndselSolver/RackPinConstraintIqcJqc.cpp b/GNN/OndselSolver/RackPinConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/RackPinConstraintIqcJqc.cpp rename to GNN/OndselSolver/RackPinConstraintIqcJqc.cpp diff --git a/OndselSolver/RackPinConstraintIqcJqc.h b/GNN/OndselSolver/RackPinConstraintIqcJqc.h similarity index 100% rename from OndselSolver/RackPinConstraintIqcJqc.h rename to GNN/OndselSolver/RackPinConstraintIqcJqc.h diff --git a/OndselSolver/RackPinJoint.cpp b/GNN/OndselSolver/RackPinJoint.cpp similarity index 100% rename from OndselSolver/RackPinJoint.cpp rename to GNN/OndselSolver/RackPinJoint.cpp diff --git a/OndselSolver/RackPinJoint.h b/GNN/OndselSolver/RackPinJoint.h similarity index 100% rename from OndselSolver/RackPinJoint.h rename to GNN/OndselSolver/RackPinJoint.h diff --git a/OndselSolver/RampStepFunction.cpp b/GNN/OndselSolver/RampStepFunction.cpp similarity index 100% rename from OndselSolver/RampStepFunction.cpp rename to GNN/OndselSolver/RampStepFunction.cpp diff --git a/OndselSolver/RampStepFunction.h b/GNN/OndselSolver/RampStepFunction.h similarity index 100% rename from OndselSolver/RampStepFunction.h rename to GNN/OndselSolver/RampStepFunction.h diff --git a/OndselSolver/Reciprocal.cpp b/GNN/OndselSolver/Reciprocal.cpp similarity index 100% rename from OndselSolver/Reciprocal.cpp rename to GNN/OndselSolver/Reciprocal.cpp diff --git a/OndselSolver/Reciprocal.h b/GNN/OndselSolver/Reciprocal.h similarity index 100% rename from OndselSolver/Reciprocal.h rename to GNN/OndselSolver/Reciprocal.h diff --git a/OndselSolver/RedundantConstraint.cpp b/GNN/OndselSolver/RedundantConstraint.cpp similarity index 100% rename from OndselSolver/RedundantConstraint.cpp rename to GNN/OndselSolver/RedundantConstraint.cpp diff --git a/OndselSolver/RedundantConstraint.h b/GNN/OndselSolver/RedundantConstraint.h similarity index 100% rename from OndselSolver/RedundantConstraint.h rename to GNN/OndselSolver/RedundantConstraint.h diff --git a/OndselSolver/RevCylJoint.cpp b/GNN/OndselSolver/RevCylJoint.cpp similarity index 100% rename from OndselSolver/RevCylJoint.cpp rename to GNN/OndselSolver/RevCylJoint.cpp diff --git a/OndselSolver/RevCylJoint.h b/GNN/OndselSolver/RevCylJoint.h similarity index 100% rename from OndselSolver/RevCylJoint.h rename to GNN/OndselSolver/RevCylJoint.h diff --git a/OndselSolver/RevRevJoint.cpp b/GNN/OndselSolver/RevRevJoint.cpp similarity index 100% rename from OndselSolver/RevRevJoint.cpp rename to GNN/OndselSolver/RevRevJoint.cpp diff --git a/OndselSolver/RevRevJoint.h b/GNN/OndselSolver/RevRevJoint.h similarity index 100% rename from OndselSolver/RevRevJoint.h rename to GNN/OndselSolver/RevRevJoint.h diff --git a/OndselSolver/RevoluteJoint.cpp b/GNN/OndselSolver/RevoluteJoint.cpp similarity index 100% rename from OndselSolver/RevoluteJoint.cpp rename to GNN/OndselSolver/RevoluteJoint.cpp diff --git a/OndselSolver/RevoluteJoint.h b/GNN/OndselSolver/RevoluteJoint.h similarity index 100% rename from OndselSolver/RevoluteJoint.h rename to GNN/OndselSolver/RevoluteJoint.h diff --git a/OndselSolver/RotationLimitIJ.cpp b/GNN/OndselSolver/RotationLimitIJ.cpp similarity index 100% rename from OndselSolver/RotationLimitIJ.cpp rename to GNN/OndselSolver/RotationLimitIJ.cpp diff --git a/OndselSolver/RotationLimitIJ.h b/GNN/OndselSolver/RotationLimitIJ.h similarity index 100% rename from OndselSolver/RotationLimitIJ.h rename to GNN/OndselSolver/RotationLimitIJ.h diff --git a/OndselSolver/RowTypeMatrix.cpp b/GNN/OndselSolver/RowTypeMatrix.cpp similarity index 100% rename from OndselSolver/RowTypeMatrix.cpp rename to GNN/OndselSolver/RowTypeMatrix.cpp diff --git a/OndselSolver/RowTypeMatrix.h b/GNN/OndselSolver/RowTypeMatrix.h similarity index 100% rename from OndselSolver/RowTypeMatrix.h rename to GNN/OndselSolver/RowTypeMatrix.h diff --git a/OndselSolver/ScalarNewtonRaphson.cpp b/GNN/OndselSolver/ScalarNewtonRaphson.cpp similarity index 100% rename from OndselSolver/ScalarNewtonRaphson.cpp rename to GNN/OndselSolver/ScalarNewtonRaphson.cpp diff --git a/OndselSolver/ScalarNewtonRaphson.h b/GNN/OndselSolver/ScalarNewtonRaphson.h similarity index 100% rename from OndselSolver/ScalarNewtonRaphson.h rename to GNN/OndselSolver/ScalarNewtonRaphson.h diff --git a/OndselSolver/ScrewConstraintIJ.cpp b/GNN/OndselSolver/ScrewConstraintIJ.cpp similarity index 100% rename from OndselSolver/ScrewConstraintIJ.cpp rename to GNN/OndselSolver/ScrewConstraintIJ.cpp diff --git a/OndselSolver/ScrewConstraintIJ.h b/GNN/OndselSolver/ScrewConstraintIJ.h similarity index 100% rename from OndselSolver/ScrewConstraintIJ.h rename to GNN/OndselSolver/ScrewConstraintIJ.h diff --git a/OndselSolver/ScrewConstraintIqcJc.cpp b/GNN/OndselSolver/ScrewConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/ScrewConstraintIqcJc.cpp rename to GNN/OndselSolver/ScrewConstraintIqcJc.cpp diff --git a/OndselSolver/ScrewConstraintIqcJc.h b/GNN/OndselSolver/ScrewConstraintIqcJc.h similarity index 100% rename from OndselSolver/ScrewConstraintIqcJc.h rename to GNN/OndselSolver/ScrewConstraintIqcJc.h diff --git a/OndselSolver/ScrewConstraintIqcJqc.cpp b/GNN/OndselSolver/ScrewConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/ScrewConstraintIqcJqc.cpp rename to GNN/OndselSolver/ScrewConstraintIqcJqc.cpp diff --git a/OndselSolver/ScrewConstraintIqcJqc.h b/GNN/OndselSolver/ScrewConstraintIqcJqc.h similarity index 100% rename from OndselSolver/ScrewConstraintIqcJqc.h rename to GNN/OndselSolver/ScrewConstraintIqcJqc.h diff --git a/OndselSolver/ScrewJoint.cpp b/GNN/OndselSolver/ScrewJoint.cpp similarity index 100% rename from OndselSolver/ScrewJoint.cpp rename to GNN/OndselSolver/ScrewJoint.cpp diff --git a/OndselSolver/ScrewJoint.h b/GNN/OndselSolver/ScrewJoint.h similarity index 100% rename from OndselSolver/ScrewJoint.h rename to GNN/OndselSolver/ScrewJoint.h diff --git a/OndselSolver/SimulationStoppingError.cpp b/GNN/OndselSolver/SimulationStoppingError.cpp similarity index 100% rename from OndselSolver/SimulationStoppingError.cpp rename to GNN/OndselSolver/SimulationStoppingError.cpp diff --git a/OndselSolver/SimulationStoppingError.h b/GNN/OndselSolver/SimulationStoppingError.h similarity index 100% rename from OndselSolver/SimulationStoppingError.h rename to GNN/OndselSolver/SimulationStoppingError.h diff --git a/OndselSolver/Sine.cpp b/GNN/OndselSolver/Sine.cpp similarity index 100% rename from OndselSolver/Sine.cpp rename to GNN/OndselSolver/Sine.cpp diff --git a/OndselSolver/Sine.h b/GNN/OndselSolver/Sine.h similarity index 100% rename from OndselSolver/Sine.h rename to GNN/OndselSolver/Sine.h diff --git a/OndselSolver/SingularMatrixError.cpp b/GNN/OndselSolver/SingularMatrixError.cpp similarity index 100% rename from OndselSolver/SingularMatrixError.cpp rename to GNN/OndselSolver/SingularMatrixError.cpp diff --git a/OndselSolver/SingularMatrixError.h b/GNN/OndselSolver/SingularMatrixError.h similarity index 100% rename from OndselSolver/SingularMatrixError.h rename to GNN/OndselSolver/SingularMatrixError.h diff --git a/OndselSolver/Solver.cpp b/GNN/OndselSolver/Solver.cpp similarity index 100% rename from OndselSolver/Solver.cpp rename to GNN/OndselSolver/Solver.cpp diff --git a/OndselSolver/Solver.h b/GNN/OndselSolver/Solver.h similarity index 100% rename from OndselSolver/Solver.h rename to GNN/OndselSolver/Solver.h diff --git a/OndselSolver/SparseColumn.cpp b/GNN/OndselSolver/SparseColumn.cpp similarity index 100% rename from OndselSolver/SparseColumn.cpp rename to GNN/OndselSolver/SparseColumn.cpp diff --git a/OndselSolver/SparseColumn.h b/GNN/OndselSolver/SparseColumn.h similarity index 100% rename from OndselSolver/SparseColumn.h rename to GNN/OndselSolver/SparseColumn.h diff --git a/OndselSolver/SparseMatrix.cpp b/GNN/OndselSolver/SparseMatrix.cpp similarity index 100% rename from OndselSolver/SparseMatrix.cpp rename to GNN/OndselSolver/SparseMatrix.cpp diff --git a/OndselSolver/SparseMatrix.h b/GNN/OndselSolver/SparseMatrix.h similarity index 100% rename from OndselSolver/SparseMatrix.h rename to GNN/OndselSolver/SparseMatrix.h diff --git a/OndselSolver/SparseRow.cpp b/GNN/OndselSolver/SparseRow.cpp similarity index 100% rename from OndselSolver/SparseRow.cpp rename to GNN/OndselSolver/SparseRow.cpp diff --git a/OndselSolver/SparseRow.h b/GNN/OndselSolver/SparseRow.h similarity index 100% rename from OndselSolver/SparseRow.h rename to GNN/OndselSolver/SparseRow.h diff --git a/OndselSolver/SparseVector.cpp b/GNN/OndselSolver/SparseVector.cpp similarity index 100% rename from OndselSolver/SparseVector.cpp rename to GNN/OndselSolver/SparseVector.cpp diff --git a/OndselSolver/SparseVector.h b/GNN/OndselSolver/SparseVector.h similarity index 100% rename from OndselSolver/SparseVector.h rename to GNN/OndselSolver/SparseVector.h diff --git a/OndselSolver/SphSphJoint.cpp b/GNN/OndselSolver/SphSphJoint.cpp similarity index 100% rename from OndselSolver/SphSphJoint.cpp rename to GNN/OndselSolver/SphSphJoint.cpp diff --git a/OndselSolver/SphSphJoint.h b/GNN/OndselSolver/SphSphJoint.h similarity index 100% rename from OndselSolver/SphSphJoint.h rename to GNN/OndselSolver/SphSphJoint.h diff --git a/OndselSolver/SphericalJoint.cpp b/GNN/OndselSolver/SphericalJoint.cpp similarity index 100% rename from OndselSolver/SphericalJoint.cpp rename to GNN/OndselSolver/SphericalJoint.cpp diff --git a/OndselSolver/SphericalJoint.h b/GNN/OndselSolver/SphericalJoint.h similarity index 100% rename from OndselSolver/SphericalJoint.h rename to GNN/OndselSolver/SphericalJoint.h diff --git a/OndselSolver/StableBackwardDifference.cpp b/GNN/OndselSolver/StableBackwardDifference.cpp similarity index 100% rename from OndselSolver/StableBackwardDifference.cpp rename to GNN/OndselSolver/StableBackwardDifference.cpp diff --git a/OndselSolver/StableBackwardDifference.h b/GNN/OndselSolver/StableBackwardDifference.h similarity index 100% rename from OndselSolver/StableBackwardDifference.h rename to GNN/OndselSolver/StableBackwardDifference.h diff --git a/OndselSolver/StateData.cpp b/GNN/OndselSolver/StateData.cpp similarity index 100% rename from OndselSolver/StateData.cpp rename to GNN/OndselSolver/StateData.cpp diff --git a/OndselSolver/StateData.h b/GNN/OndselSolver/StateData.h similarity index 100% rename from OndselSolver/StateData.h rename to GNN/OndselSolver/StateData.h diff --git a/OndselSolver/StepFunction.cpp b/GNN/OndselSolver/StepFunction.cpp similarity index 100% rename from OndselSolver/StepFunction.cpp rename to GNN/OndselSolver/StepFunction.cpp diff --git a/OndselSolver/StepFunction.h b/GNN/OndselSolver/StepFunction.h similarity index 100% rename from OndselSolver/StepFunction.h rename to GNN/OndselSolver/StepFunction.h diff --git a/OndselSolver/Sum.cpp b/GNN/OndselSolver/Sum.cpp similarity index 100% rename from OndselSolver/Sum.cpp rename to GNN/OndselSolver/Sum.cpp diff --git a/OndselSolver/Sum.h b/GNN/OndselSolver/Sum.h similarity index 100% rename from OndselSolver/Sum.h rename to GNN/OndselSolver/Sum.h diff --git a/OndselSolver/SymTime.cpp b/GNN/OndselSolver/SymTime.cpp similarity index 100% rename from OndselSolver/SymTime.cpp rename to GNN/OndselSolver/SymTime.cpp diff --git a/OndselSolver/SymTime.h b/GNN/OndselSolver/SymTime.h similarity index 100% rename from OndselSolver/SymTime.h rename to GNN/OndselSolver/SymTime.h diff --git a/OndselSolver/Symbolic.cpp b/GNN/OndselSolver/Symbolic.cpp similarity index 100% rename from OndselSolver/Symbolic.cpp rename to GNN/OndselSolver/Symbolic.cpp diff --git a/OndselSolver/Symbolic.h b/GNN/OndselSolver/Symbolic.h similarity index 100% rename from OndselSolver/Symbolic.h rename to GNN/OndselSolver/Symbolic.h diff --git a/OndselSolver/SymbolicParser.cpp b/GNN/OndselSolver/SymbolicParser.cpp similarity index 100% rename from OndselSolver/SymbolicParser.cpp rename to GNN/OndselSolver/SymbolicParser.cpp diff --git a/OndselSolver/SymbolicParser.h b/GNN/OndselSolver/SymbolicParser.h similarity index 100% rename from OndselSolver/SymbolicParser.h rename to GNN/OndselSolver/SymbolicParser.h diff --git a/OndselSolver/SyntaxError.cpp b/GNN/OndselSolver/SyntaxError.cpp similarity index 100% rename from OndselSolver/SyntaxError.cpp rename to GNN/OndselSolver/SyntaxError.cpp diff --git a/OndselSolver/SyntaxError.h b/GNN/OndselSolver/SyntaxError.h similarity index 100% rename from OndselSolver/SyntaxError.h rename to GNN/OndselSolver/SyntaxError.h diff --git a/OndselSolver/System.cpp b/GNN/OndselSolver/System.cpp similarity index 100% rename from OndselSolver/System.cpp rename to GNN/OndselSolver/System.cpp diff --git a/OndselSolver/System.h b/GNN/OndselSolver/System.h similarity index 100% rename from OndselSolver/System.h rename to GNN/OndselSolver/System.h diff --git a/OndselSolver/SystemNewtonRaphson.cpp b/GNN/OndselSolver/SystemNewtonRaphson.cpp similarity index 100% rename from OndselSolver/SystemNewtonRaphson.cpp rename to GNN/OndselSolver/SystemNewtonRaphson.cpp diff --git a/OndselSolver/SystemNewtonRaphson.h b/GNN/OndselSolver/SystemNewtonRaphson.h similarity index 100% rename from OndselSolver/SystemNewtonRaphson.h rename to GNN/OndselSolver/SystemNewtonRaphson.h diff --git a/OndselSolver/SystemSolver.cpp b/GNN/OndselSolver/SystemSolver.cpp similarity index 100% rename from OndselSolver/SystemSolver.cpp rename to GNN/OndselSolver/SystemSolver.cpp diff --git a/OndselSolver/SystemSolver.h b/GNN/OndselSolver/SystemSolver.h similarity index 100% rename from OndselSolver/SystemSolver.h rename to GNN/OndselSolver/SystemSolver.h diff --git a/OndselSolver/TooManyTriesError.cpp b/GNN/OndselSolver/TooManyTriesError.cpp similarity index 100% rename from OndselSolver/TooManyTriesError.cpp rename to GNN/OndselSolver/TooManyTriesError.cpp diff --git a/OndselSolver/TooManyTriesError.h b/GNN/OndselSolver/TooManyTriesError.h similarity index 100% rename from OndselSolver/TooManyTriesError.h rename to GNN/OndselSolver/TooManyTriesError.h diff --git a/OndselSolver/TooSmallStepSizeError.cpp b/GNN/OndselSolver/TooSmallStepSizeError.cpp similarity index 100% rename from OndselSolver/TooSmallStepSizeError.cpp rename to GNN/OndselSolver/TooSmallStepSizeError.cpp diff --git a/OndselSolver/TooSmallStepSizeError.h b/GNN/OndselSolver/TooSmallStepSizeError.h similarity index 100% rename from OndselSolver/TooSmallStepSizeError.h rename to GNN/OndselSolver/TooSmallStepSizeError.h diff --git a/OndselSolver/Transitions.cpp b/GNN/OndselSolver/Transitions.cpp similarity index 100% rename from OndselSolver/Transitions.cpp rename to GNN/OndselSolver/Transitions.cpp diff --git a/OndselSolver/Transitions.h b/GNN/OndselSolver/Transitions.h similarity index 100% rename from OndselSolver/Transitions.h rename to GNN/OndselSolver/Transitions.h diff --git a/OndselSolver/Translation.cpp b/GNN/OndselSolver/Translation.cpp similarity index 100% rename from OndselSolver/Translation.cpp rename to GNN/OndselSolver/Translation.cpp diff --git a/OndselSolver/Translation.h b/GNN/OndselSolver/Translation.h similarity index 100% rename from OndselSolver/Translation.h rename to GNN/OndselSolver/Translation.h diff --git a/OndselSolver/TranslationConstraintIJ.cpp b/GNN/OndselSolver/TranslationConstraintIJ.cpp similarity index 100% rename from OndselSolver/TranslationConstraintIJ.cpp rename to GNN/OndselSolver/TranslationConstraintIJ.cpp diff --git a/OndselSolver/TranslationConstraintIJ.h b/GNN/OndselSolver/TranslationConstraintIJ.h similarity index 100% rename from OndselSolver/TranslationConstraintIJ.h rename to GNN/OndselSolver/TranslationConstraintIJ.h diff --git a/OndselSolver/TranslationConstraintIqcJc.cpp b/GNN/OndselSolver/TranslationConstraintIqcJc.cpp similarity index 100% rename from OndselSolver/TranslationConstraintIqcJc.cpp rename to GNN/OndselSolver/TranslationConstraintIqcJc.cpp diff --git a/OndselSolver/TranslationConstraintIqcJc.h b/GNN/OndselSolver/TranslationConstraintIqcJc.h similarity index 100% rename from OndselSolver/TranslationConstraintIqcJc.h rename to GNN/OndselSolver/TranslationConstraintIqcJc.h diff --git a/OndselSolver/TranslationConstraintIqcJqc.cpp b/GNN/OndselSolver/TranslationConstraintIqcJqc.cpp similarity index 100% rename from OndselSolver/TranslationConstraintIqcJqc.cpp rename to GNN/OndselSolver/TranslationConstraintIqcJqc.cpp diff --git a/OndselSolver/TranslationConstraintIqcJqc.h b/GNN/OndselSolver/TranslationConstraintIqcJqc.h similarity index 100% rename from OndselSolver/TranslationConstraintIqcJqc.h rename to GNN/OndselSolver/TranslationConstraintIqcJqc.h diff --git a/OndselSolver/TranslationConstraintIqctJqc.cpp b/GNN/OndselSolver/TranslationConstraintIqctJqc.cpp similarity index 100% rename from OndselSolver/TranslationConstraintIqctJqc.cpp rename to GNN/OndselSolver/TranslationConstraintIqctJqc.cpp diff --git a/OndselSolver/TranslationConstraintIqctJqc.h b/GNN/OndselSolver/TranslationConstraintIqctJqc.h similarity index 100% rename from OndselSolver/TranslationConstraintIqctJqc.h rename to GNN/OndselSolver/TranslationConstraintIqctJqc.h diff --git a/OndselSolver/TranslationLimitIJ.cpp b/GNN/OndselSolver/TranslationLimitIJ.cpp similarity index 100% rename from OndselSolver/TranslationLimitIJ.cpp rename to GNN/OndselSolver/TranslationLimitIJ.cpp diff --git a/OndselSolver/TranslationLimitIJ.h b/GNN/OndselSolver/TranslationLimitIJ.h similarity index 100% rename from OndselSolver/TranslationLimitIJ.h rename to GNN/OndselSolver/TranslationLimitIJ.h diff --git a/OndselSolver/TranslationalJoint.cpp b/GNN/OndselSolver/TranslationalJoint.cpp similarity index 100% rename from OndselSolver/TranslationalJoint.cpp rename to GNN/OndselSolver/TranslationalJoint.cpp diff --git a/OndselSolver/TranslationalJoint.h b/GNN/OndselSolver/TranslationalJoint.h similarity index 100% rename from OndselSolver/TranslationalJoint.h rename to GNN/OndselSolver/TranslationalJoint.h diff --git a/OndselSolver/Units.cpp b/GNN/OndselSolver/Units.cpp similarity index 100% rename from OndselSolver/Units.cpp rename to GNN/OndselSolver/Units.cpp diff --git a/OndselSolver/Units.h b/GNN/OndselSolver/Units.h similarity index 100% rename from OndselSolver/Units.h rename to GNN/OndselSolver/Units.h diff --git a/OndselSolver/UniversalJoint.cpp b/GNN/OndselSolver/UniversalJoint.cpp similarity index 100% rename from OndselSolver/UniversalJoint.cpp rename to GNN/OndselSolver/UniversalJoint.cpp diff --git a/OndselSolver/UniversalJoint.h b/GNN/OndselSolver/UniversalJoint.h similarity index 100% rename from OndselSolver/UniversalJoint.h rename to GNN/OndselSolver/UniversalJoint.h diff --git a/OndselSolver/UserFunction.cpp b/GNN/OndselSolver/UserFunction.cpp similarity index 100% rename from OndselSolver/UserFunction.cpp rename to GNN/OndselSolver/UserFunction.cpp diff --git a/OndselSolver/UserFunction.h b/GNN/OndselSolver/UserFunction.h similarity index 100% rename from OndselSolver/UserFunction.h rename to GNN/OndselSolver/UserFunction.h diff --git a/OndselSolver/Variable.cpp b/GNN/OndselSolver/Variable.cpp similarity index 100% rename from OndselSolver/Variable.cpp rename to GNN/OndselSolver/Variable.cpp diff --git a/OndselSolver/Variable.h b/GNN/OndselSolver/Variable.h similarity index 100% rename from OndselSolver/Variable.h rename to GNN/OndselSolver/Variable.h diff --git a/OndselSolver/VectorNewtonRaphson.cpp b/GNN/OndselSolver/VectorNewtonRaphson.cpp similarity index 100% rename from OndselSolver/VectorNewtonRaphson.cpp rename to GNN/OndselSolver/VectorNewtonRaphson.cpp diff --git a/OndselSolver/VectorNewtonRaphson.h b/GNN/OndselSolver/VectorNewtonRaphson.h similarity index 100% rename from OndselSolver/VectorNewtonRaphson.h rename to GNN/OndselSolver/VectorNewtonRaphson.h diff --git a/OndselSolver/VelICKineSolver.cpp b/GNN/OndselSolver/VelICKineSolver.cpp similarity index 100% rename from OndselSolver/VelICKineSolver.cpp rename to GNN/OndselSolver/VelICKineSolver.cpp diff --git a/OndselSolver/VelICKineSolver.h b/GNN/OndselSolver/VelICKineSolver.h similarity index 100% rename from OndselSolver/VelICKineSolver.h rename to GNN/OndselSolver/VelICKineSolver.h diff --git a/OndselSolver/VelICSolver.cpp b/GNN/OndselSolver/VelICSolver.cpp similarity index 100% rename from OndselSolver/VelICSolver.cpp rename to GNN/OndselSolver/VelICSolver.cpp diff --git a/OndselSolver/VelICSolver.h b/GNN/OndselSolver/VelICSolver.h similarity index 100% rename from OndselSolver/VelICSolver.h rename to GNN/OndselSolver/VelICSolver.h diff --git a/OndselSolver/VelKineSolver.cpp b/GNN/OndselSolver/VelKineSolver.cpp similarity index 100% rename from OndselSolver/VelKineSolver.cpp rename to GNN/OndselSolver/VelKineSolver.cpp diff --git a/OndselSolver/VelKineSolver.h b/GNN/OndselSolver/VelKineSolver.h similarity index 100% rename from OndselSolver/VelKineSolver.h rename to GNN/OndselSolver/VelKineSolver.h diff --git a/OndselSolver/VelSolver.cpp b/GNN/OndselSolver/VelSolver.cpp similarity index 100% rename from OndselSolver/VelSolver.cpp rename to GNN/OndselSolver/VelSolver.cpp diff --git a/OndselSolver/VelSolver.h b/GNN/OndselSolver/VelSolver.h similarity index 100% rename from OndselSolver/VelSolver.h rename to GNN/OndselSolver/VelSolver.h diff --git a/OndselSolver/ZRotation.cpp b/GNN/OndselSolver/ZRotation.cpp similarity index 100% rename from OndselSolver/ZRotation.cpp rename to GNN/OndselSolver/ZRotation.cpp diff --git a/OndselSolver/ZRotation.h b/GNN/OndselSolver/ZRotation.h similarity index 100% rename from OndselSolver/ZRotation.h rename to GNN/OndselSolver/ZRotation.h diff --git a/OndselSolver/ZTranslation.cpp b/GNN/OndselSolver/ZTranslation.cpp similarity index 100% rename from OndselSolver/ZTranslation.cpp rename to GNN/OndselSolver/ZTranslation.cpp diff --git a/OndselSolver/ZTranslation.h b/GNN/OndselSolver/ZTranslation.h similarity index 100% rename from OndselSolver/ZTranslation.h rename to GNN/OndselSolver/ZTranslation.h diff --git a/OndselSolver/crank_slider.mov b/GNN/OndselSolver/crank_slider.mov similarity index 100% rename from OndselSolver/crank_slider.mov rename to GNN/OndselSolver/crank_slider.mov diff --git a/OndselSolver/crank_sliderX.mov b/GNN/OndselSolver/crank_sliderX.mov similarity index 100% rename from OndselSolver/crank_sliderX.mov rename to GNN/OndselSolver/crank_sliderX.mov diff --git a/OndselSolver/dragging.log b/GNN/OndselSolver/dragging.log similarity index 100% rename from OndselSolver/dragging.log rename to GNN/OndselSolver/dragging.log diff --git a/OndselSolver/enum.h b/GNN/OndselSolver/enum.h similarity index 100% rename from OndselSolver/enum.h rename to GNN/OndselSolver/enum.h diff --git a/OndselSolver/resource.h b/GNN/OndselSolver/resource.h similarity index 100% rename from OndselSolver/resource.h rename to GNN/OndselSolver/resource.h diff --git a/OndselSolver/runDragStep.asmt b/GNN/OndselSolver/runDragStep.asmt similarity index 100% rename from OndselSolver/runDragStep.asmt rename to GNN/OndselSolver/runDragStep.asmt diff --git a/OndselSolver/runPreDrag.asmt b/GNN/OndselSolver/runPreDrag.asmt similarity index 100% rename from OndselSolver/runPreDrag.asmt rename to GNN/OndselSolver/runPreDrag.asmt diff --git a/OndselSolverMain/CMakeLists.txt b/GNN/OndselSolverMain/CMakeLists.txt similarity index 100% rename from OndselSolverMain/CMakeLists.txt rename to GNN/OndselSolverMain/CMakeLists.txt diff --git a/OndselSolverMain/OndselSolver.cpp b/GNN/OndselSolverMain/OndselSolver.cpp similarity index 100% rename from OndselSolverMain/OndselSolver.cpp rename to GNN/OndselSolverMain/OndselSolver.cpp diff --git a/OndselSolverMain/OndselSolver.h b/GNN/OndselSolverMain/OndselSolver.h similarity index 100% rename from OndselSolverMain/OndselSolver.h rename to GNN/OndselSolverMain/OndselSolver.h diff --git a/configs/dataset/fusion360.yaml b/GNN/configs/dataset/fusion360.yaml similarity index 100% rename from configs/dataset/fusion360.yaml rename to GNN/configs/dataset/fusion360.yaml diff --git a/configs/dataset/synthetic.yaml b/GNN/configs/dataset/synthetic.yaml similarity index 100% rename from configs/dataset/synthetic.yaml rename to GNN/configs/dataset/synthetic.yaml diff --git a/configs/export/production.yaml b/GNN/configs/export/production.yaml similarity index 100% rename from configs/export/production.yaml rename to GNN/configs/export/production.yaml diff --git a/configs/model/baseline.yaml b/GNN/configs/model/baseline.yaml similarity index 100% rename from configs/model/baseline.yaml rename to GNN/configs/model/baseline.yaml diff --git a/configs/model/gat.yaml b/GNN/configs/model/gat.yaml similarity index 100% rename from configs/model/gat.yaml rename to GNN/configs/model/gat.yaml diff --git a/configs/training/finetune.yaml b/GNN/configs/training/finetune.yaml similarity index 100% rename from configs/training/finetune.yaml rename to GNN/configs/training/finetune.yaml diff --git a/configs/training/pretrain.yaml b/GNN/configs/training/pretrain.yaml similarity index 100% rename from configs/training/pretrain.yaml rename to GNN/configs/training/pretrain.yaml diff --git a/corporate_contributor_license_agreement.md b/GNN/corporate_contributor_license_agreement.md similarity index 100% rename from corporate_contributor_license_agreement.md rename to GNN/corporate_contributor_license_agreement.md diff --git a/data/fusion360/.gitkeep b/GNN/data/fusion360/.gitkeep similarity index 100% rename from data/fusion360/.gitkeep rename to GNN/data/fusion360/.gitkeep diff --git a/data/processed/.gitkeep b/GNN/data/processed/.gitkeep similarity index 100% rename from data/processed/.gitkeep rename to GNN/data/processed/.gitkeep diff --git a/data/splits/.gitkeep b/GNN/data/splits/.gitkeep similarity index 100% rename from data/splits/.gitkeep rename to GNN/data/splits/.gitkeep diff --git a/data/synthetic/.gitkeep b/GNN/data/synthetic/.gitkeep similarity index 100% rename from data/synthetic/.gitkeep rename to GNN/data/synthetic/.gitkeep diff --git a/developer_certificate_of_origin.md b/GNN/developer_certificate_of_origin.md similarity index 100% rename from developer_certificate_of_origin.md rename to GNN/developer_certificate_of_origin.md diff --git a/docker-compose.yml b/GNN/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to GNN/docker-compose.yml diff --git a/docs/.gitkeep b/GNN/docs/.gitkeep similarity index 100% rename from docs/.gitkeep rename to GNN/docs/.gitkeep diff --git a/export/.gitkeep b/GNN/export/.gitkeep similarity index 100% rename from export/.gitkeep rename to GNN/export/.gitkeep diff --git a/freecad/__init__.py b/GNN/freecad/__init__.py similarity index 100% rename from freecad/__init__.py rename to GNN/freecad/__init__.py diff --git a/freecad/bridge/__init__.py b/GNN/freecad/bridge/__init__.py similarity index 100% rename from freecad/bridge/__init__.py rename to GNN/freecad/bridge/__init__.py diff --git a/freecad/tests/__init__.py b/GNN/freecad/tests/__init__.py similarity index 100% rename from freecad/tests/__init__.py rename to GNN/freecad/tests/__init__.py diff --git a/freecad/workbench/__init__.py b/GNN/freecad/workbench/__init__.py similarity index 100% rename from freecad/workbench/__init__.py rename to GNN/freecad/workbench/__init__.py diff --git a/individual_contributor_license_agreement.md b/GNN/individual_contributor_license_agreement.md similarity index 100% rename from individual_contributor_license_agreement.md rename to GNN/individual_contributor_license_agreement.md diff --git a/individual_contributor_license_agrement.md b/GNN/individual_contributor_license_agrement.md similarity index 100% rename from individual_contributor_license_agrement.md rename to GNN/individual_contributor_license_agrement.md diff --git a/pyproject.toml b/GNN/pyproject.toml similarity index 100% rename from pyproject.toml rename to GNN/pyproject.toml diff --git a/scripts/generate_synthetic.py b/GNN/scripts/generate_synthetic.py similarity index 100% rename from scripts/generate_synthetic.py rename to GNN/scripts/generate_synthetic.py diff --git a/solver/__init__.py b/GNN/solver/__init__.py similarity index 100% rename from solver/__init__.py rename to GNN/solver/__init__.py diff --git a/solver/datagen/__init__.py b/GNN/solver/datagen/__init__.py similarity index 100% rename from solver/datagen/__init__.py rename to GNN/solver/datagen/__init__.py diff --git a/solver/datagen/analysis.py b/GNN/solver/datagen/analysis.py similarity index 100% rename from solver/datagen/analysis.py rename to GNN/solver/datagen/analysis.py diff --git a/solver/datagen/dataset.py b/GNN/solver/datagen/dataset.py similarity index 100% rename from solver/datagen/dataset.py rename to GNN/solver/datagen/dataset.py diff --git a/solver/datagen/generator.py b/GNN/solver/datagen/generator.py similarity index 100% rename from solver/datagen/generator.py rename to GNN/solver/datagen/generator.py diff --git a/solver/datagen/jacobian.py b/GNN/solver/datagen/jacobian.py similarity index 100% rename from solver/datagen/jacobian.py rename to GNN/solver/datagen/jacobian.py diff --git a/solver/datagen/labeling.py b/GNN/solver/datagen/labeling.py similarity index 100% rename from solver/datagen/labeling.py rename to GNN/solver/datagen/labeling.py diff --git a/solver/datagen/pebble_game.py b/GNN/solver/datagen/pebble_game.py similarity index 100% rename from solver/datagen/pebble_game.py rename to GNN/solver/datagen/pebble_game.py diff --git a/solver/datagen/types.py b/GNN/solver/datagen/types.py similarity index 100% rename from solver/datagen/types.py rename to GNN/solver/datagen/types.py diff --git a/solver/datasets/__init__.py b/GNN/solver/datasets/__init__.py similarity index 100% rename from solver/datasets/__init__.py rename to GNN/solver/datasets/__init__.py diff --git a/solver/evaluation/__init__.py b/GNN/solver/evaluation/__init__.py similarity index 100% rename from solver/evaluation/__init__.py rename to GNN/solver/evaluation/__init__.py diff --git a/solver/inference/__init__.py b/GNN/solver/inference/__init__.py similarity index 100% rename from solver/inference/__init__.py rename to GNN/solver/inference/__init__.py diff --git a/solver/mates/__init__.py b/GNN/solver/mates/__init__.py similarity index 100% rename from solver/mates/__init__.py rename to GNN/solver/mates/__init__.py diff --git a/solver/mates/conversion.py b/GNN/solver/mates/conversion.py similarity index 100% rename from solver/mates/conversion.py rename to GNN/solver/mates/conversion.py diff --git a/solver/mates/generator.py b/GNN/solver/mates/generator.py similarity index 100% rename from solver/mates/generator.py rename to GNN/solver/mates/generator.py diff --git a/solver/mates/labeling.py b/GNN/solver/mates/labeling.py similarity index 100% rename from solver/mates/labeling.py rename to GNN/solver/mates/labeling.py diff --git a/solver/mates/patterns.py b/GNN/solver/mates/patterns.py similarity index 100% rename from solver/mates/patterns.py rename to GNN/solver/mates/patterns.py diff --git a/solver/mates/primitives.py b/GNN/solver/mates/primitives.py similarity index 100% rename from solver/mates/primitives.py rename to GNN/solver/mates/primitives.py diff --git a/solver/models/__init__.py b/GNN/solver/models/__init__.py similarity index 100% rename from solver/models/__init__.py rename to GNN/solver/models/__init__.py diff --git a/solver/training/__init__.py b/GNN/solver/training/__init__.py similarity index 100% rename from solver/training/__init__.py rename to GNN/solver/training/__init__.py diff --git a/testapp/00backhoe.asmt b/GNN/testapp/00backhoe.asmt similarity index 100% rename from testapp/00backhoe.asmt rename to GNN/testapp/00backhoe.asmt diff --git a/testapp/00camrocker.asmt b/GNN/testapp/00camrocker.asmt similarity index 100% rename from testapp/00camrocker.asmt rename to GNN/testapp/00camrocker.asmt diff --git a/testapp/CrankSlider2.mbd b/GNN/testapp/CrankSlider2.mbd similarity index 100% rename from testapp/CrankSlider2.mbd rename to GNN/testapp/CrankSlider2.mbd diff --git a/testapp/CylSphJt.asmt b/GNN/testapp/CylSphJt.asmt similarity index 100% rename from testapp/CylSphJt.asmt rename to GNN/testapp/CylSphJt.asmt diff --git a/testapp/Gears.asmt b/GNN/testapp/Gears.asmt similarity index 100% rename from testapp/Gears.asmt rename to GNN/testapp/Gears.asmt diff --git a/testapp/InitialConditions.mbd b/GNN/testapp/InitialConditions.mbd similarity index 100% rename from testapp/InitialConditions.mbd rename to GNN/testapp/InitialConditions.mbd diff --git a/testapp/JB_2bars.asmt b/GNN/testapp/JB_2bars.asmt similarity index 100% rename from testapp/JB_2bars.asmt rename to GNN/testapp/JB_2bars.asmt diff --git a/testapp/RevCylJt.asmt b/GNN/testapp/RevCylJt.asmt similarity index 100% rename from testapp/RevCylJt.asmt rename to GNN/testapp/RevCylJt.asmt diff --git a/testapp/RevRevJt.asmt b/GNN/testapp/RevRevJt.asmt similarity index 100% rename from testapp/RevRevJt.asmt rename to GNN/testapp/RevRevJt.asmt diff --git a/testapp/Schmidt_Coupling_Ass_1-1.asmt b/GNN/testapp/Schmidt_Coupling_Ass_1-1.asmt similarity index 100% rename from testapp/Schmidt_Coupling_Ass_1-1.asmt rename to GNN/testapp/Schmidt_Coupling_Ass_1-1.asmt diff --git a/testapp/Schmidt_Coupling_Ass_1-2.asmt b/GNN/testapp/Schmidt_Coupling_Ass_1-2.asmt similarity index 100% rename from testapp/Schmidt_Coupling_Ass_1-2.asmt rename to GNN/testapp/Schmidt_Coupling_Ass_1-2.asmt diff --git a/testapp/Schmidt_Coupling_Ass_1a.asmt b/GNN/testapp/Schmidt_Coupling_Ass_1a.asmt similarity index 100% rename from testapp/Schmidt_Coupling_Ass_1a.asmt rename to GNN/testapp/Schmidt_Coupling_Ass_1a.asmt diff --git a/testapp/SphSphJt.asmt b/GNN/testapp/SphSphJt.asmt similarity index 100% rename from testapp/SphSphJt.asmt rename to GNN/testapp/SphSphJt.asmt diff --git a/testapp/SphericalHinge.mbd b/GNN/testapp/SphericalHinge.mbd similarity index 100% rename from testapp/SphericalHinge.mbd rename to GNN/testapp/SphericalHinge.mbd diff --git a/testapp/__cubes.asmt b/GNN/testapp/__cubes.asmt similarity index 100% rename from testapp/__cubes.asmt rename to GNN/testapp/__cubes.asmt diff --git a/testapp/anglejoint.asmt b/GNN/testapp/anglejoint.asmt similarity index 100% rename from testapp/anglejoint.asmt rename to GNN/testapp/anglejoint.asmt diff --git a/testapp/camfollower.asmt b/GNN/testapp/camfollower.asmt similarity index 100% rename from testapp/camfollower.asmt rename to GNN/testapp/camfollower.asmt diff --git a/testapp/circular.asmt b/GNN/testapp/circular.asmt similarity index 100% rename from testapp/circular.asmt rename to GNN/testapp/circular.asmt diff --git a/testapp/circularPendulum.asmt b/GNN/testapp/circularPendulum.asmt similarity index 100% rename from testapp/circularPendulum.asmt rename to GNN/testapp/circularPendulum.asmt diff --git a/testapp/cirpendu.asmt b/GNN/testapp/cirpendu.asmt similarity index 100% rename from testapp/cirpendu.asmt rename to GNN/testapp/cirpendu.asmt diff --git a/testapp/cirpendu2.asmt b/GNN/testapp/cirpendu2.asmt similarity index 100% rename from testapp/cirpendu2.asmt rename to GNN/testapp/cirpendu2.asmt diff --git a/testapp/coastharbor2.asmt b/GNN/testapp/coastharbor2.asmt similarity index 100% rename from testapp/coastharbor2.asmt rename to GNN/testapp/coastharbor2.asmt diff --git a/testapp/constvel.asmt b/GNN/testapp/constvel.asmt similarity index 100% rename from testapp/constvel.asmt rename to GNN/testapp/constvel.asmt diff --git a/testapp/crank_slider.asmt b/GNN/testapp/crank_slider.asmt similarity index 100% rename from testapp/crank_slider.asmt rename to GNN/testapp/crank_slider.asmt diff --git a/testapp/crank_slider.mbd b/GNN/testapp/crank_slider.mbd similarity index 100% rename from testapp/crank_slider.mbd rename to GNN/testapp/crank_slider.mbd diff --git a/testapp/crank_sliderX.mbd b/GNN/testapp/crank_sliderX.mbd similarity index 100% rename from testapp/crank_sliderX.mbd rename to GNN/testapp/crank_sliderX.mbd diff --git a/testapp/dragCrankSlider.asmt b/GNN/testapp/dragCrankSlider.asmt similarity index 100% rename from testapp/dragCrankSlider.asmt rename to GNN/testapp/dragCrankSlider.asmt diff --git a/testapp/dragging.log b/GNN/testapp/dragging.log similarity index 100% rename from testapp/dragging.log rename to GNN/testapp/dragging.log diff --git a/testapp/draggingBackhoe1.log b/GNN/testapp/draggingBackhoe1.log similarity index 100% rename from testapp/draggingBackhoe1.log rename to GNN/testapp/draggingBackhoe1.log diff --git a/testapp/draggingBackhoe2.log b/GNN/testapp/draggingBackhoe2.log similarity index 100% rename from testapp/draggingBackhoe2.log rename to GNN/testapp/draggingBackhoe2.log diff --git a/testapp/draggingBackhoe3.log b/GNN/testapp/draggingBackhoe3.log similarity index 100% rename from testapp/draggingBackhoe3.log rename to GNN/testapp/draggingBackhoe3.log diff --git a/testapp/dxfmotion.asmt b/GNN/testapp/dxfmotion.asmt similarity index 100% rename from testapp/dxfmotion.asmt rename to GNN/testapp/dxfmotion.asmt diff --git a/testapp/dxftree.asmt b/GNN/testapp/dxftree.asmt similarity index 100% rename from testapp/dxftree.asmt rename to GNN/testapp/dxftree.asmt diff --git a/testapp/engine1.asmt b/GNN/testapp/engine1.asmt similarity index 100% rename from testapp/engine1.asmt rename to GNN/testapp/engine1.asmt diff --git a/testapp/fixplnplnpln.asmt b/GNN/testapp/fixplnplnpln.asmt similarity index 100% rename from testapp/fixplnplnpln.asmt rename to GNN/testapp/fixplnplnpln.asmt diff --git a/testapp/fixplnplnplnNoOffset.asmt b/GNN/testapp/fixplnplnplnNoOffset.asmt similarity index 100% rename from testapp/fixplnplnplnNoOffset.asmt rename to GNN/testapp/fixplnplnplnNoOffset.asmt diff --git a/testapp/fourbar.asmt b/GNN/testapp/fourbar.asmt similarity index 100% rename from testapp/fourbar.asmt rename to GNN/testapp/fourbar.asmt diff --git a/testapp/fourbot.asmt b/GNN/testapp/fourbot.asmt similarity index 100% rename from testapp/fourbot.asmt rename to GNN/testapp/fourbot.asmt diff --git a/testapp/gyro.asmt b/GNN/testapp/gyro.asmt similarity index 100% rename from testapp/gyro.asmt rename to GNN/testapp/gyro.asmt diff --git a/testapp/limits.asmt b/GNN/testapp/limits.asmt similarity index 100% rename from testapp/limits.asmt rename to GNN/testapp/limits.asmt diff --git a/testapp/mateproblembobcat.asmt b/GNN/testapp/mateproblembobcat.asmt similarity index 100% rename from testapp/mateproblembobcat.asmt rename to GNN/testapp/mateproblembobcat.asmt diff --git a/testapp/parm.asmt b/GNN/testapp/parm.asmt similarity index 100% rename from testapp/parm.asmt rename to GNN/testapp/parm.asmt diff --git a/testapp/part32.asmt b/GNN/testapp/part32.asmt similarity index 100% rename from testapp/part32.asmt rename to GNN/testapp/part32.asmt diff --git a/testapp/piston.asmt b/GNN/testapp/piston.asmt similarity index 100% rename from testapp/piston.asmt rename to GNN/testapp/piston.asmt diff --git a/testapp/pistonAllowZRotation.asmt b/GNN/testapp/pistonAllowZRotation.asmt similarity index 100% rename from testapp/pistonAllowZRotation.asmt rename to GNN/testapp/pistonAllowZRotation.asmt diff --git a/testapp/pistonWithLimits.asmt b/GNN/testapp/pistonWithLimits.asmt similarity index 100% rename from testapp/pistonWithLimits.asmt rename to GNN/testapp/pistonWithLimits.asmt diff --git a/testapp/planarbug.asmt b/GNN/testapp/planarbug.asmt similarity index 100% rename from testapp/planarbug.asmt rename to GNN/testapp/planarbug.asmt diff --git a/testapp/quasikine.asmt b/GNN/testapp/quasikine.asmt similarity index 100% rename from testapp/quasikine.asmt rename to GNN/testapp/quasikine.asmt diff --git a/testapp/rackPinion.asmt b/GNN/testapp/rackPinion.asmt similarity index 100% rename from testapp/rackPinion.asmt rename to GNN/testapp/rackPinion.asmt diff --git a/testapp/rackPinion3.asmt b/GNN/testapp/rackPinion3.asmt similarity index 100% rename from testapp/rackPinion3.asmt rename to GNN/testapp/rackPinion3.asmt diff --git a/testapp/rackscrew.asmt b/GNN/testapp/rackscrew.asmt similarity index 100% rename from testapp/rackscrew.asmt rename to GNN/testapp/rackscrew.asmt diff --git a/testapp/robot.asmt b/GNN/testapp/robot.asmt similarity index 100% rename from testapp/robot.asmt rename to GNN/testapp/robot.asmt diff --git a/testapp/runPreDrag.asmt b/GNN/testapp/runPreDrag.asmt similarity index 100% rename from testapp/runPreDrag.asmt rename to GNN/testapp/runPreDrag.asmt diff --git a/testapp/runPreDragBackhoe1.asmt b/GNN/testapp/runPreDragBackhoe1.asmt similarity index 100% rename from testapp/runPreDragBackhoe1.asmt rename to GNN/testapp/runPreDragBackhoe1.asmt diff --git a/testapp/runPreDragBackhoe2.asmt b/GNN/testapp/runPreDragBackhoe2.asmt similarity index 100% rename from testapp/runPreDragBackhoe2.asmt rename to GNN/testapp/runPreDragBackhoe2.asmt diff --git a/testapp/runPreDragBackhoe3.asmt b/GNN/testapp/runPreDragBackhoe3.asmt similarity index 100% rename from testapp/runPreDragBackhoe3.asmt rename to GNN/testapp/runPreDragBackhoe3.asmt diff --git a/testapp/wobpump.asmt b/GNN/testapp/wobpump.asmt similarity index 100% rename from testapp/wobpump.asmt rename to GNN/testapp/wobpump.asmt diff --git a/tests/CMakeLists.txt b/GNN/tests/CMakeLists.txt similarity index 100% rename from tests/CMakeLists.txt rename to GNN/tests/CMakeLists.txt diff --git a/tests/__init__.py b/GNN/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to GNN/tests/__init__.py diff --git a/tests/datagen/__init__.py b/GNN/tests/datagen/__init__.py similarity index 100% rename from tests/datagen/__init__.py rename to GNN/tests/datagen/__init__.py diff --git a/tests/datagen/test_analysis.py b/GNN/tests/datagen/test_analysis.py similarity index 100% rename from tests/datagen/test_analysis.py rename to GNN/tests/datagen/test_analysis.py diff --git a/tests/datagen/test_dataset.py b/GNN/tests/datagen/test_dataset.py similarity index 100% rename from tests/datagen/test_dataset.py rename to GNN/tests/datagen/test_dataset.py diff --git a/tests/datagen/test_generator.py b/GNN/tests/datagen/test_generator.py similarity index 100% rename from tests/datagen/test_generator.py rename to GNN/tests/datagen/test_generator.py diff --git a/tests/datagen/test_jacobian.py b/GNN/tests/datagen/test_jacobian.py similarity index 100% rename from tests/datagen/test_jacobian.py rename to GNN/tests/datagen/test_jacobian.py diff --git a/tests/datagen/test_labeling.py b/GNN/tests/datagen/test_labeling.py similarity index 100% rename from tests/datagen/test_labeling.py rename to GNN/tests/datagen/test_labeling.py diff --git a/tests/datagen/test_pebble_game.py b/GNN/tests/datagen/test_pebble_game.py similarity index 100% rename from tests/datagen/test_pebble_game.py rename to GNN/tests/datagen/test_pebble_game.py diff --git a/tests/datagen/test_types.py b/GNN/tests/datagen/test_types.py similarity index 100% rename from tests/datagen/test_types.py rename to GNN/tests/datagen/test_types.py diff --git a/tests/mates/__init__.py b/GNN/tests/mates/__init__.py similarity index 100% rename from tests/mates/__init__.py rename to GNN/tests/mates/__init__.py diff --git a/tests/mates/test_conversion.py b/GNN/tests/mates/test_conversion.py similarity index 100% rename from tests/mates/test_conversion.py rename to GNN/tests/mates/test_conversion.py diff --git a/tests/mates/test_generator.py b/GNN/tests/mates/test_generator.py similarity index 100% rename from tests/mates/test_generator.py rename to GNN/tests/mates/test_generator.py diff --git a/tests/mates/test_labeling.py b/GNN/tests/mates/test_labeling.py similarity index 100% rename from tests/mates/test_labeling.py rename to GNN/tests/mates/test_labeling.py diff --git a/tests/mates/test_patterns.py b/GNN/tests/mates/test_patterns.py similarity index 100% rename from tests/mates/test_patterns.py rename to GNN/tests/mates/test_patterns.py diff --git a/tests/mates/test_primitives.py b/GNN/tests/mates/test_primitives.py similarity index 100% rename from tests/mates/test_primitives.py rename to GNN/tests/mates/test_primitives.py diff --git a/tests/packages.config b/GNN/tests/packages.config similarity index 100% rename from tests/packages.config rename to GNN/tests/packages.config diff --git a/tests/pch.cpp b/GNN/tests/pch.cpp similarity index 100% rename from tests/pch.cpp rename to GNN/tests/pch.cpp diff --git a/tests/pch.h b/GNN/tests/pch.h similarity index 100% rename from tests/pch.h rename to GNN/tests/pch.h diff --git a/tests/test.cpp b/GNN/tests/test.cpp similarity index 100% rename from tests/test.cpp rename to GNN/tests/test.cpp diff --git a/tests/tests.vcxproj b/GNN/tests/tests.vcxproj similarity index 100% rename from tests/tests.vcxproj rename to GNN/tests/tests.vcxproj diff --git a/tests/tests.vcxproj.user b/GNN/tests/tests.vcxproj.user similarity index 100% rename from tests/tests.vcxproj.user rename to GNN/tests/tests.vcxproj.user diff --git a/Init.py b/Init.py new file mode 100644 index 0000000..d604339 --- /dev/null +++ b/Init.py @@ -0,0 +1,12 @@ +"""Register the Kindred solver with the KCSolve solver registry.""" + +import FreeCAD + +try: + import kcsolve + from kindred_solver import KindredSolver + + kcsolve.register_solver("kindred", KindredSolver) + FreeCAD.Console.PrintLog("kindred-solver registered\n") +except Exception as exc: + FreeCAD.Console.PrintWarning(f"kindred-solver: registration failed: {exc}\n") diff --git a/README.md b/README.md index 17e5095..2599914 100644 --- a/README.md +++ b/README.md @@ -1,91 +1,64 @@ # Kindred Solver -Assembly constraint solver for [Kindred Create](https://git.kindred-systems.com/kindred/create). Combines a numerical multibody dynamics engine (OndselSolver) with a GNN-based constraint prediction layer. +Assembly constraint solver addon for [Kindred Create](https://git.kindred-systems.com/kindred/create). Implements the `IKCSolver` interface via `kcsolve.register_solver()`. ## Components -### OndselSolver (C++) +### Kindred Solver (Phase 1) -Numerical assembly constraint solver using multibody dynamics. Solves joint constraints between rigid bodies using a Newton-Raphson iterative approach. Used by FreeCAD's Assembly workbench as the backend solver. +Expression-based Newton-Raphson constraint solver. Pure Python, registered as a Create addon. -- Source: `OndselSolver/` -- Entry point: `OndselSolverMain/` -- Tests: `tests/`, `testapp/` -- Build: CMake +- Expression DAG with eval, symbolic differentiation, simplification: `kindred_solver/expr.py` +- Parameter table with fixed/free tracking: `kindred_solver/params.py` +- Quaternion rotation as polynomial Expr trees: `kindred_solver/quat.py` +- RigidBody entity (7 params: position + unit quaternion): `kindred_solver/entities.py` +- Constraint residual generators (Coincident, DistancePointPoint, Fixed): `kindred_solver/constraints.py` +- Newton-Raphson solver with symbolic Jacobian: `kindred_solver/newton.py` +- Pre-solve passes (substitution, single-equation): `kindred_solver/prepass.py` +- DOF counting via Jacobian rank: `kindred_solver/dof.py` +- KCSolve IKCSolver bridge: `kindred_solver/solver.py` -**Theory:** [MbDTheory](https://github.com/Ondsel-Development/MbDTheory) +### GNN (future phases) -#### Building +Graph neural network constraint prediction layer. OndselSolver C++ engine and ML training infrastructure. Moved to `GNN/` — will be integrated in later phases. + +## Create Addon Integration + +This repo is a git submodule at `mods/solver/` in the Create repository. The addon loader discovers `package.xml` and executes `Init.py`, which registers the solver: + +```python +import kcsolve +from kindred_solver import KindredSolver +kcsolve.register_solver("kindred", KindredSolver) +``` + +## Testing ```bash -cmake -B build -DCMAKE_BUILD_TYPE=Release -cmake --build build +python3 -m venv .venv && . .venv/bin/activate +pip install pytest numpy +PYTHONPATH=. pytest tests/ -v ``` -### ML Solver Layer (Python) - -Graph neural network that predicts constraint independence and per-body degrees of freedom. Trained on synthetic assembly data generated via the pebble game algorithm, with the goal of augmenting or replacing the numerical solver for common assembly patterns. - -- Core library: `solver/` -- Data generation: `solver/datagen/` (pebble game, synthetic assemblies, labeling) -- Model architectures: `solver/models/` (GIN, GAT, NNConv) -- Training: `solver/training/` -- Inference: `solver/inference/` -- FreeCAD integration: `freecad/` -- Configuration: `configs/` (Hydra) - -#### Setup - -```bash -pip install -e ".[train,dev]" -pre-commit install -``` - -#### Usage - -```bash -make help # show all targets -make dev # install all deps + pre-commit hooks -make test # run tests -make lint # run ruff linter -make check # lint + type-check + test -make data-gen # generate synthetic data -make train # run training -make export # export model -``` - -Docker is also supported: - -```bash -docker compose up train # GPU training -docker compose up test # run tests -docker compose up data-gen # generate synthetic data -``` - -## Repository structure +## Repository Structure ``` -kindred-solver/ -├── OndselSolver/ # C++ numerical solver library -├── OndselSolverMain/ # C++ solver CLI entry point -├── tests/ # C++ unit tests + Python tests -├── testapp/ # C++ test application -├── solver/ # Python ML solver library -│ ├── datagen/ # Synthetic data generation (pebble game) -│ ├── datasets/ # PyG dataset adapters -│ ├── models/ # GNN architectures -│ ├── training/ # Training loops -│ ├── evaluation/ # Metrics and visualization -│ └── inference/ # Runtime prediction API -├── freecad/ # FreeCAD workbench integration -├── configs/ # Hydra configs (dataset, model, training, export) -├── scripts/ # CLI utilities -├── data/ # Datasets (not committed) -├── export/ # Model packaging -└── docs/ # Documentation +├── package.xml # Create addon manifest +├── Init.py # Solver registration entry point +├── kindred_solver/ # Phase 1: expression-based Newton solver +│ ├── expr.py # Expression DAG +│ ├── params.py # Parameter table +│ ├── quat.py # Quaternion math as Expr trees +│ ├── entities.py # RigidBody entity +│ ├── constraints.py # Constraint residual generators +│ ├── newton.py # Newton-Raphson solver +│ ├── prepass.py # Pre-solve passes +│ ├── dof.py # DOF counting +│ └── solver.py # IKCSolver bridge +├── tests/ # Unit tests (82 tests) +└── GNN/ # GNN solver layer (future phases) ``` ## License -OndselSolver: LGPL-2.1-or-later (see [LICENSE](LICENSE)) -ML Solver Layer: Apache-2.0 +LGPL-2.1-or-later (see [LICENSE](LICENSE)) diff --git a/kindred_solver/__init__.py b/kindred_solver/__init__.py new file mode 100644 index 0000000..a03fc32 --- /dev/null +++ b/kindred_solver/__init__.py @@ -0,0 +1,12 @@ +__version__ = "0.1.0" + + +def __getattr__(name): + if name == "KindredSolver": + from .solver import KindredSolver + + return KindredSolver + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +__all__ = ["KindredSolver"] diff --git a/kindred_solver/constraints.py b/kindred_solver/constraints.py new file mode 100644 index 0000000..aeec351 --- /dev/null +++ b/kindred_solver/constraints.py @@ -0,0 +1,181 @@ +"""Constraint classes that produce residual Expr lists. + +Each constraint takes two RigidBody entities and marker transforms, +then generates residual expressions that equal zero when satisfied. +""" + +from __future__ import annotations + +from typing import List + +from .entities import RigidBody +from .expr import Const, Expr + + +class ConstraintBase: + """Abstract constraint producing residual expressions.""" + + def residuals(self) -> List[Expr]: + raise NotImplementedError + + +class CoincidentConstraint(ConstraintBase): + """Point-on-point: marker origin on body_i == marker origin on body_j. + + 3 residuals: dx, dy, dz. + """ + + def __init__( + self, + body_i: RigidBody, + marker_i_pos: tuple[float, float, float], + body_j: RigidBody, + marker_j_pos: tuple[float, float, float], + ): + self.body_i = body_i + self.body_j = body_j + self.marker_i_pos = marker_i_pos + self.marker_j_pos = marker_j_pos + + def residuals(self) -> List[Expr]: + wx_i, wy_i, wz_i = self.body_i.world_point(*self.marker_i_pos) + wx_j, wy_j, wz_j = self.body_j.world_point(*self.marker_j_pos) + return [wx_i - wx_j, wy_i - wy_j, wz_i - wz_j] + + +class DistancePointPointConstraint(ConstraintBase): + """Point-to-point distance: ||p_i - p_j||^2 = d^2. + + 1 residual (squared form avoids sqrt in Jacobian). + """ + + def __init__( + self, + body_i: RigidBody, + marker_i_pos: tuple[float, float, float], + body_j: RigidBody, + marker_j_pos: tuple[float, float, float], + distance: float, + ): + self.body_i = body_i + self.body_j = body_j + self.marker_i_pos = marker_i_pos + self.marker_j_pos = marker_j_pos + self.distance = distance + + def residuals(self) -> List[Expr]: + wx_i, wy_i, wz_i = self.body_i.world_point(*self.marker_i_pos) + wx_j, wy_j, wz_j = self.body_j.world_point(*self.marker_j_pos) + dx = wx_i - wx_j + dy = wy_i - wy_j + dz = wz_i - wz_j + d2 = dx * dx + dy * dy + dz * dz + return [d2 - Const(self.distance * self.distance)] + + +class FixedConstraint(ConstraintBase): + """Lock all 6 DOF of body_j relative to body_i. + + Position: 3 residuals (marker origins coincide). + Orientation: 3 residuals from relative quaternion (imaginary part == 0 + when orientations match). The quaternion normalization constraint + handles the 4th equation. + + The reference relative quaternion q_ref = conj(q_i_marker) * q_j_marker + is computed from the marker quaternions at constraint creation time. + At solve time: q_rel = conj(q_i_world * q_i_marker) * (q_j_world * q_j_marker) + Residual = imaginary part of (conj(q_ref) * q_rel). + """ + + def __init__( + self, + body_i: RigidBody, + marker_i_pos: tuple[float, float, float], + marker_i_quat: tuple[float, float, float, float], + body_j: RigidBody, + marker_j_pos: tuple[float, float, float], + marker_j_quat: tuple[float, float, float, float], + ): + self.body_i = body_i + self.body_j = body_j + self.marker_i_pos = marker_i_pos + self.marker_i_quat = marker_i_quat + self.marker_j_pos = marker_j_pos + self.marker_j_quat = marker_j_quat + + def residuals(self) -> List[Expr]: + # Position residuals — same as Coincident + wx_i, wy_i, wz_i = self.body_i.world_point(*self.marker_i_pos) + wx_j, wy_j, wz_j = self.body_j.world_point(*self.marker_j_pos) + pos_res = [wx_i - wx_j, wy_i - wy_j, wz_i - wz_j] + + # Orientation residuals via quaternion error + # q_i_total = q_body_i * q_marker_i (as Expr) + # q_j_total = q_body_j * q_marker_j + # q_error = conj(q_i_total) * q_j_total + # We want q_error ≈ identity → imaginary parts ≈ 0 + qi = _quat_mul_const( + self.body_i.qw, + self.body_i.qx, + self.body_i.qy, + self.body_i.qz, + *self.marker_i_quat, + ) + qj = _quat_mul_const( + self.body_j.qw, + self.body_j.qx, + self.body_j.qy, + self.body_j.qz, + *self.marker_j_quat, + ) + # conj(qi) * qj + err = _quat_mul_expr( + qi[0], + -qi[1], + -qi[2], + -qi[3], # conjugate + qj[0], + qj[1], + qj[2], + qj[3], + ) + # err should be (1, 0, 0, 0) — residuals are the imaginary parts + ori_res = [err[1], err[2], err[3]] + + return pos_res + ori_res + + +# -- quaternion multiplication helpers ---------------------------------------- + + +def _quat_mul_const( + aw: Expr, + ax: Expr, + ay: Expr, + az: Expr, + bw: float, + bx: float, + by: float, + bz: float, +) -> tuple[Expr, Expr, Expr, Expr]: + """Multiply Expr quaternion (a) by constant quaternion (b).""" + cbw, cbx, cby, cbz = Const(bw), Const(bx), Const(by), Const(bz) + return _quat_mul_expr(aw, ax, ay, az, cbw, cbx, cby, cbz) + + +def _quat_mul_expr( + aw: Expr, + ax: Expr, + ay: Expr, + az: Expr, + bw: Expr, + bx: Expr, + by: Expr, + bz: Expr, +) -> tuple[Expr, Expr, Expr, Expr]: + """Hamilton product of two Expr quaternions.""" + rw = aw * bw - ax * bx - ay * by - az * bz + rx = aw * bx + ax * bw + ay * bz - az * by + ry = aw * by - ax * bz + ay * bw + az * bx + rz = aw * bz + ax * by - ay * bx + az * bw + return rw, rx, ry, rz diff --git a/kindred_solver/dof.py b/kindred_solver/dof.py new file mode 100644 index 0000000..6ec5f8d --- /dev/null +++ b/kindred_solver/dof.py @@ -0,0 +1,45 @@ +"""Degrees-of-freedom counting via Jacobian rank.""" + +from __future__ import annotations + +from typing import List + +import numpy as np + +from .expr import Expr +from .params import ParamTable + + +def count_dof( + residuals: List[Expr], + params: ParamTable, + rank_tol: float = 1e-8, +) -> int: + """Compute DOF = n_free_params - rank(Jacobian). + + Evaluates the Jacobian numerically at the current parameter values + and computes its rank via SVD. + """ + free = params.free_names() + n_free = len(free) + n_res = len(residuals) + + if n_free == 0: + return 0 + if n_res == 0: + return n_free + + env = params.get_env() + + J = np.empty((n_res, n_free)) + for i, r in enumerate(residuals): + for j, name in enumerate(free): + J[i, j] = r.diff(name).simplify().eval(env) + + if J.size == 0: + return n_free + + sv = np.linalg.svd(J, compute_uv=False) + rank = int(np.sum(sv > rank_tol)) + + return n_free - rank diff --git a/kindred_solver/entities.py b/kindred_solver/entities.py new file mode 100644 index 0000000..2375299 --- /dev/null +++ b/kindred_solver/entities.py @@ -0,0 +1,88 @@ +"""Geometric entities that own solver parameters. + +Phase 1 provides RigidBody — a 7-DOF entity (position + unit quaternion). +""" + +from __future__ import annotations + +from .expr import Const, Expr +from .params import ParamTable +from .quat import world_point as _world_point + + +class RigidBody: + """A rigid body with 7 parameters: tx, ty, tz, qw, qx, qy, qz. + + Grounded bodies have all parameters marked fixed. + """ + + def __init__( + self, + part_id: str, + params: ParamTable, + position: tuple[float, float, float], + quaternion: tuple[float, float, float, float], + grounded: bool = False, + ): + self.part_id = part_id + self.grounded = grounded + + pfx = part_id + "/" + self.tx = params.add(pfx + "tx", position[0], fixed=grounded) + self.ty = params.add(pfx + "ty", position[1], fixed=grounded) + self.tz = params.add(pfx + "tz", position[2], fixed=grounded) + # quaternion: (w, x, y, z) — matches KCSolve convention + self.qw = params.add(pfx + "qw", quaternion[0], fixed=grounded) + self.qx = params.add(pfx + "qx", quaternion[1], fixed=grounded) + self.qy = params.add(pfx + "qy", quaternion[2], fixed=grounded) + self.qz = params.add(pfx + "qz", quaternion[3], fixed=grounded) + + self._param_names = [ + pfx + "tx", + pfx + "ty", + pfx + "tz", + pfx + "qw", + pfx + "qx", + pfx + "qy", + pfx + "qz", + ] + + def world_point(self, lx: float, ly: float, lz: float) -> tuple[Expr, Expr, Expr]: + """Transform a local-frame point to world-frame Expr triple.""" + return _world_point( + self.tx, + self.ty, + self.tz, + self.qw, + self.qx, + self.qy, + self.qz, + lx, + ly, + lz, + ) + + def quat_norm_residual(self) -> Expr: + """qw^2 + qx^2 + qy^2 + qz^2 - 1. Added as a constraint.""" + return ( + self.qw * self.qw + + self.qx * self.qx + + self.qy * self.qy + + self.qz * self.qz + - Const(1.0) + ) + + def quat_param_names(self) -> tuple[str, str, str, str]: + """Return the 4 quaternion parameter names (for renormalization).""" + pfx = self.part_id + "/" + return pfx + "qw", pfx + "qx", pfx + "qy", pfx + "qz" + + def extract_position(self, env: dict[str, float]) -> tuple[float, float, float]: + pfx = self.part_id + "/" + return env[pfx + "tx"], env[pfx + "ty"], env[pfx + "tz"] + + def extract_quaternion( + self, env: dict[str, float] + ) -> tuple[float, float, float, float]: + pfx = self.part_id + "/" + return env[pfx + "qw"], env[pfx + "qx"], env[pfx + "qy"], env[pfx + "qz"] diff --git a/kindred_solver/expr.py b/kindred_solver/expr.py new file mode 100644 index 0000000..7ed19d1 --- /dev/null +++ b/kindred_solver/expr.py @@ -0,0 +1,424 @@ +"""Immutable expression DAG with eval, symbolic differentiation, and simplification.""" + +from __future__ import annotations + +import math +from typing import Dict + + +class Expr: + """Base class for all expression nodes.""" + + __slots__ = () + + def eval(self, env: Dict[str, float]) -> float: + raise NotImplementedError + + def diff(self, var: str) -> Expr: + raise NotImplementedError + + def simplify(self) -> Expr: + return self + + def vars(self) -> set[str]: + """Return the set of variable names in this expression.""" + raise NotImplementedError + + # -- operator overloads -------------------------------------------------- + + def __add__(self, other): + return Add(self, _wrap(other)) + + def __radd__(self, other): + return Add(_wrap(other), self) + + def __sub__(self, other): + return Sub(self, _wrap(other)) + + def __rsub__(self, other): + return Sub(_wrap(other), self) + + def __mul__(self, other): + return Mul(self, _wrap(other)) + + def __rmul__(self, other): + return Mul(_wrap(other), self) + + def __truediv__(self, other): + return Div(self, _wrap(other)) + + def __rtruediv__(self, other): + return Div(_wrap(other), self) + + def __neg__(self): + return Neg(self) + + def __pow__(self, other): + return Pow(self, _wrap(other)) + + def __rpow__(self, other): + return Pow(_wrap(other), self) + + +def _wrap(x) -> Expr: + """Coerce a number to Const.""" + if isinstance(x, Expr): + return x + if isinstance(x, (int, float)): + return Const(float(x)) + raise TypeError(f"Cannot coerce {type(x).__name__} to Expr") + + +# -- leaf nodes --------------------------------------------------------------- + + +class Const(Expr): + __slots__ = ("value",) + + def __init__(self, value: float): + self.value = float(value) + + def eval(self, env): + return self.value + + def diff(self, var): + return ZERO + + def simplify(self): + return self + + def vars(self): + return set() + + def __repr__(self): + return f"Const({self.value})" + + def __eq__(self, other): + return isinstance(other, Const) and self.value == other.value + + def __hash__(self): + return hash(("Const", self.value)) + + +class Var(Expr): + __slots__ = ("name",) + + def __init__(self, name: str): + self.name = name + + def eval(self, env): + return env[self.name] + + def diff(self, var): + return ONE if var == self.name else ZERO + + def simplify(self): + return self + + def vars(self): + return {self.name} + + def __repr__(self): + return f"Var({self.name!r})" + + def __eq__(self, other): + return isinstance(other, Var) and self.name == other.name + + def __hash__(self): + return hash(("Var", self.name)) + + +# -- unary nodes -------------------------------------------------------------- + + +class Neg(Expr): + __slots__ = ("child",) + + def __init__(self, child: Expr): + self.child = child + + def eval(self, env): + return -self.child.eval(env) + + def diff(self, var): + return Neg(self.child.diff(var)) + + def simplify(self): + c = self.child.simplify() + if isinstance(c, Const): + return Const(-c.value) + if isinstance(c, Neg): + return c.child + return Neg(c) + + def vars(self): + return self.child.vars() + + def __repr__(self): + return f"Neg({self.child!r})" + + +class Sin(Expr): + __slots__ = ("child",) + + def __init__(self, child: Expr): + self.child = child + + def eval(self, env): + return math.sin(self.child.eval(env)) + + def diff(self, var): + # d/dx sin(f) = cos(f) * f' + return Mul(Cos(self.child), self.child.diff(var)) + + def simplify(self): + c = self.child.simplify() + if isinstance(c, Const): + return Const(math.sin(c.value)) + return Sin(c) + + def vars(self): + return self.child.vars() + + def __repr__(self): + return f"Sin({self.child!r})" + + +class Cos(Expr): + __slots__ = ("child",) + + def __init__(self, child: Expr): + self.child = child + + def eval(self, env): + return math.cos(self.child.eval(env)) + + def diff(self, var): + # d/dx cos(f) = -sin(f) * f' + return Mul(Neg(Sin(self.child)), self.child.diff(var)) + + def simplify(self): + c = self.child.simplify() + if isinstance(c, Const): + return Const(math.cos(c.value)) + return Cos(c) + + def vars(self): + return self.child.vars() + + def __repr__(self): + return f"Cos({self.child!r})" + + +class Sqrt(Expr): + __slots__ = ("child",) + + def __init__(self, child: Expr): + self.child = child + + def eval(self, env): + return math.sqrt(self.child.eval(env)) + + def diff(self, var): + # d/dx sqrt(f) = f' / (2 * sqrt(f)) + return Div(self.child.diff(var), Mul(Const(2.0), Sqrt(self.child))) + + def simplify(self): + c = self.child.simplify() + if isinstance(c, Const) and c.value >= 0: + return Const(math.sqrt(c.value)) + return Sqrt(c) + + def vars(self): + return self.child.vars() + + def __repr__(self): + return f"Sqrt({self.child!r})" + + +# -- binary nodes ------------------------------------------------------------- + + +class Add(Expr): + __slots__ = ("a", "b") + + def __init__(self, a: Expr, b: Expr): + self.a = a + self.b = b + + def eval(self, env): + return self.a.eval(env) + self.b.eval(env) + + def diff(self, var): + return Add(self.a.diff(var), self.b.diff(var)) + + def simplify(self): + a = self.a.simplify() + b = self.b.simplify() + if isinstance(a, Const) and isinstance(b, Const): + return Const(a.value + b.value) + if isinstance(a, Const) and a.value == 0.0: + return b + if isinstance(b, Const) and b.value == 0.0: + return a + return Add(a, b) + + def vars(self): + return self.a.vars() | self.b.vars() + + def __repr__(self): + return f"Add({self.a!r}, {self.b!r})" + + +class Sub(Expr): + __slots__ = ("a", "b") + + def __init__(self, a: Expr, b: Expr): + self.a = a + self.b = b + + def eval(self, env): + return self.a.eval(env) - self.b.eval(env) + + def diff(self, var): + return Sub(self.a.diff(var), self.b.diff(var)) + + def simplify(self): + a = self.a.simplify() + b = self.b.simplify() + if isinstance(a, Const) and isinstance(b, Const): + return Const(a.value - b.value) + if isinstance(b, Const) and b.value == 0.0: + return a + if isinstance(a, Const) and a.value == 0.0: + return Neg(b).simplify() + return Sub(a, b) + + def vars(self): + return self.a.vars() | self.b.vars() + + def __repr__(self): + return f"Sub({self.a!r}, {self.b!r})" + + +class Mul(Expr): + __slots__ = ("a", "b") + + def __init__(self, a: Expr, b: Expr): + self.a = a + self.b = b + + def eval(self, env): + return self.a.eval(env) * self.b.eval(env) + + def diff(self, var): + # product rule: a'b + ab' + return Add(Mul(self.a.diff(var), self.b), Mul(self.a, self.b.diff(var))) + + def simplify(self): + a = self.a.simplify() + b = self.b.simplify() + if isinstance(a, Const) and isinstance(b, Const): + return Const(a.value * b.value) + if isinstance(a, Const) and a.value == 0.0: + return ZERO + if isinstance(b, Const) and b.value == 0.0: + return ZERO + if isinstance(a, Const) and a.value == 1.0: + return b + if isinstance(b, Const) and b.value == 1.0: + return a + if isinstance(a, Const) and a.value == -1.0: + return Neg(b).simplify() + if isinstance(b, Const) and b.value == -1.0: + return Neg(a).simplify() + return Mul(a, b) + + def vars(self): + return self.a.vars() | self.b.vars() + + def __repr__(self): + return f"Mul({self.a!r}, {self.b!r})" + + +class Div(Expr): + __slots__ = ("a", "b") + + def __init__(self, a: Expr, b: Expr): + self.a = a + self.b = b + + def eval(self, env): + return self.a.eval(env) / self.b.eval(env) + + def diff(self, var): + # quotient rule: (a'b - ab') / b^2 + return Div( + Sub(Mul(self.a.diff(var), self.b), Mul(self.a, self.b.diff(var))), + Mul(self.b, self.b), + ) + + def simplify(self): + a = self.a.simplify() + b = self.b.simplify() + if isinstance(a, Const) and isinstance(b, Const) and b.value != 0.0: + return Const(a.value / b.value) + if isinstance(a, Const) and a.value == 0.0: + return ZERO + if isinstance(b, Const) and b.value == 1.0: + return a + return Div(a, b) + + def vars(self): + return self.a.vars() | self.b.vars() + + def __repr__(self): + return f"Div({self.a!r}, {self.b!r})" + + +class Pow(Expr): + __slots__ = ("base", "exp") + + def __init__(self, base: Expr, exp: Expr): + self.base = base + self.exp = exp + + def eval(self, env): + return self.base.eval(env) ** self.exp.eval(env) + + def diff(self, var): + # For constant exponent: d/dx f^n = n * f^(n-1) * f' + # General case: d/dx f^g = f^g * (g' * ln(f) + g * f'/f) + # Phase 1: only support constant exponent + if isinstance(self.exp, Const): + n = self.exp.value + return Mul( + Mul(Const(n), Pow(self.base, Const(n - 1.0))), self.base.diff(var) + ) + raise NotImplementedError("diff of Pow with non-constant exponent") + + def simplify(self): + base = self.base.simplify() + exp = self.exp.simplify() + if isinstance(base, Const) and isinstance(exp, Const): + return Const(base.value**exp.value) + if isinstance(exp, Const): + if exp.value == 0.0: + return ONE + if exp.value == 1.0: + return base + if exp.value == 2.0: + return Mul(base, base).simplify() + return Pow(base, exp) + + def vars(self): + return self.base.vars() | self.exp.vars() + + def __repr__(self): + return f"Pow({self.base!r}, {self.exp!r})" + + +# -- sentinels ---------------------------------------------------------------- + +ZERO = Const(0.0) +ONE = Const(1.0) diff --git a/kindred_solver/newton.py b/kindred_solver/newton.py new file mode 100644 index 0000000..94f3710 --- /dev/null +++ b/kindred_solver/newton.py @@ -0,0 +1,116 @@ +"""Newton-Raphson solver with symbolic Jacobian and numpy linear algebra.""" + +from __future__ import annotations + +import math +from typing import List + +import numpy as np + +from .expr import Expr +from .params import ParamTable + + +def newton_solve( + residuals: List[Expr], + params: ParamTable, + quat_groups: List[tuple[str, str, str, str]] | None = None, + max_iter: int = 50, + tol: float = 1e-10, +) -> bool: + """Solve ``residuals == 0`` by Newton-Raphson. + + Parameters + ---------- + residuals: + List of Expr that should each evaluate to zero. + params: + Parameter table with current values as initial guess. + quat_groups: + List of (qw, qx, qy, qz) parameter name tuples. + After each Newton step these are re-normalized to unit length. + max_iter: + Maximum Newton iterations. + tol: + Convergence threshold on ``||r||``. + + Returns True if converged within *max_iter* iterations. + """ + free = params.free_names() + n_free = len(free) + n_res = len(residuals) + + if n_free == 0 or n_res == 0: + return True + + # Build symbolic Jacobian once (list-of-lists of simplified Expr) + jac_exprs: List[List[Expr]] = [] + for r in residuals: + row = [] + for name in free: + row.append(r.diff(name).simplify()) + jac_exprs.append(row) + + for _it in range(max_iter): + env = params.get_env() + + # Evaluate residual vector + r_vec = np.array([r.eval(env) for r in residuals]) + r_norm = np.linalg.norm(r_vec) + if r_norm < tol: + return True + + # Evaluate Jacobian matrix + J = np.empty((n_res, n_free)) + for i in range(n_res): + for j in range(n_free): + J[i, j] = jac_exprs[i][j].eval(env) + + # Solve J @ dx = -r (least-squares handles rank-deficient) + dx, _, _, _ = np.linalg.lstsq(J, -r_vec, rcond=None) + + # Update parameters + x = params.get_free_vector() + x += dx + params.set_free_vector(x) + + # Re-normalize quaternions + if quat_groups: + _renormalize_quats(params, quat_groups) + + # Check final residual + env = params.get_env() + r_vec = np.array([r.eval(env) for r in residuals]) + return np.linalg.norm(r_vec) < tol + + +def _renormalize_quats( + params: ParamTable, + groups: List[tuple[str, str, str, str]], +): + """Project quaternion params back onto the unit sphere.""" + for qw_name, qx_name, qy_name, qz_name in groups: + # Skip if all components are fixed + if ( + params.is_fixed(qw_name) + and params.is_fixed(qx_name) + and params.is_fixed(qy_name) + and params.is_fixed(qz_name) + ): + continue + w = params.get_value(qw_name) + x = params.get_value(qx_name) + y = params.get_value(qy_name) + z = params.get_value(qz_name) + norm = math.sqrt(w * w + x * x + y * y + z * z) + if norm < 1e-15: + # Degenerate — reset to identity + params.set_value(qw_name, 1.0) + params.set_value(qx_name, 0.0) + params.set_value(qy_name, 0.0) + params.set_value(qz_name, 0.0) + else: + params.set_value(qw_name, w / norm) + params.set_value(qx_name, x / norm) + params.set_value(qy_name, y / norm) + params.set_value(qz_name, z / norm) diff --git a/kindred_solver/params.py b/kindred_solver/params.py new file mode 100644 index 0000000..40a66a9 --- /dev/null +++ b/kindred_solver/params.py @@ -0,0 +1,76 @@ +"""Parameter table mapping named variables to Expr Var nodes and current values.""" + +from __future__ import annotations + +from typing import Dict, List + +import numpy as np + +from .expr import Var + + +class ParamTable: + """Central registry of solver variables. + + Each parameter has a name, a current numeric value, an associated + :class:`Var` expression node, and a fixed/free flag. Grounded + body parameters are marked fixed so the pre-pass can substitute + them as constants. + """ + + def __init__(self): + self._vars: Dict[str, Var] = {} + self._values: Dict[str, float] = {} + self._fixed: set[str] = set() + self._free_order: List[str] = [] # insertion-ordered free names + + def add(self, name: str, value: float = 0.0, fixed: bool = False) -> Var: + """Create a parameter and return its Var node.""" + if name in self._vars: + raise ValueError(f"Duplicate parameter: {name}") + v = Var(name) + self._vars[name] = v + self._values[name] = value + if fixed: + self._fixed.add(name) + else: + self._free_order.append(name) + return v + + def get_var(self, name: str) -> Var: + return self._vars[name] + + def is_fixed(self, name: str) -> bool: + return name in self._fixed + + def fix(self, name: str): + """Mark a parameter as fixed and remove it from the free list.""" + self._fixed.add(name) + if name in self._free_order: + self._free_order.remove(name) + + def get_env(self) -> Dict[str, float]: + """Return a snapshot of all current values (for Expr.eval).""" + return dict(self._values) + + def free_names(self) -> List[str]: + """Return ordered list of free (non-fixed) parameter names.""" + return list(self._free_order) + + def n_free(self) -> int: + return len(self._free_order) + + def get_value(self, name: str) -> float: + return self._values[name] + + def set_value(self, name: str, value: float): + self._values[name] = value + + def get_free_vector(self) -> np.ndarray: + """Current free-parameter values as a 1-D array.""" + return np.array([self._values[n] for n in self._free_order], dtype=np.float64) + + def set_free_vector(self, vec: np.ndarray): + """Bulk-update free parameters from a 1-D array.""" + for i, name in enumerate(self._free_order): + self._values[name] = float(vec[i]) diff --git a/kindred_solver/prepass.py b/kindred_solver/prepass.py new file mode 100644 index 0000000..0c263d3 --- /dev/null +++ b/kindred_solver/prepass.py @@ -0,0 +1,120 @@ +"""Pre-solve passes to reduce the system before Newton-Raphson. + +1. Substitution pass — replace fixed-parameter Var nodes with Const values. +2. Single-equation pass — if a residual mentions exactly one free variable, + solve it analytically (when possible) and fix that variable. +""" + +from __future__ import annotations + +from typing import List + +from .expr import ZERO, Add, Const, Expr, Mul, Neg, Sub, Var +from .params import ParamTable + + +def substitution_pass(residuals: List[Expr], params: ParamTable) -> List[Expr]: + """Replace fixed Var nodes with their constant values. + + Returns a new list of simplified residuals. + """ + env = params.get_env() + fixed = {name for name in env if params.is_fixed(name)} + if not fixed: + return residuals + return [_substitute(r, env, fixed).simplify() for r in residuals] + + +def _substitute(expr: Expr, env: dict[str, float], fixed: set[str]) -> Expr: + """Recursively replace Var nodes in *fixed* with Const values.""" + if isinstance(expr, Const): + return expr + if isinstance(expr, Var): + if expr.name in fixed: + return Const(env[expr.name]) + return expr + if isinstance(expr, Neg): + return Neg(_substitute(expr.child, env, fixed)) + if isinstance(expr, Add): + return Add(_substitute(expr.a, env, fixed), _substitute(expr.b, env, fixed)) + if isinstance(expr, Sub): + return Sub(_substitute(expr.a, env, fixed), _substitute(expr.b, env, fixed)) + if isinstance(expr, Mul): + return Mul(_substitute(expr.a, env, fixed), _substitute(expr.b, env, fixed)) + # For all other node types, rebuild with substituted children + from .expr import Cos, Div, Pow, Sin, Sqrt + + if isinstance(expr, Div): + return Div(_substitute(expr.a, env, fixed), _substitute(expr.b, env, fixed)) + if isinstance(expr, Pow): + return Pow( + _substitute(expr.base, env, fixed), _substitute(expr.exp, env, fixed) + ) + if isinstance(expr, Sin): + return Sin(_substitute(expr.child, env, fixed)) + if isinstance(expr, Cos): + return Cos(_substitute(expr.child, env, fixed)) + if isinstance(expr, Sqrt): + return Sqrt(_substitute(expr.child, env, fixed)) + return expr + + +def single_equation_pass(residuals: List[Expr], params: ParamTable) -> List[Expr]: + """Solve residuals that depend on a single free variable. + + Handles linear cases: a*x + b = 0 → x = -b/a. + Repeats until no more single-variable residuals can be solved. + Returns the remaining unsolved residuals. + """ + changed = True + remaining = list(residuals) + while changed: + changed = False + new_remaining = [] + for r in remaining: + free_vars = r.vars() & set(params.free_names()) + if len(free_vars) == 1: + name = next(iter(free_vars)) + solved = _try_solve_linear(r, name, params) + if solved: + params.fix(name) + # Re-substitute newly fixed variable in remaining + remaining_after = [] + env = params.get_env() + fixed = {name} + for rem in new_remaining: + remaining_after.append(_substitute(rem, env, fixed).simplify()) + new_remaining = remaining_after + changed = True + continue + new_remaining.append(r) + remaining = new_remaining + return remaining + + +def _try_solve_linear(expr: Expr, var_name: str, params: ParamTable) -> bool: + """Try to solve expr==0 for var_name assuming linear dependence. + + If expr = a*var + b where a,b are constants, sets var = -b/a. + Returns True on success. + """ + env = params.get_env() + + # Evaluate derivative w.r.t. var (should be constant if linear) + deriv = expr.diff(var_name).simplify() + # Check that derivative has no free variables (i.e. is truly constant) + if deriv.vars() & set(params.free_names()): + return False + + a = deriv.eval(env) + if abs(a) < 1e-15: + return False + + # Evaluate expr at current value + f = expr.eval(env) + + # x_new = x_current - f/a + x_cur = params.get_value(var_name) + x_new = x_cur - f / a + params.set_value(var_name, x_new) + return True diff --git a/kindred_solver/quat.py b/kindred_solver/quat.py new file mode 100644 index 0000000..9420fbe --- /dev/null +++ b/kindred_solver/quat.py @@ -0,0 +1,71 @@ +"""Quaternion math expressed as Expr trees. + +All functions take Expr nodes (typically Var nodes from a RigidBody's +parameter set) and return Expr trees. Quaternion rotation is polynomial +in the quaternion components — no transcendentals needed. + +Convention: quaternion (qw, qx, qy, qz) matches KCSolve's (w, x, y, z). +""" + +from __future__ import annotations + +from .expr import Const, Expr + + +def quat_rotate( + qw: Expr, + qx: Expr, + qy: Expr, + qz: Expr, + px: Expr, + py: Expr, + pz: Expr, +) -> tuple[Expr, Expr, Expr]: + """Rotate point (px, py, pz) by unit quaternion (qw, qx, qy, qz). + + Uses the standard formula: p' = q * p * q^{-1} + expanded into component form (polynomial in q): + + rx = (1 - 2(qy^2 + qz^2)) * px + 2(qx*qy - qw*qz) * py + 2(qx*qz + qw*qy) * pz + ry = 2(qx*qy + qw*qz) * px + (1 - 2(qx^2 + qz^2)) * py + 2(qy*qz - qw*qx) * pz + rz = 2(qx*qz - qw*qy) * px + 2(qy*qz + qw*qx) * py + (1 - 2(qx^2 + qy^2)) * pz + """ + two = Const(2.0) + + rx = ( + (Const(1.0) - two * (qy * qy + qz * qz)) * px + + two * (qx * qy - qw * qz) * py + + two * (qx * qz + qw * qy) * pz + ) + ry = ( + two * (qx * qy + qw * qz) * px + + (Const(1.0) - two * (qx * qx + qz * qz)) * py + + two * (qy * qz - qw * qx) * pz + ) + rz = ( + two * (qx * qz - qw * qy) * px + + two * (qy * qz + qw * qx) * py + + (Const(1.0) - two * (qx * qx + qy * qy)) * pz + ) + return rx, ry, rz + + +def world_point( + tx: Expr, + ty: Expr, + tz: Expr, + qw: Expr, + qx: Expr, + qy: Expr, + qz: Expr, + lx: float, + ly: float, + lz: float, +) -> tuple[Expr, Expr, Expr]: + """Transform local point (lx, ly, lz) to world coordinates. + + world = rotation(q, local) + translation + """ + clx, cly, clz = Const(lx), Const(ly), Const(lz) + rx, ry, rz = quat_rotate(qw, qx, qy, qz, clx, cly, clz) + return tx + rx, ty + ry, tz + rz diff --git a/kindred_solver/solver.py b/kindred_solver/solver.py new file mode 100644 index 0000000..53d1749 --- /dev/null +++ b/kindred_solver/solver.py @@ -0,0 +1,169 @@ +"""KindredSolver — IKCSolver implementation bridging KCSolve to the +expression-based Newton-Raphson solver.""" + +from __future__ import annotations + +import kcsolve + +from .constraints import ( + CoincidentConstraint, + ConstraintBase, + DistancePointPointConstraint, + FixedConstraint, +) +from .dof import count_dof +from .entities import RigidBody +from .newton import newton_solve +from .params import ParamTable +from .prepass import single_equation_pass, substitution_pass + +# Map BaseJointKind enum values to handler names +_SUPPORTED = { + kcsolve.BaseJointKind.Coincident, + kcsolve.BaseJointKind.DistancePointPoint, + kcsolve.BaseJointKind.Fixed, +} + + +class KindredSolver(kcsolve.IKCSolver): + """Expression-based Newton-Raphson constraint solver.""" + + def name(self): + return "Kindred (Newton-Raphson)" + + def supported_joints(self): + return list(_SUPPORTED) + + def solve(self, ctx): + params = ParamTable() + bodies = {} # part_id -> RigidBody + + # 1. Build entities from parts + for part in ctx.parts: + pos = tuple(part.placement.position) + quat = tuple(part.placement.quaternion) # (w, x, y, z) + body = RigidBody( + part.id, + params, + position=pos, + quaternion=quat, + grounded=part.grounded, + ) + bodies[part.id] = body + + # 2. Build constraint residuals + all_residuals = [] + constraint_objs = [] + + for c in ctx.constraints: + if not c.activated: + continue + body_i = bodies.get(c.part_i) + body_j = bodies.get(c.part_j) + if body_i is None or body_j is None: + continue + + marker_i_pos = tuple(c.marker_i.position) + marker_j_pos = tuple(c.marker_j.position) + + obj = _build_constraint( + c.type, + body_i, + marker_i_pos, + body_j, + marker_j_pos, + c.marker_i, + c.marker_j, + c.params, + ) + if obj is None: + continue + constraint_objs.append(obj) + all_residuals.extend(obj.residuals()) + + # 3. Add quaternion normalization residuals for non-grounded bodies + quat_groups = [] + for body in bodies.values(): + if not body.grounded: + all_residuals.append(body.quat_norm_residual()) + quat_groups.append(body.quat_param_names()) + + # 4. Pre-passes + all_residuals = substitution_pass(all_residuals, params) + all_residuals = single_equation_pass(all_residuals, params) + + # 5. Newton-Raphson + converged = newton_solve( + all_residuals, + params, + quat_groups=quat_groups, + max_iter=100, + tol=1e-10, + ) + + # 6. DOF + dof = count_dof(all_residuals, params) + + # 7. Build result + result = kcsolve.SolveResult() + result.status = ( + kcsolve.SolveStatus.Success if converged else kcsolve.SolveStatus.Failed + ) + result.dof = dof + + env = params.get_env() + placements = [] + for body in bodies.values(): + if body.grounded: + continue + pr = kcsolve.SolveResult.PartResult() + pr.id = body.part_id + pr.placement = kcsolve.Transform() + pr.placement.position = list(body.extract_position(env)) + pr.placement.quaternion = list(body.extract_quaternion(env)) + placements.append(pr) + + result.placements = placements + return result + + def is_deterministic(self): + return True + + +def _build_constraint( + kind, + body_i, + marker_i_pos, + body_j, + marker_j_pos, + marker_i, + marker_j, + c_params, +) -> ConstraintBase | None: + """Create the appropriate constraint object from a BaseJointKind.""" + if kind == kcsolve.BaseJointKind.Coincident: + return CoincidentConstraint(body_i, marker_i_pos, body_j, marker_j_pos) + + if kind == kcsolve.BaseJointKind.DistancePointPoint: + distance = c_params[0] if c_params else 0.0 + return DistancePointPointConstraint( + body_i, + marker_i_pos, + body_j, + marker_j_pos, + distance, + ) + + if kind == kcsolve.BaseJointKind.Fixed: + marker_i_quat = tuple(marker_i.quaternion) + marker_j_quat = tuple(marker_j.quaternion) + return FixedConstraint( + body_i, + marker_i_pos, + marker_i_quat, + body_j, + marker_j_pos, + marker_j_quat, + ) + + return None diff --git a/package.xml b/package.xml new file mode 100644 index 0000000..c7cc6a4 --- /dev/null +++ b/package.xml @@ -0,0 +1,23 @@ + + + + solver + Kindred constraint solver — expression-based Newton-Raphson + 0.1.0 + Kindred Systems + LGPL-2.1-or-later + + + + KindredSolverBackend + ./ + + + + + 0.1.0 + 10 + true + + + diff --git a/tests/test_constraints.py b/tests/test_constraints.py new file mode 100644 index 0000000..fa456ed --- /dev/null +++ b/tests/test_constraints.py @@ -0,0 +1,135 @@ +"""Tests for constraint residual generation.""" + +import math + +import pytest +from kindred_solver.constraints import ( + CoincidentConstraint, + DistancePointPointConstraint, + FixedConstraint, +) +from kindred_solver.entities import RigidBody +from kindred_solver.params import ParamTable + + +class TestCoincident: + def test_satisfied(self): + """Two bodies at same position → residuals are zero.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = CoincidentConstraint(b1, (0, 0, 0), b2, (0, 0, 0)) + env = pt.get_env() + for r in c.residuals(): + assert abs(r.eval(env)) < 1e-10 + + def test_unsatisfied(self): + """Bodies at different positions → non-zero residuals.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (1, 2, 3), (1, 0, 0, 0)) + c = CoincidentConstraint(b1, (0, 0, 0), b2, (0, 0, 0)) + env = pt.get_env() + vals = [r.eval(env) for r in c.residuals()] + assert abs(vals[0] - (-1.0)) < 1e-10 + assert abs(vals[1] - (-2.0)) < 1e-10 + assert abs(vals[2] - (-3.0)) < 1e-10 + + def test_with_markers(self): + """Marker offsets shift the coincidence point.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (10, 0, 0), (1, 0, 0, 0)) + # marker on b1 at local (5,0,0), marker on b2 at local (-5,0,0) + c = CoincidentConstraint(b1, (5, 0, 0), b2, (-5, 0, 0)) + env = pt.get_env() + # b1 marker world = (5,0,0), b2 marker world = (10-5, 0, 0) = (5,0,0) + for r in c.residuals(): + assert abs(r.eval(env)) < 1e-10 + + def test_residual_count(self): + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0)) + b2 = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = CoincidentConstraint(b1, (0, 0, 0), b2, (0, 0, 0)) + assert len(c.residuals()) == 3 + + +class TestDistancePointPoint: + def test_satisfied(self): + """Bodies at distance 5 apart with d=5 → residual zero.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (3, 4, 0), (1, 0, 0, 0)) + c = DistancePointPointConstraint(b1, (0, 0, 0), b2, (0, 0, 0), 5.0) + env = pt.get_env() + # 3^2 + 4^2 - 5^2 = 9+16-25 = 0 + assert abs(c.residuals()[0].eval(env)) < 1e-10 + + def test_unsatisfied(self): + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (3, 4, 0), (1, 0, 0, 0)) + c = DistancePointPointConstraint(b1, (0, 0, 0), b2, (0, 0, 0), 3.0) + env = pt.get_env() + # 9+16-9 = 16 + assert abs(c.residuals()[0].eval(env) - 16.0) < 1e-10 + + def test_residual_count(self): + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0)) + b2 = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = DistancePointPointConstraint(b1, (0, 0, 0), b2, (0, 0, 0), 1.0) + assert len(c.residuals()) == 1 + + +class TestFixed: + def test_satisfied(self): + """Identical pose + markers → all residuals zero.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = FixedConstraint( + b1, + (0, 0, 0), + (1, 0, 0, 0), + b2, + (0, 0, 0), + (1, 0, 0, 0), + ) + env = pt.get_env() + for r in c.residuals(): + assert abs(r.eval(env)) < 1e-10 + + def test_residual_count(self): + """Fixed constraint: 3 position + 3 orientation = 6 residuals.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0)) + b2 = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = FixedConstraint( + b1, + (0, 0, 0), + (1, 0, 0, 0), + b2, + (0, 0, 0), + (1, 0, 0, 0), + ) + assert len(c.residuals()) == 6 + + def test_unsatisfied_position(self): + """Offset position → non-zero position residuals.""" + pt = ParamTable() + b1 = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + b2 = RigidBody("b", pt, (1, 0, 0), (1, 0, 0, 0)) + c = FixedConstraint( + b1, + (0, 0, 0), + (1, 0, 0, 0), + b2, + (0, 0, 0), + (1, 0, 0, 0), + ) + env = pt.get_env() + vals = [r.eval(env) for r in c.residuals()] + # Position residual [0] should be -1 (0 - 1) + assert abs(vals[0] - (-1.0)) < 1e-10 diff --git a/tests/test_dof.py b/tests/test_dof.py new file mode 100644 index 0000000..383672c --- /dev/null +++ b/tests/test_dof.py @@ -0,0 +1,49 @@ +"""Tests for DOF counting.""" + +import pytest +from kindred_solver.dof import count_dof +from kindred_solver.expr import Const, Var +from kindred_solver.params import ParamTable + + +class TestDOF: + def test_unconstrained(self): + """2 free params, no residuals → DOF = 2.""" + pt = ParamTable() + pt.add("x", 0.0) + pt.add("y", 0.0) + assert count_dof([], pt) == 2 + + def test_fully_constrained(self): + """1 free param, 1 independent residual → DOF = 0.""" + pt = ParamTable() + x = pt.add("x", 1.0) + residuals = [x - Const(3.0)] + assert count_dof(residuals, pt) == 0 + + def test_under_constrained(self): + """2 free params, 1 residual → DOF = 1.""" + pt = ParamTable() + x = pt.add("x", 1.0) + y = pt.add("y", 1.0) + residuals = [x + y - Const(5.0)] + assert count_dof(residuals, pt) == 1 + + def test_redundant_constraints(self): + """2 free params, 3 residuals (2 independent) → DOF = 0.""" + pt = ParamTable() + x = pt.add("x", 1.0) + y = pt.add("y", 1.0) + residuals = [ + x - Const(3.0), + y - Const(4.0), + x + y - Const(7.0), # redundant (sum of first two) + ] + assert count_dof(residuals, pt) == 0 + + def test_no_free_params(self): + """All fixed → DOF = 0.""" + pt = ParamTable() + pt.add("x", 1.0, fixed=True) + residuals = [Const(0.0)] + assert count_dof(residuals, pt) == 0 diff --git a/tests/test_entities.py b/tests/test_entities.py new file mode 100644 index 0000000..6d1600f --- /dev/null +++ b/tests/test_entities.py @@ -0,0 +1,77 @@ +"""Tests for RigidBody entities.""" + +import math + +import pytest +from kindred_solver.entities import RigidBody +from kindred_solver.params import ParamTable + + +class TestRigidBody: + def test_identity_world_point(self): + """Body at origin with identity rotation: local == world.""" + pt = ParamTable() + body = RigidBody("p1", pt, (0, 0, 0), (1, 0, 0, 0)) + wx, wy, wz = body.world_point(1.0, 2.0, 3.0) + env = pt.get_env() + assert abs(wx.eval(env) - 1.0) < 1e-10 + assert abs(wy.eval(env) - 2.0) < 1e-10 + assert abs(wz.eval(env) - 3.0) < 1e-10 + + def test_translated(self): + """Body translated by (10, 20, 30) with identity rotation.""" + pt = ParamTable() + body = RigidBody("p1", pt, (10, 20, 30), (1, 0, 0, 0)) + wx, wy, wz = body.world_point(1.0, 2.0, 3.0) + env = pt.get_env() + assert abs(wx.eval(env) - 11.0) < 1e-10 + assert abs(wy.eval(env) - 22.0) < 1e-10 + assert abs(wz.eval(env) - 33.0) < 1e-10 + + def test_rotated_90_z(self): + """90-degree rotation about Z: (1,0,0) -> (0,1,0).""" + pt = ParamTable() + # 90-deg about Z: q = (cos(45), 0, 0, sin(45)) + c = math.cos(math.pi / 4) + s = math.sin(math.pi / 4) + body = RigidBody("p1", pt, (0, 0, 0), (c, 0, 0, s)) + wx, wy, wz = body.world_point(1.0, 0.0, 0.0) + env = pt.get_env() + assert abs(wx.eval(env) - 0.0) < 1e-10 + assert abs(wy.eval(env) - 1.0) < 1e-10 + assert abs(wz.eval(env) - 0.0) < 1e-10 + + def test_quat_norm_residual(self): + """Normalization residual is zero for unit quaternion.""" + pt = ParamTable() + body = RigidBody("p1", pt, (0, 0, 0), (1, 0, 0, 0)) + r = body.quat_norm_residual() + env = pt.get_env() + assert abs(r.eval(env)) < 1e-10 + + def test_grounded(self): + """Grounded body has all params fixed.""" + pt = ParamTable() + body = RigidBody("p1", pt, (1, 2, 3), (1, 0, 0, 0), grounded=True) + assert pt.n_free() == 0 + assert body.grounded + + def test_extract(self): + """Extract position and quaternion from env.""" + pt = ParamTable() + body = RigidBody("p1", pt, (1, 2, 3), (0.5, 0.5, 0.5, 0.5)) + env = pt.get_env() + pos = body.extract_position(env) + quat = body.extract_quaternion(env) + assert pos == (1.0, 2.0, 3.0) + assert quat == (0.5, 0.5, 0.5, 0.5) + + def test_differentiation(self): + """World point expressions are differentiable w.r.t. body params.""" + pt = ParamTable() + body = RigidBody("p1", pt, (0, 0, 0), (1, 0, 0, 0)) + wx, wy, wz = body.world_point(1.0, 0.0, 0.0) + # d(wx)/d(tx) should be 1 + dtx = wx.diff("p1/tx").simplify() + env = pt.get_env() + assert abs(dtx.eval(env) - 1.0) < 1e-10 diff --git a/tests/test_expr.py b/tests/test_expr.py new file mode 100644 index 0000000..194a364 --- /dev/null +++ b/tests/test_expr.py @@ -0,0 +1,195 @@ +"""Tests for the expression DAG.""" + +import math + +import pytest +from kindred_solver.expr import ( + ONE, + ZERO, + Add, + Const, + Cos, + Div, + Mul, + Neg, + Pow, + Sin, + Sqrt, + Sub, + Var, +) + + +class TestConst: + def test_eval(self): + assert Const(3.0).eval({}) == 3.0 + + def test_diff(self): + assert Const(5.0).diff("x") == ZERO + + def test_eq(self): + assert Const(1.0) == Const(1.0) + assert Const(1.0) != Const(2.0) + + def test_vars(self): + assert Const(1.0).vars() == set() + + +class TestVar: + def test_eval(self): + assert Var("x").eval({"x": 7.0}) == 7.0 + + def test_diff_self(self): + assert Var("x").diff("x") == ONE + + def test_diff_other(self): + assert Var("x").diff("y") == ZERO + + def test_vars(self): + assert Var("x").vars() == {"x"} + + +class TestOperators: + def test_add(self): + x = Var("x") + e = x + 3.0 + assert isinstance(e, Add) + assert e.eval({"x": 2.0}) == 5.0 + + def test_radd(self): + x = Var("x") + e = 3.0 + x + assert e.eval({"x": 2.0}) == 5.0 + + def test_sub(self): + x = Var("x") + e = x - 1.0 + assert e.eval({"x": 5.0}) == 4.0 + + def test_mul(self): + x = Var("x") + e = x * 2.0 + assert e.eval({"x": 3.0}) == 6.0 + + def test_div(self): + x = Var("x") + e = x / 2.0 + assert e.eval({"x": 6.0}) == 3.0 + + def test_neg(self): + x = Var("x") + e = -x + assert e.eval({"x": 3.0}) == -3.0 + + def test_pow(self): + x = Var("x") + e = x**2 + assert e.eval({"x": 3.0}) == 9.0 + + +class TestDiff: + def test_add(self): + x = Var("x") + e = x + Const(5.0) + d = e.diff("x").simplify() + assert d.eval({}) == 1.0 + + def test_mul_product_rule(self): + x = Var("x") + e = x * x # x^2 + d = e.diff("x").simplify() + # d/dx(x*x) = x + x = 2x + assert d.eval({"x": 3.0}) == 6.0 + + def test_pow_const_exp(self): + x = Var("x") + e = Pow(x, Const(3.0)) # x^3 + d = e.diff("x").simplify() + # d/dx(x^3) = 3x^2 + assert abs(d.eval({"x": 2.0}) - 12.0) < 1e-10 + + def test_sin(self): + x = Var("x") + e = Sin(x) + d = e.diff("x").simplify() + # d/dx sin(x) = cos(x) + assert abs(d.eval({"x": 0.0}) - 1.0) < 1e-10 + + def test_cos(self): + x = Var("x") + e = Cos(x) + d = e.diff("x").simplify() + # d/dx cos(x) = -sin(x) + assert abs(d.eval({"x": 0.0}) - 0.0) < 1e-10 + + def test_div_quotient_rule(self): + x = Var("x") + e = Div(x, x + Const(1.0)) # x / (x+1) + d = e.diff("x") + # d/dx x/(x+1) = 1/(x+1)^2 + val = d.eval({"x": 1.0}) + assert abs(val - 0.25) < 1e-10 + + def test_sqrt(self): + x = Var("x") + e = Sqrt(x) + d = e.diff("x") + # d/dx sqrt(x) = 1/(2*sqrt(x)) + val = d.eval({"x": 4.0}) + assert abs(val - 0.25) < 1e-10 + + +class TestSimplify: + def test_add_zero(self): + x = Var("x") + e = Add(ZERO, x).simplify() + assert isinstance(e, Var) and e.name == "x" + + def test_mul_one(self): + x = Var("x") + e = Mul(ONE, x).simplify() + assert isinstance(e, Var) and e.name == "x" + + def test_mul_zero(self): + x = Var("x") + e = Mul(ZERO, x).simplify() + assert e == ZERO + + def test_const_fold(self): + e = Add(Const(2.0), Const(3.0)).simplify() + assert isinstance(e, Const) and e.value == 5.0 + + def test_neg_neg(self): + x = Var("x") + e = Neg(Neg(x)).simplify() + assert isinstance(e, Var) and e.name == "x" + + def test_pow_zero(self): + x = Var("x") + e = Pow(x, ZERO).simplify() + assert e == ONE + + def test_pow_one(self): + x = Var("x") + e = Pow(x, ONE).simplify() + assert isinstance(e, Var) and e.name == "x" + + def test_sub_zero(self): + x = Var("x") + e = Sub(x, ZERO).simplify() + assert isinstance(e, Var) and e.name == "x" + + +class TestComplex: + def test_polynomial(self): + """Test a quadratic: 3x^2 + 2x + 1, derivative = 6x + 2.""" + x = Var("x") + e = Const(3.0) * x * x + Const(2.0) * x + Const(1.0) + assert abs(e.eval({"x": 2.0}) - 17.0) < 1e-10 + d = e.diff("x").simplify() + assert abs(d.eval({"x": 2.0}) - 14.0) < 1e-10 + + def test_vars_set(self): + x, y = Var("x"), Var("y") + e = x * y + Sin(x) + assert e.vars() == {"x", "y"} diff --git a/tests/test_newton.py b/tests/test_newton.py new file mode 100644 index 0000000..4c313c5 --- /dev/null +++ b/tests/test_newton.py @@ -0,0 +1,88 @@ +"""Tests for the Newton-Raphson solver.""" + +import math + +import pytest +from kindred_solver.expr import Const, Var +from kindred_solver.newton import newton_solve +from kindred_solver.params import ParamTable + + +class TestNewtonBasic: + def test_single_linear(self): + """Solve x - 3 = 0 → x = 3.""" + pt = ParamTable() + x = pt.add("x", 0.0) + residuals = [x - Const(3.0)] + assert newton_solve(residuals, pt) is True + assert abs(pt.get_value("x") - 3.0) < 1e-10 + + def test_single_quadratic(self): + """Solve x^2 - 4 = 0 starting from x=1 → x = 2.""" + pt = ParamTable() + x = pt.add("x", 1.0) + residuals = [x * x - Const(4.0)] + assert newton_solve(residuals, pt) is True + assert abs(pt.get_value("x") - 2.0) < 1e-10 + + def test_two_variables(self): + """Solve x + y = 5, x - y = 1 → x=3, y=2.""" + pt = ParamTable() + x = pt.add("x", 0.0) + y = pt.add("y", 0.0) + residuals = [x + y - Const(5.0), x - y - Const(1.0)] + assert newton_solve(residuals, pt) is True + assert abs(pt.get_value("x") - 3.0) < 1e-10 + assert abs(pt.get_value("y") - 2.0) < 1e-10 + + def test_with_fixed(self): + """Fixed parameter is not updated.""" + pt = ParamTable() + x = pt.add("x", 0.0) + y = pt.add("y", 5.0, fixed=True) + residuals = [x + y - Const(10.0)] + assert newton_solve(residuals, pt) is True + assert abs(pt.get_value("x") - 5.0) < 1e-10 + assert pt.get_value("y") == 5.0 + + def test_empty_system(self): + """Empty residual list converges trivially.""" + pt = ParamTable() + assert newton_solve([], pt) is True + + +class TestNewtonQuat: + def test_quat_renorm(self): + """Quaternion re-normalization keeps unit length.""" + pt = ParamTable() + qw = pt.add("qw", 0.9) + qx = pt.add("qx", 0.1) + qy = pt.add("qy", 0.1) + qz = pt.add("qz", 0.1) + # Residual: qw^2 + qx^2 + qy^2 + qz^2 - 1 = 0 + r = qw * qw + qx * qx + qy * qy + qz * qz - Const(1.0) + quat_groups = [("qw", "qx", "qy", "qz")] + assert newton_solve([r], pt, quat_groups=quat_groups) is True + # Check unit length + w, x, y, z = (pt.get_value(n) for n in ["qw", "qx", "qy", "qz"]) + norm = math.sqrt(w**2 + x**2 + y**2 + z**2) + assert abs(norm - 1.0) < 1e-10 + + +class TestNewtonGeometric: + def test_point_coincidence(self): + """Two points that should meet: (x,0,0) == (3,0,0).""" + pt = ParamTable() + x = pt.add("x", 0.0) + residuals = [x - Const(3.0)] + assert newton_solve(residuals, pt) is True + assert abs(pt.get_value("x") - 3.0) < 1e-10 + + def test_distance_constraint(self): + """Point at (x,0,0) should be distance 5 from origin. + Squared: x^2 - 25 = 0, starting from x=3 → x=5.""" + pt = ParamTable() + x = pt.add("x", 3.0) + residuals = [x * x - Const(25.0)] + assert newton_solve(residuals, pt) is True + assert abs(pt.get_value("x") - 5.0) < 1e-10 diff --git a/tests/test_params.py b/tests/test_params.py new file mode 100644 index 0000000..f37912c --- /dev/null +++ b/tests/test_params.py @@ -0,0 +1,67 @@ +"""Tests for the parameter table.""" + +import numpy as np +import pytest +from kindred_solver.expr import Var +from kindred_solver.params import ParamTable + + +class TestParamTable: + def test_add_and_get(self): + pt = ParamTable() + v = pt.add("x", 3.0) + assert isinstance(v, Var) + assert v.name == "x" + assert pt.get_value("x") == 3.0 + + def test_duplicate_raises(self): + pt = ParamTable() + pt.add("x") + with pytest.raises(ValueError, match="Duplicate"): + pt.add("x") + + def test_fixed(self): + pt = ParamTable() + pt.add("x", 1.0, fixed=True) + pt.add("y", 2.0, fixed=False) + assert pt.is_fixed("x") + assert not pt.is_fixed("y") + assert pt.free_names() == ["y"] + + def test_fix(self): + pt = ParamTable() + pt.add("x", 1.0) + assert "x" in pt.free_names() + pt.fix("x") + assert "x" not in pt.free_names() + assert pt.is_fixed("x") + + def test_env(self): + pt = ParamTable() + pt.add("a", 1.0) + pt.add("b", 2.0, fixed=True) + env = pt.get_env() + assert env == {"a": 1.0, "b": 2.0} + + def test_free_vector(self): + pt = ParamTable() + pt.add("a", 1.0) + pt.add("b", 2.0, fixed=True) + pt.add("c", 3.0) + vec = pt.get_free_vector() + np.testing.assert_array_equal(vec, [1.0, 3.0]) + + def test_set_free_vector(self): + pt = ParamTable() + pt.add("a", 0.0) + pt.add("b", 0.0) + pt.set_free_vector(np.array([5.0, 7.0])) + assert pt.get_value("a") == 5.0 + assert pt.get_value("b") == 7.0 + + def test_n_free(self): + pt = ParamTable() + pt.add("a", 0.0) + pt.add("b", 0.0, fixed=True) + pt.add("c", 0.0) + assert pt.n_free() == 2 diff --git a/tests/test_prepass.py b/tests/test_prepass.py new file mode 100644 index 0000000..6852ae7 --- /dev/null +++ b/tests/test_prepass.py @@ -0,0 +1,58 @@ +"""Tests for pre-solve passes.""" + +import pytest +from kindred_solver.expr import Const, Var +from kindred_solver.params import ParamTable +from kindred_solver.prepass import single_equation_pass, substitution_pass + + +class TestSubstitutionPass: + def test_fixed_replaced(self): + pt = ParamTable() + x = pt.add("x", 3.0, fixed=True) + y = pt.add("y", 0.0) + residuals = [x + y - Const(5.0)] + result = substitution_pass(residuals, pt) + # After substitution, x is replaced with 3.0 + # So residual becomes 3.0 + y - 5.0 = y - 2.0 + env = pt.get_env() + assert abs(result[0].eval({"y": 2.0}) - 0.0) < 1e-10 + + def test_no_fixed(self): + pt = ParamTable() + x = pt.add("x", 1.0) + residuals = [x - Const(1.0)] + result = substitution_pass(residuals, pt) + assert len(result) == 1 + + +class TestSingleEquationPass: + def test_solve_linear(self): + """x - 3 = 0 with only x free → solves x=3 and removes residual.""" + pt = ParamTable() + x = pt.add("x", 0.0) + residuals = [x - Const(3.0)] + result = single_equation_pass(residuals, pt) + assert len(result) == 0 + assert abs(pt.get_value("x") - 3.0) < 1e-10 + assert pt.is_fixed("x") + + def test_two_residuals_chain(self): + """x - 3 = 0, y - x = 0 → solves x=3, then y=3.""" + pt = ParamTable() + x = pt.add("x", 0.0) + y = pt.add("y", 0.0) + residuals = [x - Const(3.0), y - x] + result = single_equation_pass(residuals, pt) + assert len(result) == 0 + assert abs(pt.get_value("x") - 3.0) < 1e-10 + assert abs(pt.get_value("y") - 3.0) < 1e-10 + + def test_multi_var_not_solved(self): + """x + y - 5 = 0 with both free → not solved.""" + pt = ParamTable() + x = pt.add("x", 0.0) + y = pt.add("y", 0.0) + residuals = [x + y - Const(5.0)] + result = single_equation_pass(residuals, pt) + assert len(result) == 1 # still unsolved diff --git a/tests/test_solver.py b/tests/test_solver.py new file mode 100644 index 0000000..3d80fef --- /dev/null +++ b/tests/test_solver.py @@ -0,0 +1,183 @@ +"""End-to-end tests for KindredSolver using internal API. + +These tests exercise the solver bridge without requiring kcsolve pybind11 +bindings (which need a FreeCAD build). Instead we test the internal +pipeline directly. +""" + +import math + +import pytest +from kindred_solver.constraints import ( + CoincidentConstraint, + DistancePointPointConstraint, + FixedConstraint, +) +from kindred_solver.dof import count_dof +from kindred_solver.entities import RigidBody +from kindred_solver.newton import newton_solve +from kindred_solver.params import ParamTable +from kindred_solver.prepass import single_equation_pass, substitution_pass + + +def _solve_system(bodies, constraint_objs): + """Helper: run the full solve pipeline on a list of bodies + constraints.""" + params = bodies[0].tx # hack to get the shared ParamTable + # Actually, we need the param table. Let's require it as arg. + raise NotImplementedError + + +class TestCoincidentSolve: + def test_two_bodies_coincident(self): + """Ground body A at origin, body B at (10,0,0). + Coincident constraint → B moves to origin.""" + pt = ParamTable() + body_a = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + body_b = RigidBody("b", pt, (10, 0, 0), (1, 0, 0, 0)) + + c = CoincidentConstraint(body_a, (0, 0, 0), body_b, (0, 0, 0)) + + residuals = list(c.residuals()) + residuals.append(body_b.quat_norm_residual()) + quat_groups = [body_b.quat_param_names()] + + residuals = substitution_pass(residuals, pt) + residuals = single_equation_pass(residuals, pt) + + converged = newton_solve(residuals, pt, quat_groups=quat_groups) + assert converged + + env = pt.get_env() + pos = body_b.extract_position(env) + assert abs(pos[0]) < 1e-8 + assert abs(pos[1]) < 1e-8 + assert abs(pos[2]) < 1e-8 + + def test_coincident_with_markers(self): + """Body A at origin, body B at (10,0,0). + Marker on A at local (5,0,0), marker on B at local (-5,0,0). + After solve, B should be at (10,0,0) since 5+0 == 10-5.""" + pt = ParamTable() + body_a = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + body_b = RigidBody("b", pt, (20, 0, 0), (1, 0, 0, 0)) + + c = CoincidentConstraint(body_a, (5, 0, 0), body_b, (-5, 0, 0)) + + residuals = list(c.residuals()) + residuals.append(body_b.quat_norm_residual()) + quat_groups = [body_b.quat_param_names()] + + residuals = substitution_pass(residuals, pt) + converged = newton_solve(residuals, pt, quat_groups=quat_groups) + assert converged + + env = pt.get_env() + pos = body_b.extract_position(env) + assert abs(pos[0] - 10.0) < 1e-8 + + +class TestDistanceSolve: + def test_distance_from_origin(self): + """Ground A at origin, B starts at (1,0,0). + Distance constraint d=5 → B moves to (5,0,0).""" + pt = ParamTable() + body_a = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + body_b = RigidBody("b", pt, (1, 0, 0), (1, 0, 0, 0)) + + c = DistancePointPointConstraint( + body_a, + (0, 0, 0), + body_b, + (0, 0, 0), + 5.0, + ) + + residuals = list(c.residuals()) + residuals.append(body_b.quat_norm_residual()) + quat_groups = [body_b.quat_param_names()] + + residuals = substitution_pass(residuals, pt) + converged = newton_solve(residuals, pt, quat_groups=quat_groups) + assert converged + + env = pt.get_env() + pos = body_b.extract_position(env) + dist = math.sqrt(pos[0] ** 2 + pos[1] ** 2 + pos[2] ** 2) + assert abs(dist - 5.0) < 1e-8 + + +class TestFixedSolve: + def test_fixed_weld(self): + """Ground A at origin, B at (5,0,0) with identity rotation. + Fixed constraint with identity markers → B stays at same pose as A.""" + pt = ParamTable() + body_a = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + body_b = RigidBody("b", pt, (5, 0, 0), (1, 0, 0, 0)) + + c = FixedConstraint( + body_a, + (0, 0, 0), + (1, 0, 0, 0), + body_b, + (0, 0, 0), + (1, 0, 0, 0), + ) + + residuals = list(c.residuals()) + residuals.append(body_b.quat_norm_residual()) + quat_groups = [body_b.quat_param_names()] + + residuals = substitution_pass(residuals, pt) + converged = newton_solve(residuals, pt, quat_groups=quat_groups) + assert converged + + env = pt.get_env() + pos = body_b.extract_position(env) + assert abs(pos[0]) < 1e-8 + assert abs(pos[1]) < 1e-8 + assert abs(pos[2]) < 1e-8 + + quat = body_b.extract_quaternion(env) + assert abs(quat[0] - 1.0) < 1e-8 # w + assert abs(quat[1]) < 1e-8 # x + assert abs(quat[2]) < 1e-8 # y + assert abs(quat[3]) < 1e-8 # z + + +class TestDOFCounting: + def test_single_body_unconstrained(self): + """One non-grounded body: 7 params - 1 quat norm = 6 DOF.""" + pt = ParamTable() + body = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0)) + residuals = [body.quat_norm_residual()] + dof = count_dof(residuals, pt) + assert dof == 6 + + def test_two_bodies_coincident(self): + """Grounded A + free B with coincident: 7 - (3 coincident + 1 quat) = 3 DOF.""" + pt = ParamTable() + body_a = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + body_b = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = CoincidentConstraint(body_a, (0, 0, 0), body_b, (0, 0, 0)) + residuals = list(c.residuals()) + [body_b.quat_norm_residual()] + residuals = substitution_pass(residuals, pt) + dof = count_dof(residuals, pt) + assert dof == 3 # 3 rotation DOF remain + + def test_two_bodies_fixed(self): + """Grounded A + free B with fixed: 7 - (6 fixed + 1 quat) = 0 DOF.""" + pt = ParamTable() + body_a = RigidBody("a", pt, (0, 0, 0), (1, 0, 0, 0), grounded=True) + body_b = RigidBody("b", pt, (0, 0, 0), (1, 0, 0, 0)) + c = FixedConstraint( + body_a, + (0, 0, 0), + (1, 0, 0, 0), + body_b, + (0, 0, 0), + (1, 0, 0, 0), + ) + residuals = list(c.residuals()) + [body_b.quat_norm_residual()] + residuals = substitution_pass(residuals, pt) + dof = count_dof(residuals, pt) + assert dof == 0