From fd5a63f09e3a79ac11d86d74c96b4f5e765132b4 Mon Sep 17 00:00:00 2001 From: Agnel Wang <59766821+Agnel-Wang@users.noreply.github.com> Date: Wed, 26 Apr 2023 16:15:59 +0800 Subject: [PATCH] support for arm64 --- .gitignore | 2 + CMakeLists.txt | 2 +- include/FSM/BaseState.h | 62 +- include/FSM/FSMState.h | 98 +- include/FSM/FiniteStateMachine.h | 54 +- include/FSM/State_BackToStart.h | 42 +- include/FSM/State_Calibration.h | 34 +- include/FSM/State_Cartesian.h | 0 include/FSM/State_JointSpace.h | 34 +- include/FSM/State_LowCmd.h | 34 +- include/FSM/State_MoveC.h | 44 +- include/FSM/State_MoveJ.h | 0 include/FSM/State_MoveL.h | 0 include/FSM/State_Passive.h | 28 +- include/FSM/State_SaveState.h | 34 +- include/FSM/State_Teach.h | 46 +- include/FSM/State_TeachRepeat.h | 54 +- include/FSM/State_ToState.h | 46 +- include/FSM/State_Trajectory.h | 72 +- include/common/enumClass.h | 76 +- include/common/math/Filter.h | 56 +- include/common/math/mathTypes.h | 216 +- include/common/utilities/CSVTool.h | 490 +- include/common/utilities/loop.h | 0 include/common/utilities/typeTrans.h | 148 +- include/control/CtrlComponents.h | 104 +- include/interface/IOInterface.h | 54 +- include/interface/IOROS.h | 0 include/interface/IOUDP.h | 50 +- include/message/LowlevelCmd.h | 112 +- include/message/LowlevelState.h | 122 +- include/message/MotorCmd.h | 522 +- include/message/MotorState.h | 582 +- include/message/arm_common.h | 0 include/thirdparty/quadProgpp/Array.hh | 5064 ++++++++--------- include/thirdparty/quadProgpp/QuadProg++.hh | 154 +- include/thirdparty/tinyxml/tinystr.h | 610 +- include/thirdparty/tinyxml/tinyxml.h | 3610 ++++++------ include/trajectory/EndCircleTraj.h | 62 +- include/trajectory/EndLineTraj.h | 0 include/trajectory/JointSpaceTraj.h | 64 +- include/trajectory/SCurve.h | 96 +- include/trajectory/StopForTime.h | 32 +- include/trajectory/TrajectoryManager.h | 74 +- ...bZ1_ROS_Linux64.so => libZ1_ROS_x86_64.so} | Bin 1639832 -> 1639832 bytes lib/libZ1_UDP_aarch64.so | Bin 0 -> 1553288 bytes ...bZ1_UDP_Linux64.so => libZ1_UDP_x86_64.so} | Bin 1548768 -> 1548768 bytes main.cpp | 0 48 files changed, 6493 insertions(+), 6491 deletions(-) create mode 100644 .gitignore mode change 100755 => 100644 include/FSM/State_Cartesian.h mode change 100755 => 100644 include/FSM/State_MoveJ.h mode change 100755 => 100644 include/FSM/State_MoveL.h mode change 100644 => 100755 include/common/math/Filter.h mode change 100644 => 100755 include/common/utilities/loop.h mode change 100755 => 100644 include/interface/IOROS.h mode change 100644 => 100755 include/message/arm_common.h mode change 100644 => 100755 include/thirdparty/quadProgpp/Array.hh mode change 100644 => 100755 include/thirdparty/quadProgpp/QuadProg++.hh mode change 100755 => 100644 include/trajectory/EndLineTraj.h rename lib/{libZ1_ROS_Linux64.so => libZ1_ROS_x86_64.so} (90%) mode change 100644 => 100755 create mode 100644 lib/libZ1_UDP_aarch64.so rename lib/{libZ1_UDP_Linux64.so => libZ1_UDP_x86_64.so} (90%) mode change 100644 => 100755 mode change 100755 => 100644 main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af96791 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +build diff --git a/CMakeLists.txt b/CMakeLists.txt index 65723b4..6811c18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,4 +64,4 @@ link_directories(lib) # ----------------------add executable---------------------- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) add_executable(z1_ctrl main.cpp) -target_link_libraries(z1_ctrl libZ1_${COMMUNICATION}_Linux64.so ${catkin_LIBRARIES} ) +target_link_libraries(z1_ctrl libZ1_${COMMUNICATION}_${CMAKE_HOST_SYSTEM_PROCESSOR}.so ${catkin_LIBRARIES} ) diff --git a/include/FSM/BaseState.h b/include/FSM/BaseState.h index 43d9071..96b7249 100755 --- a/include/FSM/BaseState.h +++ b/include/FSM/BaseState.h @@ -1,32 +1,32 @@ -#ifndef BASESTATE_H -#define BASESTATE_H - -#include -#include "common/enumClass.h" - -class BaseState{ -public: - BaseState(int stateNameEnum, std::string stateNameString) - : _stateNameEnum(stateNameEnum), _stateNameString(stateNameString){} - virtual ~BaseState(){}; - - virtual void enter() = 0; - virtual void run() = 0; - virtual void exit() = 0; - virtual int checkChange(int cmd) = 0; - - bool isState(int stateEnum){ - if(_stateNameEnum == stateEnum){ - return true; - }else{ - return false; - } - } - std::string getStateName(){return _stateNameString;} - int getStateNameEnum(){return _stateNameEnum;}; -protected: - int _stateNameEnum; - std::string _stateNameString; -}; - +#ifndef BASESTATE_H +#define BASESTATE_H + +#include +#include "common/enumClass.h" + +class BaseState{ +public: + BaseState(int stateNameEnum, std::string stateNameString) + : _stateNameEnum(stateNameEnum), _stateNameString(stateNameString){} + virtual ~BaseState(){}; + + virtual void enter() = 0; + virtual void run() = 0; + virtual void exit() = 0; + virtual int checkChange(int cmd) = 0; + + bool isState(int stateEnum){ + if(_stateNameEnum == stateEnum){ + return true; + }else{ + return false; + } + } + std::string getStateName(){return _stateNameString;} + int getStateNameEnum(){return _stateNameEnum;}; +protected: + int _stateNameEnum; + std::string _stateNameString; +}; + #endif \ No newline at end of file diff --git a/include/FSM/FSMState.h b/include/FSM/FSMState.h index 3fafdeb..7e45a39 100755 --- a/include/FSM/FSMState.h +++ b/include/FSM/FSMState.h @@ -1,49 +1,49 @@ -#ifndef FSMSTATE_H -#define FSMSTATE_H - -#include -#include -#include -#include "control/CtrlComponents.h" -#include "common/math/mathTools.h" -#include "common/utilities/timer.h" -#include "FSM/BaseState.h" - -class FSMState : public BaseState{ -public: - FSMState(CtrlComponents *ctrlComp, ArmFSMStateName stateName, std::string stateNameString); - virtual ~FSMState(){} - - virtual void enter() = 0; - virtual void run() = 0; - virtual void exit() = 0; - virtual int checkChange(int cmd) {return (int)ArmFSMStateName::INVALID;} - bool _collisionTest(); - -protected: - void _armCtrl(); - void _recordData(); - Vec6 _postureToVec6(Posture posture); - void _tauFriction(); - - LowlevelCmd *_lowCmd; - LowlevelState *_lowState; - IOInterface *_ioInter; - ArmModel *_armModel; - - Vec6 _qPast, _qdPast, _q, _qd, _qdd, _tauForward; - double _gripperPos, _gripperW, _gripperTau; - - CtrlComponents *_ctrlComp; - Vec6 _g, _tauCmd, _tauFric; - -private: - - uint _collisionCnt; - - Vec6 _mLinearFriction; - Vec6 _mCoulombFriction; - -}; - -#endif // FSMSTATE_H +#ifndef FSMSTATE_H +#define FSMSTATE_H + +#include +#include +#include +#include "control/CtrlComponents.h" +#include "common/math/mathTools.h" +#include "common/utilities/timer.h" +#include "FSM/BaseState.h" + +class FSMState : public BaseState{ +public: + FSMState(CtrlComponents *ctrlComp, ArmFSMStateName stateName, std::string stateNameString); + virtual ~FSMState(){} + + virtual void enter() = 0; + virtual void run() = 0; + virtual void exit() = 0; + virtual int checkChange(int cmd) {return (int)ArmFSMStateName::INVALID;} + bool _collisionTest(); + +protected: + void _armCtrl(); + void _recordData(); + Vec6 _postureToVec6(Posture posture); + void _tauFriction(); + + LowlevelCmd *_lowCmd; + LowlevelState *_lowState; + IOInterface *_ioInter; + ArmModel *_armModel; + + Vec6 _qPast, _qdPast, _q, _qd, _qdd, _tauForward; + double _gripperPos, _gripperW, _gripperTau; + + CtrlComponents *_ctrlComp; + Vec6 _g, _tauCmd, _tauFric; + +private: + + uint _collisionCnt; + + Vec6 _mLinearFriction; + Vec6 _mCoulombFriction; + +}; + +#endif // FSMSTATE_H diff --git a/include/FSM/FiniteStateMachine.h b/include/FSM/FiniteStateMachine.h index e6d1df7..4fcb3e6 100755 --- a/include/FSM/FiniteStateMachine.h +++ b/include/FSM/FiniteStateMachine.h @@ -1,28 +1,28 @@ -#ifndef FSM_H -#define FSM_H - -#include -#include "FSM/FSMState.h" -#include "common/utilities/loop.h" -#include "control/CtrlComponents.h" - -class FiniteStateMachine{ -public: - FiniteStateMachine(std::vector states, CtrlComponents *ctrlComp); - virtual ~FiniteStateMachine(); - -private: - void _run(); - std::vector _states; - - FSMMode _mode; - bool _running; - FSMState* _currentState; - FSMState* _nextState; - int _nextStateEnum; - - CtrlComponents *_ctrlComp; - LoopFunc *_runThread; -}; - +#ifndef FSM_H +#define FSM_H + +#include +#include "FSM/FSMState.h" +#include "common/utilities/loop.h" +#include "control/CtrlComponents.h" + +class FiniteStateMachine{ +public: + FiniteStateMachine(std::vector states, CtrlComponents *ctrlComp); + virtual ~FiniteStateMachine(); + +private: + void _run(); + std::vector _states; + + FSMMode _mode; + bool _running; + FSMState* _currentState; + FSMState* _nextState; + int _nextStateEnum; + + CtrlComponents *_ctrlComp; + LoopFunc *_runThread; +}; + #endif // FSM_H \ No newline at end of file diff --git a/include/FSM/State_BackToStart.h b/include/FSM/State_BackToStart.h index 61f239f..6c811ba 100644 --- a/include/FSM/State_BackToStart.h +++ b/include/FSM/State_BackToStart.h @@ -1,22 +1,22 @@ -#ifndef STATE_BACKTOSTART_H -#define STATE_BACKTOSTART_H - - -#include "FSM/FSMState.h" -#include "trajectory/JointSpaceTraj.h" - -class State_BackToStart : public FSMState{ -public: - State_BackToStart(CtrlComponents *ctrlComp); - ~State_BackToStart(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - bool _reach, _pastReach; - JointSpaceTraj *_jointTraj; - Vec6 _pos_startFlat; -}; - +#ifndef STATE_BACKTOSTART_H +#define STATE_BACKTOSTART_H + + +#include "FSM/FSMState.h" +#include "trajectory/JointSpaceTraj.h" + +class State_BackToStart : public FSMState{ +public: + State_BackToStart(CtrlComponents *ctrlComp); + ~State_BackToStart(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + bool _reach, _pastReach; + JointSpaceTraj *_jointTraj; + Vec6 _pos_startFlat; +}; + #endif // STATE_BACKTOSTART_H \ No newline at end of file diff --git a/include/FSM/State_Calibration.h b/include/FSM/State_Calibration.h index 4668eb9..87d7404 100644 --- a/include/FSM/State_Calibration.h +++ b/include/FSM/State_Calibration.h @@ -1,18 +1,18 @@ -#ifndef STATE_CALIBRATION_H -#define STATE_CALIBRATION_H - -#include "FSM/FSMState.h" - -class State_Calibration : public FSMState{ -public: - State_Calibration(CtrlComponents *ctrlComp); - ~State_Calibration(){} - void enter(); - void run(){}; - void exit(){}; - int checkChange(int cmd); -private: - -}; - +#ifndef STATE_CALIBRATION_H +#define STATE_CALIBRATION_H + +#include "FSM/FSMState.h" + +class State_Calibration : public FSMState{ +public: + State_Calibration(CtrlComponents *ctrlComp); + ~State_Calibration(){} + void enter(); + void run(){}; + void exit(){}; + int checkChange(int cmd); +private: + +}; + #endif // STATE_CALIBRATION_H \ No newline at end of file diff --git a/include/FSM/State_Cartesian.h b/include/FSM/State_Cartesian.h old mode 100755 new mode 100644 diff --git a/include/FSM/State_JointSpace.h b/include/FSM/State_JointSpace.h index 4b7bbdd..5a421d5 100755 --- a/include/FSM/State_JointSpace.h +++ b/include/FSM/State_JointSpace.h @@ -1,18 +1,18 @@ -#ifndef JOINTSPACE_H -#define JOINTSPACE_H - -#include "FSM/FSMState.h" - -class State_JointSpace : public FSMState{ -public: - State_JointSpace(CtrlComponents *ctrlComp); - ~State_JointSpace(){} - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - std::vector jointSpeedMax; -}; - +#ifndef JOINTSPACE_H +#define JOINTSPACE_H + +#include "FSM/FSMState.h" + +class State_JointSpace : public FSMState{ +public: + State_JointSpace(CtrlComponents *ctrlComp); + ~State_JointSpace(){} + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + std::vector jointSpeedMax; +}; + #endif // JOINTSPACE_H \ No newline at end of file diff --git a/include/FSM/State_LowCmd.h b/include/FSM/State_LowCmd.h index ce00143..c528e87 100755 --- a/include/FSM/State_LowCmd.h +++ b/include/FSM/State_LowCmd.h @@ -1,18 +1,18 @@ -#ifndef LOWCMD_H -#define LOWCMD_H - -#include "FSMState.h" - -class State_LowCmd : public FSMState{ -public: - State_LowCmd(CtrlComponents *ctrlComp); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - std::vector _kp; - std::vector _kw; -}; - +#ifndef LOWCMD_H +#define LOWCMD_H + +#include "FSMState.h" + +class State_LowCmd : public FSMState{ +public: + State_LowCmd(CtrlComponents *ctrlComp); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + std::vector _kp; + std::vector _kw; +}; + #endif // LOWCMD_H \ No newline at end of file diff --git a/include/FSM/State_MoveC.h b/include/FSM/State_MoveC.h index a226e61..9843ee0 100755 --- a/include/FSM/State_MoveC.h +++ b/include/FSM/State_MoveC.h @@ -1,23 +1,23 @@ -#ifndef MOVEC_H -#define MOVEC_H - -#include "FSM/FSMState.h" -#include "trajectory/EndCircleTraj.h" - -class State_MoveC : public FSMState{ -public: - State_MoveC(CtrlComponents *ctrlComp); - ~State_MoveC(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - double _speed; - std::vector _postures; - EndCircleTraj *_circleTraj; - bool _timeReached, _taskReached, _pastTaskReached, _finalReached; - uint _taskCnt; -}; - +#ifndef MOVEC_H +#define MOVEC_H + +#include "FSM/FSMState.h" +#include "trajectory/EndCircleTraj.h" + +class State_MoveC : public FSMState{ +public: + State_MoveC(CtrlComponents *ctrlComp); + ~State_MoveC(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + double _speed; + std::vector _postures; + EndCircleTraj *_circleTraj; + bool _timeReached, _taskReached, _pastTaskReached, _finalReached; + uint _taskCnt; +}; + #endif // CARTESIAN_H \ No newline at end of file diff --git a/include/FSM/State_MoveJ.h b/include/FSM/State_MoveJ.h old mode 100755 new mode 100644 diff --git a/include/FSM/State_MoveL.h b/include/FSM/State_MoveL.h old mode 100755 new mode 100644 diff --git a/include/FSM/State_Passive.h b/include/FSM/State_Passive.h index b4c4306..b3702d2 100755 --- a/include/FSM/State_Passive.h +++ b/include/FSM/State_Passive.h @@ -1,15 +1,15 @@ -#ifndef PASSIVE_H -#define PASSIVE_H - -#include "FSM/FSMState.h" - -class State_Passive : public FSMState{ -public: - State_Passive(CtrlComponents *ctrlComp); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -}; - +#ifndef PASSIVE_H +#define PASSIVE_H + +#include "FSM/FSMState.h" + +class State_Passive : public FSMState{ +public: + State_Passive(CtrlComponents *ctrlComp); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +}; + #endif // PASSIVE_H \ No newline at end of file diff --git a/include/FSM/State_SaveState.h b/include/FSM/State_SaveState.h index 5393fc7..412bc71 100755 --- a/include/FSM/State_SaveState.h +++ b/include/FSM/State_SaveState.h @@ -1,18 +1,18 @@ -#ifndef SAVESTATE_H -#define SAVESTATE_H - -#include "FSMState.h" -#include "common/utilities/CSVTool.h" - -class State_SaveState : public FSMState{ -public: - State_SaveState(CtrlComponents *ctrlComp); - ~State_SaveState(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: -}; - +#ifndef SAVESTATE_H +#define SAVESTATE_H + +#include "FSMState.h" +#include "common/utilities/CSVTool.h" + +class State_SaveState : public FSMState{ +public: + State_SaveState(CtrlComponents *ctrlComp); + ~State_SaveState(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: +}; + #endif // SAVESTATE_H \ No newline at end of file diff --git a/include/FSM/State_Teach.h b/include/FSM/State_Teach.h index 0bfcbb9..d4cb058 100755 --- a/include/FSM/State_Teach.h +++ b/include/FSM/State_Teach.h @@ -1,24 +1,24 @@ -#ifndef STATETEACH_H -#define STATETEACH_H - -#include "FSM/FSMState.h" - -class State_Teach : public FSMState{ -public: - State_Teach(CtrlComponents *ctrlComp); - ~State_Teach(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - CSVTool *_trajCSV; - size_t _stateID = 0; - - Vec6 _KdDiag; - Vec6 _kpForStable; - Mat6 _Kd; - double _errorBias; -}; - +#ifndef STATETEACH_H +#define STATETEACH_H + +#include "FSM/FSMState.h" + +class State_Teach : public FSMState{ +public: + State_Teach(CtrlComponents *ctrlComp); + ~State_Teach(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + CSVTool *_trajCSV; + size_t _stateID = 0; + + Vec6 _KdDiag; + Vec6 _kpForStable; + Mat6 _Kd; + double _errorBias; +}; + #endif // STATETEACH_H \ No newline at end of file diff --git a/include/FSM/State_TeachRepeat.h b/include/FSM/State_TeachRepeat.h index e79802e..9d816bf 100755 --- a/include/FSM/State_TeachRepeat.h +++ b/include/FSM/State_TeachRepeat.h @@ -1,28 +1,28 @@ -#ifndef STATE_TEACHREPEAT_H -#define STATE_TEACHREPEAT_H - -#include "FSM/FSMState.h" -#include "trajectory/TrajectoryManager.h" - -class State_TeachRepeat : public FSMState{ -public: - State_TeachRepeat(CtrlComponents *ctrlComp); - ~State_TeachRepeat(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - bool _setCorrectly; - JointSpaceTraj *_toStartTraj; - bool _reachedStart = false; - bool _finishedRepeat = false; - size_t _index = 0; - size_t _indexPast; - Vec6 _trajStartQ, _trajStartQd; - double _trajStartGripperQ, _trajStartGripperQd; - - CSVTool *_csvFile; -}; - +#ifndef STATE_TEACHREPEAT_H +#define STATE_TEACHREPEAT_H + +#include "FSM/FSMState.h" +#include "trajectory/TrajectoryManager.h" + +class State_TeachRepeat : public FSMState{ +public: + State_TeachRepeat(CtrlComponents *ctrlComp); + ~State_TeachRepeat(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + bool _setCorrectly; + JointSpaceTraj *_toStartTraj; + bool _reachedStart = false; + bool _finishedRepeat = false; + size_t _index = 0; + size_t _indexPast; + Vec6 _trajStartQ, _trajStartQd; + double _trajStartGripperQ, _trajStartGripperQd; + + CSVTool *_csvFile; +}; + #endif // STATE_TEACHREPEAT_H \ No newline at end of file diff --git a/include/FSM/State_ToState.h b/include/FSM/State_ToState.h index 066ceb3..e063f77 100755 --- a/include/FSM/State_ToState.h +++ b/include/FSM/State_ToState.h @@ -1,24 +1,24 @@ -#ifndef TOSTATE_H -#define TOSTATE_H - -#include "FSM/FSMState.h" -#include "trajectory/JointSpaceTraj.h" - -class State_ToState : public FSMState{ -public: - State_ToState(CtrlComponents *ctrlComp); - ~State_ToState(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -private: - bool _setCorrectly; - double _costTime; - HomoMat _goalHomo; - JointSpaceTraj *_jointTraj; - bool _reach, _pastReach; - std::string _goalName; -}; - +#ifndef TOSTATE_H +#define TOSTATE_H + +#include "FSM/FSMState.h" +#include "trajectory/JointSpaceTraj.h" + +class State_ToState : public FSMState{ +public: + State_ToState(CtrlComponents *ctrlComp); + ~State_ToState(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +private: + bool _setCorrectly; + double _costTime; + HomoMat _goalHomo; + JointSpaceTraj *_jointTraj; + bool _reach, _pastReach; + std::string _goalName; +}; + #endif // TOSTATE_H \ No newline at end of file diff --git a/include/FSM/State_Trajectory.h b/include/FSM/State_Trajectory.h index 9955df9..a5da191 100755 --- a/include/FSM/State_Trajectory.h +++ b/include/FSM/State_Trajectory.h @@ -1,37 +1,37 @@ -#ifndef CARTESIANPATH_H -#define CARTESIANPATH_H - -#include "FSM/FSMState.h" -#include "trajectory/TrajectoryManager.h" - -class State_Trajectory : public FSMState{ -public: - State_Trajectory(CtrlComponents *ctrlComp, - ArmFSMStateName stateEnum = ArmFSMStateName::TRAJECTORY, - std::string stateString = "trajectory"); - ~State_Trajectory(); - void enter(); - void run(); - void exit(); - int checkChange(int cmd); -protected: - void _setTraj(); - - TrajectoryManager *_traj; - HomoMat _goalHomo; - Vec6 _goalTwist; - double speedTemp; - - JointSpaceTraj *_toStartTraj; - bool _reachedStart = false; - bool _finishedTraj = false; - std::vector _jointTraj; - std::vector _circleTraj; - std::vector _stopTraj; - std::vector _lineTraj; - - static std::vector _trajCmd; - Vec6 _posture[2]; -}; - +#ifndef CARTESIANPATH_H +#define CARTESIANPATH_H + +#include "FSM/FSMState.h" +#include "trajectory/TrajectoryManager.h" + +class State_Trajectory : public FSMState{ +public: + State_Trajectory(CtrlComponents *ctrlComp, + ArmFSMStateName stateEnum = ArmFSMStateName::TRAJECTORY, + std::string stateString = "trajectory"); + ~State_Trajectory(); + void enter(); + void run(); + void exit(); + int checkChange(int cmd); +protected: + void _setTraj(); + + TrajectoryManager *_traj; + HomoMat _goalHomo; + Vec6 _goalTwist; + double speedTemp; + + JointSpaceTraj *_toStartTraj; + bool _reachedStart = false; + bool _finishedTraj = false; + std::vector _jointTraj; + std::vector _circleTraj; + std::vector _stopTraj; + std::vector _lineTraj; + + static std::vector _trajCmd; + Vec6 _posture[2]; +}; + #endif // CARTESIANPATH_H \ No newline at end of file diff --git a/include/common/enumClass.h b/include/common/enumClass.h index a48e186..754a835 100755 --- a/include/common/enumClass.h +++ b/include/common/enumClass.h @@ -1,39 +1,39 @@ -#ifndef ENUMCLASS_H -#define ENUMCLASS_H - -enum class FSMMode{ - NORMAL, - CHANGE -}; - -enum class ArmFSMStateName{ - INVALID, - PASSIVE, - JOINTCTRL, - CARTESIAN, - MOVEJ, - MOVEL, - MOVEC, - TRAJECTORY, - TOSTATE, - SAVESTATE, - TEACH, - TEACHREPEAT, - CALIBRATION, - SETTRAJ,//no longer used - BACKTOSTART, - NEXT, - LOWCMD -}; - -enum class JointMotorType{ - SINGLE_MOTOR, - DOUBLE_MOTOR -}; - -enum class Control{ - KEYBOARD, - SDK -}; - +#ifndef ENUMCLASS_H +#define ENUMCLASS_H + +enum class FSMMode{ + NORMAL, + CHANGE +}; + +enum class ArmFSMStateName{ + INVALID, + PASSIVE, + JOINTCTRL, + CARTESIAN, + MOVEJ, + MOVEL, + MOVEC, + TRAJECTORY, + TOSTATE, + SAVESTATE, + TEACH, + TEACHREPEAT, + CALIBRATION, + SETTRAJ,//no longer used + BACKTOSTART, + NEXT, + LOWCMD +}; + +enum class JointMotorType{ + SINGLE_MOTOR, + DOUBLE_MOTOR +}; + +enum class Control{ + KEYBOARD, + SDK +}; + #endif // ENUMCLASS_H \ No newline at end of file diff --git a/include/common/math/Filter.h b/include/common/math/Filter.h old mode 100644 new mode 100755 index ec421da..c5bebe3 --- a/include/common/math/Filter.h +++ b/include/common/math/Filter.h @@ -1,29 +1,29 @@ -#ifndef FILTER -#define FILTER - -#include -#include - -/* - Low pass filter -*/ -class LPFilter{ -public: - LPFilter(double samplePeriod, double cutFrequency, size_t valueCount); - ~LPFilter(){}; - void clear(); - void addValue(double &newValue); - void addValue(std::vector &vec); - - template - void addValue(Eigen::MatrixBase &eigenVec); - - // double getValue(); -private: - size_t _valueCount; - double _weight; - std::vector _pastValue; - bool _start; -}; - +#ifndef FILTER +#define FILTER + +#include +#include + +/* + Low pass filter +*/ +class LPFilter{ +public: + LPFilter(double samplePeriod, double cutFrequency, size_t valueCount); + ~LPFilter(){}; + void clear(); + void addValue(double &newValue); + void addValue(std::vector &vec); + + template + void addValue(Eigen::MatrixBase &eigenVec); + + // double getValue(); +private: + size_t _valueCount; + double _weight; + std::vector _pastValue; + bool _start; +}; + #endif // FILTER \ No newline at end of file diff --git a/include/common/math/mathTypes.h b/include/common/math/mathTypes.h index b74c7d7..08ca8a6 100755 --- a/include/common/math/mathTypes.h +++ b/include/common/math/mathTypes.h @@ -1,109 +1,109 @@ -#ifndef MATHTYPES_H -#define MATHTYPES_H - -#include -#include - -/************************/ -/******** Vector ********/ -/************************/ -// 2x1 Vector -using Vec2 = typename Eigen::Matrix; - -// 3x1 Vector -using Vec3 = typename Eigen::Matrix; - -// 4x1 Vector -using Vec4 = typename Eigen::Matrix; - -// 6x1 Vector -using Vec6 = typename Eigen::Matrix; - -// Quaternion -using Quat = typename Eigen::Matrix; - -// 4x1 Integer Vector -using VecInt4 = typename Eigen::Matrix; - -// 12x1 Vector -using Vec12 = typename Eigen::Matrix; - -// 18x1 Vector -using Vec18 = typename Eigen::Matrix; - -// Dynamic Length Vector -using VecX = typename Eigen::Matrix; - -/************************/ -/******** Matrix ********/ -/************************/ -// Rotation Matrix -using RotMat = typename Eigen::Matrix; - -// Homogenous Matrix -using HomoMat = typename Eigen::Matrix; - -// 2x2 Matrix -using Mat2 = typename Eigen::Matrix; - -// 3x3 Matrix -using Mat3 = typename Eigen::Matrix; - -// 3x4 Matrix, each column is a 3x1 vector -using Vec34 = typename Eigen::Matrix; - -// 6x6 Matrix -using Mat6 = typename Eigen::Matrix; - -// 12x12 Matrix -using Mat12 = typename Eigen::Matrix; - -// 3x3 Identity Matrix -#define I3 Eigen::MatrixXd::Identity(3, 3) - -// 6x6 Identity Matrix -#define I6 Eigen::MatrixXd::Identity(6, 6) - -// 12x12 Identity Matrix -#define I12 Eigen::MatrixXd::Identity(12, 12) - -// 18x18 Identity Matrix -#define I18 Eigen::MatrixXd::Identity(18, 18) - -// Dynamic Size Matrix -using MatX = typename Eigen::Matrix; - -/************************/ -/****** Functions *******/ -/************************/ -inline Vec34 vec12ToVec34(Vec12 vec12){ - Vec34 vec34; - for(int i(0); i < 4; ++i){ - vec34.col(i) = vec12.segment(3*i, 3); - } - return vec34; -} - -inline Vec12 vec34ToVec12(Vec34 vec34){ - Vec12 vec12; - for(int i(0); i < 4; ++i){ - vec12.segment(3*i, 3) = vec34.col(i); - } - return vec12; -} - -template -inline VecX stdVecToEigenVec(T stdVec){ - VecX eigenVec = Eigen::VectorXd::Map(&stdVec[0], stdVec.size()); - return eigenVec; -} - -inline std::vector EigenVectostdVec(VecX eigenVec){ - std::vector stdVec; - for(int i(0); i +#include + +/************************/ +/******** Vector ********/ +/************************/ +// 2x1 Vector +using Vec2 = typename Eigen::Matrix; + +// 3x1 Vector +using Vec3 = typename Eigen::Matrix; + +// 4x1 Vector +using Vec4 = typename Eigen::Matrix; + +// 6x1 Vector +using Vec6 = typename Eigen::Matrix; + +// Quaternion +using Quat = typename Eigen::Matrix; + +// 4x1 Integer Vector +using VecInt4 = typename Eigen::Matrix; + +// 12x1 Vector +using Vec12 = typename Eigen::Matrix; + +// 18x1 Vector +using Vec18 = typename Eigen::Matrix; + +// Dynamic Length Vector +using VecX = typename Eigen::Matrix; + +/************************/ +/******** Matrix ********/ +/************************/ +// Rotation Matrix +using RotMat = typename Eigen::Matrix; + +// Homogenous Matrix +using HomoMat = typename Eigen::Matrix; + +// 2x2 Matrix +using Mat2 = typename Eigen::Matrix; + +// 3x3 Matrix +using Mat3 = typename Eigen::Matrix; + +// 3x4 Matrix, each column is a 3x1 vector +using Vec34 = typename Eigen::Matrix; + +// 6x6 Matrix +using Mat6 = typename Eigen::Matrix; + +// 12x12 Matrix +using Mat12 = typename Eigen::Matrix; + +// 3x3 Identity Matrix +#define I3 Eigen::MatrixXd::Identity(3, 3) + +// 6x6 Identity Matrix +#define I6 Eigen::MatrixXd::Identity(6, 6) + +// 12x12 Identity Matrix +#define I12 Eigen::MatrixXd::Identity(12, 12) + +// 18x18 Identity Matrix +#define I18 Eigen::MatrixXd::Identity(18, 18) + +// Dynamic Size Matrix +using MatX = typename Eigen::Matrix; + +/************************/ +/****** Functions *******/ +/************************/ +inline Vec34 vec12ToVec34(Vec12 vec12){ + Vec34 vec34; + for(int i(0); i < 4; ++i){ + vec34.col(i) = vec12.segment(3*i, 3); + } + return vec34; +} + +inline Vec12 vec34ToVec12(Vec34 vec34){ + Vec12 vec12; + for(int i(0); i < 4; ++i){ + vec12.segment(3*i, 3) = vec34.col(i); + } + return vec12; +} + +template +inline VecX stdVecToEigenVec(T stdVec){ + VecX eigenVec = Eigen::VectorXd::Map(&stdVec[0], stdVec.size()); + return eigenVec; +} + +inline std::vector EigenVectostdVec(VecX eigenVec){ + std::vector stdVec; + for(int i(0); i (read only) - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "common/utilities/typeTrans.h" - -enum class FileType{ - READ_WRITE, - CLEAR_DUMP -}; - -class CSVLine{ -public: - // CSVLine(std::string lineTemp, std::streampos filePos); - CSVLine(std::string lineTemp); - CSVLine(std::string label, std::vector values); - ~CSVLine(){} - - // void updateFilePos(std::streampos filePos){_filePos = filePos;} - void getValues(std::vector &values); - void changeValue(std::vector values); - void writeAtEnd(std::fstream &ioStream); - std::string getLabel(){return _label;} - -private: - // std::streampos _filePos; - std::string _label; - std::vector _values; -}; - -/* -FileType::READ_WRITE : must already exist such fileName -FileType::CLEAR_DUMP : if do not exist such file, will create one -*/ -class CSVTool{ -public: - CSVTool(std::string fileName, FileType type = FileType::READ_WRITE, int precision = 6); - ~CSVTool(){_ioStream.close();} - - bool getLine(std::string label, std::vector &values); - template - bool getLineDirect(std::string label, Args&... values); - - void modifyLine(std::string label, std::vector &values, bool addNew); - template - void modifyLineDirect(std::string label, bool addNew, Args&... values); - - void readFile(); - void saveFile(); - - bool _hasFile; -private: - std::string _fileName; - std::fstream _ioStream; - int _precision; - std::string _lineTemp; - std::map _labels; - std::vector _lines; - -}; - -/*************************/ -/* CSVLine */ -/*************************/ -// CSVLine::CSVLine(std::string lineTemp, std::streampos filePos) -// :_filePos(filePos){ - -// // std::cout << lineTemp << std::endl; -// } - -inline CSVLine::CSVLine(std::string lineTemp){ - // delete all spaces - lineTemp.erase(std::remove(lineTemp.begin(), lineTemp.end(), ' '), lineTemp.end()); - - std::stringstream ss(lineTemp); - std::string stringTemp; - - std::getline(ss, _label, ','); - - while(std::getline(ss, stringTemp, ',')){ - _values.push_back(stod(stringTemp)); - } - - // std::cout << "**********" << std::endl; - // std::cout << "_label: " << _label << std::fixed << std::setprecision(3) << std::endl; - // for(int i(0); i<_values.size(); ++i){ - // std::cout << _values.at(i) << ",,, "; - // } - // std::cout << std::endl; -} - -inline CSVLine::CSVLine(std::string label, std::vector values) - :_label(label), _values(values){ - -} - -inline void CSVLine::changeValue(std::vector values){ - if(values.size() != _values.size()){ - std::cout << "[WARNING] CSVLine::changeValue, the size changed" << std::endl; - } - _values = values; -} - -inline void CSVLine::getValues(std::vector &values){ - values = _values; -} - -inline void CSVLine::writeAtEnd(std::fstream &ioStream){ - ioStream << _label << ", "; - - for(int i(0); i<_values.size(); ++i){ - ioStream << _values.at(i) << ", "; - } - - ioStream << std::endl; -} - - -/*************************/ -/* CSVTool */ -/*************************/ -inline CSVTool::CSVTool(std::string fileName, FileType type, int precision) - : _fileName(fileName), _precision(precision){ - - if(type == FileType::READ_WRITE){ - _ioStream.open(_fileName, std::fstream::ate | std::fstream::in | std::fstream::out); - - if(!_ioStream.is_open()){ - std::cout << "[ERROR] CSVTool open file: " << fileName << " failed!" << std::endl; - // exit(-1); - _hasFile = false; - }else{ - readFile(); - _hasFile = true; - } - - } - else if(type == FileType::CLEAR_DUMP){ - _ioStream.open(_fileName, std::fstream::out); - } - -} - -inline void CSVTool::readFile(){ - if(!_ioStream.is_open()){ - // _ioStream.open(_fileName, std::fstream::ate | std::fstream::in | std::fstream::out); - std::cout << "[ERROR] CSVTool::readFile, file: " << _fileName << " has not been opened!" << std::endl; - return; - } - - _lines.clear(); - _labels.clear(); - - _ioStream.seekg(0, std::fstream::beg); - size_t lineNum = 0; - while(_ioStream && _ioStream.tellg() != std::fstream::end && getline(_ioStream, _lineTemp)){ - _lines.push_back( new CSVLine(_lineTemp) ); - - if(_labels.count(_lines.at(lineNum)->getLabel()) == 0){ - _labels.insert(std::pair(_lines.at(lineNum)->getLabel(), lineNum)); - ++lineNum; - }else{ - std::cout << "[ERROR] CSVTool::readFile, the label " - << _lines.at(lineNum)->getLabel() << " is repeated" << std::endl; - exit(-1); - } - } -} - -inline bool CSVTool::getLine(std::string label, std::vector &values){ - if(_labels.count(label) == 0){ - std::cout << "[ERROR] No such label: " << label << std::endl; - return false; - }else{ - _lines.at(_labels[label])->getValues(values); - return true; - } -} - -template -inline bool CSVTool::getLineDirect(std::string label, Args&... values){ - std::vector vec; - if(getLine(label, vec)){ - typeTrans::extractVector(vec, values...); - return true; - }else{ - return false; - } -} - -template -inline void CSVTool::modifyLineDirect(std::string label, bool addNew, Args&... values){ - std::vector vec; - typeTrans::combineToVector(vec, values...); - -// std::cout << "CSVTool::modifyLineDirect------" << std::endl; -// std::cout << "label: " << label << std::endl; -// std::cout << "vec: "; -// for(int i(0); iwriteAtEnd(_ioStream); - } - - _ioStream.close(); - _ioStream.open(_fileName, std::fstream::ate | std::fstream::in | std::fstream::out); -} - -inline void CSVTool::modifyLine(std::string label, std::vector &values, bool addNew =false){ - if(_labels.count(label) == 0){ - if(addNew){ - _labels.insert(std::pair(label, _labels.size())); - _lines.push_back(new CSVLine(label, values)); - }else{ - std::cout << "[ERROR] CSVTool::modifyLine, label " << label << "does not exist" << std::endl; - exit(-1); - } - }else{ - _lines.at(_labels[label])->changeValue(values); - } -} - - +#ifndef CSVTOOL_H +#define CSVTOOL_H + +/* + personal tool for .csv reading and modifying. + only suitable for small .csv file. + for large .csv, try (read only) + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "common/utilities/typeTrans.h" + +enum class FileType{ + READ_WRITE, + CLEAR_DUMP +}; + +class CSVLine{ +public: + // CSVLine(std::string lineTemp, std::streampos filePos); + CSVLine(std::string lineTemp); + CSVLine(std::string label, std::vector values); + ~CSVLine(){} + + // void updateFilePos(std::streampos filePos){_filePos = filePos;} + void getValues(std::vector &values); + void changeValue(std::vector values); + void writeAtEnd(std::fstream &ioStream); + std::string getLabel(){return _label;} + +private: + // std::streampos _filePos; + std::string _label; + std::vector _values; +}; + +/* +FileType::READ_WRITE : must already exist such fileName +FileType::CLEAR_DUMP : if do not exist such file, will create one +*/ +class CSVTool{ +public: + CSVTool(std::string fileName, FileType type = FileType::READ_WRITE, int precision = 6); + ~CSVTool(){_ioStream.close();} + + bool getLine(std::string label, std::vector &values); + template + bool getLineDirect(std::string label, Args&... values); + + void modifyLine(std::string label, std::vector &values, bool addNew); + template + void modifyLineDirect(std::string label, bool addNew, Args&... values); + + void readFile(); + void saveFile(); + + bool _hasFile; +private: + std::string _fileName; + std::fstream _ioStream; + int _precision; + std::string _lineTemp; + std::map _labels; + std::vector _lines; + +}; + +/*************************/ +/* CSVLine */ +/*************************/ +// CSVLine::CSVLine(std::string lineTemp, std::streampos filePos) +// :_filePos(filePos){ + +// // std::cout << lineTemp << std::endl; +// } + +inline CSVLine::CSVLine(std::string lineTemp){ + // delete all spaces + lineTemp.erase(std::remove(lineTemp.begin(), lineTemp.end(), ' '), lineTemp.end()); + + std::stringstream ss(lineTemp); + std::string stringTemp; + + std::getline(ss, _label, ','); + + while(std::getline(ss, stringTemp, ',')){ + _values.push_back(stod(stringTemp)); + } + + // std::cout << "**********" << std::endl; + // std::cout << "_label: " << _label << std::fixed << std::setprecision(3) << std::endl; + // for(int i(0); i<_values.size(); ++i){ + // std::cout << _values.at(i) << ",,, "; + // } + // std::cout << std::endl; +} + +inline CSVLine::CSVLine(std::string label, std::vector values) + :_label(label), _values(values){ + +} + +inline void CSVLine::changeValue(std::vector values){ + if(values.size() != _values.size()){ + std::cout << "[WARNING] CSVLine::changeValue, the size changed" << std::endl; + } + _values = values; +} + +inline void CSVLine::getValues(std::vector &values){ + values = _values; +} + +inline void CSVLine::writeAtEnd(std::fstream &ioStream){ + ioStream << _label << ", "; + + for(int i(0); i<_values.size(); ++i){ + ioStream << _values.at(i) << ", "; + } + + ioStream << std::endl; +} + + +/*************************/ +/* CSVTool */ +/*************************/ +inline CSVTool::CSVTool(std::string fileName, FileType type, int precision) + : _fileName(fileName), _precision(precision){ + + if(type == FileType::READ_WRITE){ + _ioStream.open(_fileName, std::fstream::ate | std::fstream::in | std::fstream::out); + + if(!_ioStream.is_open()){ + std::cout << "[ERROR] CSVTool open file: " << fileName << " failed!" << std::endl; + // exit(-1); + _hasFile = false; + }else{ + readFile(); + _hasFile = true; + } + + } + else if(type == FileType::CLEAR_DUMP){ + _ioStream.open(_fileName, std::fstream::out); + } + +} + +inline void CSVTool::readFile(){ + if(!_ioStream.is_open()){ + // _ioStream.open(_fileName, std::fstream::ate | std::fstream::in | std::fstream::out); + std::cout << "[ERROR] CSVTool::readFile, file: " << _fileName << " has not been opened!" << std::endl; + return; + } + + _lines.clear(); + _labels.clear(); + + _ioStream.seekg(0, std::fstream::beg); + size_t lineNum = 0; + while(_ioStream && _ioStream.tellg() != std::fstream::end && getline(_ioStream, _lineTemp)){ + _lines.push_back( new CSVLine(_lineTemp) ); + + if(_labels.count(_lines.at(lineNum)->getLabel()) == 0){ + _labels.insert(std::pair(_lines.at(lineNum)->getLabel(), lineNum)); + ++lineNum; + }else{ + std::cout << "[ERROR] CSVTool::readFile, the label " + << _lines.at(lineNum)->getLabel() << " is repeated" << std::endl; + exit(-1); + } + } +} + +inline bool CSVTool::getLine(std::string label, std::vector &values){ + if(_labels.count(label) == 0){ + std::cout << "[ERROR] No such label: " << label << std::endl; + return false; + }else{ + _lines.at(_labels[label])->getValues(values); + return true; + } +} + +template +inline bool CSVTool::getLineDirect(std::string label, Args&... values){ + std::vector vec; + if(getLine(label, vec)){ + typeTrans::extractVector(vec, values...); + return true; + }else{ + return false; + } +} + +template +inline void CSVTool::modifyLineDirect(std::string label, bool addNew, Args&... values){ + std::vector vec; + typeTrans::combineToVector(vec, values...); + +// std::cout << "CSVTool::modifyLineDirect------" << std::endl; +// std::cout << "label: " << label << std::endl; +// std::cout << "vec: "; +// for(int i(0); iwriteAtEnd(_ioStream); + } + + _ioStream.close(); + _ioStream.open(_fileName, std::fstream::ate | std::fstream::in | std::fstream::out); +} + +inline void CSVTool::modifyLine(std::string label, std::vector &values, bool addNew =false){ + if(_labels.count(label) == 0){ + if(addNew){ + _labels.insert(std::pair(label, _labels.size())); + _lines.push_back(new CSVLine(label, values)); + }else{ + std::cout << "[ERROR] CSVTool::modifyLine, label " << label << "does not exist" << std::endl; + exit(-1); + } + }else{ + _lines.at(_labels[label])->changeValue(values); + } +} + + #endif // CSVTOOL_H \ No newline at end of file diff --git a/include/common/utilities/loop.h b/include/common/utilities/loop.h old mode 100644 new mode 100755 diff --git a/include/common/utilities/typeTrans.h b/include/common/utilities/typeTrans.h index 0f422e8..8096676 100755 --- a/include/common/utilities/typeTrans.h +++ b/include/common/utilities/typeTrans.h @@ -1,75 +1,75 @@ -#ifndef TYPETRANS_H -#define TYPETRANS_H - -#include -#include -#include - -namespace typeTrans{ - -inline void addValue(std::vector &vec, double value){ - vec.push_back(value); -} - -inline double getValue(std::vector &vec, double value){ - value = vec.at(0); - std::vector::iterator begin = vec.begin(); - vec.erase(begin); - - return value; -} - -inline void addValue(std::vector &vec, Eigen::MatrixXd value){ - for(int i(0); i &vec, Eigen::MatrixXd value){ - std::vector::iterator begin = vec.begin(); - std::vector::iterator end = begin; - - for(int i(0); i -inline void combineToVector(std::vector &vec, T value){ - addValue(vec, value); -} - -template -inline void combineToVector(std::vector &vec, const T t, const Args... rest){ - combineToVector(vec, t); - - combineToVector(vec, rest...); -} - - -/* extract different type variables from vector */ -template -inline void extractVector(std::vector &vec, T &value){ - value = getValue(vec, value); -} - -template -inline void extractVector(std::vector &vec, T &t, Args&... rest){ - extractVector(vec, t); - - extractVector(vec, rest...); -} - -} - +#ifndef TYPETRANS_H +#define TYPETRANS_H + +#include +#include +#include + +namespace typeTrans{ + +inline void addValue(std::vector &vec, double value){ + vec.push_back(value); +} + +inline double getValue(std::vector &vec, double value){ + value = vec.at(0); + std::vector::iterator begin = vec.begin(); + vec.erase(begin); + + return value; +} + +inline void addValue(std::vector &vec, Eigen::MatrixXd value){ + for(int i(0); i &vec, Eigen::MatrixXd value){ + std::vector::iterator begin = vec.begin(); + std::vector::iterator end = begin; + + for(int i(0); i +inline void combineToVector(std::vector &vec, T value){ + addValue(vec, value); +} + +template +inline void combineToVector(std::vector &vec, const T t, const Args... rest){ + combineToVector(vec, t); + + combineToVector(vec, rest...); +} + + +/* extract different type variables from vector */ +template +inline void extractVector(std::vector &vec, T &value){ + value = getValue(vec, value); +} + +template +inline void extractVector(std::vector &vec, T &t, Args&... rest){ + extractVector(vec, t); + + extractVector(vec, rest...); +} + +} + #endif // TYPETRANS_H \ No newline at end of file diff --git a/include/control/CtrlComponents.h b/include/control/CtrlComponents.h index 6b4e242..9829ba0 100755 --- a/include/control/CtrlComponents.h +++ b/include/control/CtrlComponents.h @@ -1,53 +1,53 @@ -#ifndef CTRLCOMPONENTS_H -#define CTRLCOMPONENTS_H - -#include -#include -#include "common/utilities/loop.h" -#include "message/arm_common.h" -#include "message/LowlevelCmd.h" -#include "message/LowlevelState.h" -#include "common/utilities/CSVTool.h" -#include "model/ArmModel.h" -#include "interface/IOUDP.h" -#include "interface/IOROS.h" -#include "control/armSDK.h" - -using namespace std; - -struct CtrlComponents{ -public: - CtrlComponents(int argc, char**argv); - ~CtrlComponents(); - - std::string armConfigPath; - CmdPanel *cmdPanel; - IOInterface *ioInter; - Z1Model *armModel; - CSVTool *stateCSV; - - SendCmd sendCmd; // cmd that receive from SDK - RecvState recvState;// state that send to SDK - - //config - double dt; - bool *running; - Control ctrl = Control::SDK; - bool hasGripper; - bool isCollisionOpen; - double collisionTLimit; - bool isPlot; - int trajChoose = 1; - size_t armType = 36; - - void geneObj(); - void writeData(); -private: - void configProcess(int argc, char** argv); - - std::string ctrl_IP; - uint ctrl_port; - double _loadWeight; -}; - +#ifndef CTRLCOMPONENTS_H +#define CTRLCOMPONENTS_H + +#include +#include +#include "common/utilities/loop.h" +#include "message/arm_common.h" +#include "message/LowlevelCmd.h" +#include "message/LowlevelState.h" +#include "common/utilities/CSVTool.h" +#include "model/ArmModel.h" +#include "interface/IOUDP.h" +#include "interface/IOROS.h" +#include "control/armSDK.h" + +using namespace std; + +struct CtrlComponents{ +public: + CtrlComponents(int argc, char**argv); + ~CtrlComponents(); + + std::string armConfigPath; + CmdPanel *cmdPanel; + IOInterface *ioInter; + Z1Model *armModel; + CSVTool *stateCSV; + + SendCmd sendCmd; // cmd that receive from SDK + RecvState recvState;// state that send to SDK + + //config + double dt; + bool *running; + Control ctrl = Control::SDK; + bool hasGripper; + bool isCollisionOpen; + double collisionTLimit; + bool isPlot; + int trajChoose = 1; + size_t armType = 36; + + void geneObj(); + void writeData(); +private: + void configProcess(int argc, char** argv); + + std::string ctrl_IP; + uint ctrl_port; + double _loadWeight; +}; + #endif // CTRLCOMPONENTS_H \ No newline at end of file diff --git a/include/interface/IOInterface.h b/include/interface/IOInterface.h index 9af2a71..444471d 100755 --- a/include/interface/IOInterface.h +++ b/include/interface/IOInterface.h @@ -1,28 +1,28 @@ -#ifndef IOINTERFACE_H -#define IOINTERFACE_H - -#include -#include "message/LowlevelCmd.h" -#include "message/LowlevelState.h" -#include "control/keyboard.h" -#include "common/math/robotics.h" - -class IOInterface{ -public: - IOInterface(){} - ~IOInterface(){ - delete lowCmd; - delete lowState; - }; - virtual bool sendRecv(const LowlevelCmd *cmd, LowlevelState *state) = 0; - virtual bool calibration(){return false;}; - bool checkGripper(){return hasGripper;}; - LowlevelCmd *lowCmd; - LowlevelState *lowState; - virtual bool isDisconnect(){ return false;}; - bool hasErrorState; -protected: - bool hasGripper; -}; - +#ifndef IOINTERFACE_H +#define IOINTERFACE_H + +#include +#include "message/LowlevelCmd.h" +#include "message/LowlevelState.h" +#include "control/keyboard.h" +#include "common/math/robotics.h" + +class IOInterface{ +public: + IOInterface(){} + ~IOInterface(){ + delete lowCmd; + delete lowState; + }; + virtual bool sendRecv(const LowlevelCmd *cmd, LowlevelState *state) = 0; + virtual bool calibration(){return false;}; + bool checkGripper(){return hasGripper;}; + LowlevelCmd *lowCmd; + LowlevelState *lowState; + virtual bool isDisconnect(){ return false;}; + bool hasErrorState; +protected: + bool hasGripper; +}; + #endif //IOINTERFACE_H \ No newline at end of file diff --git a/include/interface/IOROS.h b/include/interface/IOROS.h old mode 100755 new mode 100644 diff --git a/include/interface/IOUDP.h b/include/interface/IOUDP.h index 0b4fa05..1164ce5 100644 --- a/include/interface/IOUDP.h +++ b/include/interface/IOUDP.h @@ -1,26 +1,26 @@ -#ifndef IOUDP_H -#define IOUDP_H - -#include "interface/IOInterface.h" - -class IOUDP : public IOInterface{ -public: - IOUDP(const char* IP, uint port, size_t timeOutUs = 100000, bool showInfo = true); - ~IOUDP(); - - bool sendRecv(const LowlevelCmd *cmd, LowlevelState *state); - bool calibration(); - bool isDisconnect(){ return _ioPort->isDisConnect;} -private: - IOPort *_ioPort; - - UDPSendCmd _cmd; - UDPRecvState _state; - UDPRecvStateOld _stateOld; - size_t _motorNum; - size_t _jointNum; - uint8_t _singleState; - uint8_t _selfCheck[10]; -}; - +#ifndef IOUDP_H +#define IOUDP_H + +#include "interface/IOInterface.h" + +class IOUDP : public IOInterface{ +public: + IOUDP(const char* IP, uint port, size_t timeOutUs = 100000, bool showInfo = true); + ~IOUDP(); + + bool sendRecv(const LowlevelCmd *cmd, LowlevelState *state); + bool calibration(); + bool isDisconnect(){ return _ioPort->isDisConnect;} +private: + IOPort *_ioPort; + + UDPSendCmd _cmd; + UDPRecvState _state; + UDPRecvStateOld _stateOld; + size_t _motorNum; + size_t _jointNum; + uint8_t _singleState; + uint8_t _selfCheck[10]; +}; + #endif // IOUDP_H \ No newline at end of file diff --git a/include/message/LowlevelCmd.h b/include/message/LowlevelCmd.h index ac8ae44..24bda49 100755 --- a/include/message/LowlevelCmd.h +++ b/include/message/LowlevelCmd.h @@ -1,56 +1,56 @@ -#ifndef LOWLEVELCMD_H -#define LOWLEVELCMD_H - -#include "common/math/mathTypes.h" -#include "common/math/mathTools.h" -#include -#include - -struct LowlevelCmd{ -public: - std::vector q; - std::vector dq; - std::vector tau; - std::vector kp; - std::vector kd; - - std::vector> q_data; - std::vector> dq_data; - std::vector> tauf_data; - std::vector> tau_data; - - LowlevelCmd(); - ~LowlevelCmd(){} - - void setZeroDq(); - void setZeroTau(); - void setZeroKp(); - void setZeroKd(); - void setQ(VecX qInput); - void setQd(VecX qDInput); - void setTau(VecX tauInput); - - void setControlGain(); - void setControlGain(std::vector KP, std::vector KW); - void setPassive(); - - void setGripperGain(); - void setGripperGain(float KP, float KW); - void setGripperZeroGain(); - void setGripperQ(double qInput); - double getGripperQ(); - void setGripperQd(double qdInput); - double getGripperQd(); - void setGripperTau(double tauInput); - double getGripperTau(); - - Vec6 getQ(); - Vec6 getQd(); - - void resizeGripper(); -private: - size_t _dof = 6; -}; - - -#endif //LOWLEVELCMD_H +#ifndef LOWLEVELCMD_H +#define LOWLEVELCMD_H + +#include "common/math/mathTypes.h" +#include "common/math/mathTools.h" +#include +#include + +struct LowlevelCmd{ +public: + std::vector q; + std::vector dq; + std::vector tau; + std::vector kp; + std::vector kd; + + std::vector> q_data; + std::vector> dq_data; + std::vector> tauf_data; + std::vector> tau_data; + + LowlevelCmd(); + ~LowlevelCmd(){} + + void setZeroDq(); + void setZeroTau(); + void setZeroKp(); + void setZeroKd(); + void setQ(VecX qInput); + void setQd(VecX qDInput); + void setTau(VecX tauInput); + + void setControlGain(); + void setControlGain(std::vector KP, std::vector KW); + void setPassive(); + + void setGripperGain(); + void setGripperGain(float KP, float KW); + void setGripperZeroGain(); + void setGripperQ(double qInput); + double getGripperQ(); + void setGripperQd(double qdInput); + double getGripperQd(); + void setGripperTau(double tauInput); + double getGripperTau(); + + Vec6 getQ(); + Vec6 getQd(); + + void resizeGripper(); +private: + size_t _dof = 6; +}; + + +#endif //LOWLEVELCMD_H diff --git a/include/message/LowlevelState.h b/include/message/LowlevelState.h index 5a60dfd..935a47d 100755 --- a/include/message/LowlevelState.h +++ b/include/message/LowlevelState.h @@ -1,61 +1,61 @@ -#ifndef LOWLEVELSTATE_HPP -#define LOWLEVELSTATE_HPP - -#include -#include -#include "common/math/mathTools.h" -#include "common/enumClass.h" -#include "common/math/Filter.h" - -struct LowlevelState{ -public: - LowlevelState(double dt); - ~LowlevelState(); - - std::vector q; - std::vector dq; - std::vector ddq; - std::vector tau; - - std::vector> q_data; - std::vector> dq_data; - std::vector> ddq_data; - std::vector> tau_data; - - std::vector temperature; - std::vector errorstate; - std::vector isMotorConnected; - - std::vector qFiltered; - std::vector dqFiltered; - std::vector ddqFiltered; - std::vector tauFiltered; - - LPFilter *qFilter; - LPFilter *dqFilter; - LPFilter *ddqFilter; - LPFilter *tauFilter; - - void resizeGripper(double dt); - void runFilter(); - bool checkError(); - Vec6 getQ(); - Vec6 getQd(); - Vec6 getQdd(); - Vec6 getTau(); - Vec6 getQFiltered(); - Vec6 getQdFiltered(); - Vec6 getQddFiltered(); - Vec6 getTauFiltered(); - double getGripperQ(); - double getGripperQd(); - double getGripperTau(); - double getGripperTauFiltered(); -private: - size_t _dof = 6; - int temporatureLimit = 80.0;// centigrade - std::vector _isMotorConnectedCnt; - std::vector _isMotorLostConnection; -}; - -#endif //LOWLEVELSTATE_HPP +#ifndef LOWLEVELSTATE_HPP +#define LOWLEVELSTATE_HPP + +#include +#include +#include "common/math/mathTools.h" +#include "common/enumClass.h" +#include "common/math/Filter.h" + +struct LowlevelState{ +public: + LowlevelState(double dt); + ~LowlevelState(); + + std::vector q; + std::vector dq; + std::vector ddq; + std::vector tau; + + std::vector> q_data; + std::vector> dq_data; + std::vector> ddq_data; + std::vector> tau_data; + + std::vector temperature; + std::vector errorstate; + std::vector isMotorConnected; + + std::vector qFiltered; + std::vector dqFiltered; + std::vector ddqFiltered; + std::vector tauFiltered; + + LPFilter *qFilter; + LPFilter *dqFilter; + LPFilter *ddqFilter; + LPFilter *tauFilter; + + void resizeGripper(double dt); + void runFilter(); + bool checkError(); + Vec6 getQ(); + Vec6 getQd(); + Vec6 getQdd(); + Vec6 getTau(); + Vec6 getQFiltered(); + Vec6 getQdFiltered(); + Vec6 getQddFiltered(); + Vec6 getTauFiltered(); + double getGripperQ(); + double getGripperQd(); + double getGripperTau(); + double getGripperTauFiltered(); +private: + size_t _dof = 6; + int temporatureLimit = 80.0;// centigrade + std::vector _isMotorConnectedCnt; + std::vector _isMotorLostConnection; +}; + +#endif //LOWLEVELSTATE_HPP diff --git a/include/message/MotorCmd.h b/include/message/MotorCmd.h index 9efff2d..b5d90c9 100644 --- a/include/message/MotorCmd.h +++ b/include/message/MotorCmd.h @@ -1,261 +1,261 @@ -// Generated by gencpp from file unitree_legged_msgs/MotorCmd.msg -// DO NOT EDIT! - - -#ifndef UNITREE_LEGGED_MSGS_MESSAGE_MOTORCMD_H -#define UNITREE_LEGGED_MSGS_MESSAGE_MOTORCMD_H - - -#include -#include -#include - -#include -#include -#include -#include - - -namespace unitree_legged_msgs -{ -template -struct MotorCmd_ -{ - typedef MotorCmd_ Type; - - MotorCmd_() - : mode(0) - , q(0.0) - , dq(0.0) - , tau(0.0) - , Kp(0.0) - , Kd(0.0) - , reserve() { - reserve.assign(0); - } - MotorCmd_(const ContainerAllocator& _alloc) - : mode(0) - , q(0.0) - , dq(0.0) - , tau(0.0) - , Kp(0.0) - , Kd(0.0) - , reserve() { - (void)_alloc; - reserve.assign(0); - } - - - - typedef uint8_t _mode_type; - _mode_type mode; - - typedef float _q_type; - _q_type q; - - typedef float _dq_type; - _dq_type dq; - - typedef float _tau_type; - _tau_type tau; - - typedef float _Kp_type; - _Kp_type Kp; - - typedef float _Kd_type; - _Kd_type Kd; - - typedef boost::array _reserve_type; - _reserve_type reserve; - - - - - - typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd_ > Ptr; - typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd_ const> ConstPtr; - -}; // struct MotorCmd_ - -typedef ::unitree_legged_msgs::MotorCmd_ > MotorCmd; - -typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd > MotorCmdPtr; -typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd const> MotorCmdConstPtr; - -// constants requiring out of line definition - - - -template -std::ostream& operator<<(std::ostream& s, const ::unitree_legged_msgs::MotorCmd_ & v) -{ -ros::message_operations::Printer< ::unitree_legged_msgs::MotorCmd_ >::stream(s, "", v); -return s; -} - - -template -bool operator==(const ::unitree_legged_msgs::MotorCmd_ & lhs, const ::unitree_legged_msgs::MotorCmd_ & rhs) -{ - return lhs.mode == rhs.mode && - lhs.q == rhs.q && - lhs.dq == rhs.dq && - lhs.tau == rhs.tau && - lhs.Kp == rhs.Kp && - lhs.Kd == rhs.Kd && - lhs.reserve == rhs.reserve; -} - -template -bool operator!=(const ::unitree_legged_msgs::MotorCmd_ & lhs, const ::unitree_legged_msgs::MotorCmd_ & rhs) -{ - return !(lhs == rhs); -} - - -} // namespace unitree_legged_msgs - -namespace ros -{ -namespace message_traits -{ - - - - - -template -struct IsFixedSize< ::unitree_legged_msgs::MotorCmd_ > - : TrueType - { }; - -template -struct IsFixedSize< ::unitree_legged_msgs::MotorCmd_ const> - : TrueType - { }; - -template -struct IsMessage< ::unitree_legged_msgs::MotorCmd_ > - : TrueType - { }; - -template -struct IsMessage< ::unitree_legged_msgs::MotorCmd_ const> - : TrueType - { }; - -template -struct HasHeader< ::unitree_legged_msgs::MotorCmd_ > - : FalseType - { }; - -template -struct HasHeader< ::unitree_legged_msgs::MotorCmd_ const> - : FalseType - { }; - - -template -struct MD5Sum< ::unitree_legged_msgs::MotorCmd_ > -{ - static const char* value() - { - return "bbb3b7d91319c3a1b99055f0149ba221"; - } - - static const char* value(const ::unitree_legged_msgs::MotorCmd_&) { return value(); } - static const uint64_t static_value1 = 0xbbb3b7d91319c3a1ULL; - static const uint64_t static_value2 = 0xb99055f0149ba221ULL; -}; - -template -struct DataType< ::unitree_legged_msgs::MotorCmd_ > -{ - static const char* value() - { - return "unitree_legged_msgs/MotorCmd"; - } - - static const char* value(const ::unitree_legged_msgs::MotorCmd_&) { return value(); } -}; - -template -struct Definition< ::unitree_legged_msgs::MotorCmd_ > -{ - static const char* value() - { - return "uint8 mode # motor target mode\n" -"float32 q # motor target position\n" -"float32 dq # motor target velocity\n" -"float32 tau # motor target torque\n" -"float32 Kp # motor spring stiffness coefficient\n" -"float32 Kd # motor damper coefficient\n" -"uint32[3] reserve # motor target torque\n" -; - } - - static const char* value(const ::unitree_legged_msgs::MotorCmd_&) { return value(); } -}; - -} // namespace message_traits -} // namespace ros - -namespace ros -{ -namespace serialization -{ - - template struct Serializer< ::unitree_legged_msgs::MotorCmd_ > - { - template inline static void allInOne(Stream& stream, T m) - { - stream.next(m.mode); - stream.next(m.q); - stream.next(m.dq); - stream.next(m.tau); - stream.next(m.Kp); - stream.next(m.Kd); - stream.next(m.reserve); - } - - ROS_DECLARE_ALLINONE_SERIALIZER - }; // struct MotorCmd_ - -} // namespace serialization -} // namespace ros - -namespace ros -{ -namespace message_operations -{ - -template -struct Printer< ::unitree_legged_msgs::MotorCmd_ > -{ - template static void stream(Stream& s, const std::string& indent, const ::unitree_legged_msgs::MotorCmd_& v) - { - s << indent << "mode: "; - Printer::stream(s, indent + " ", v.mode); - s << indent << "q: "; - Printer::stream(s, indent + " ", v.q); - s << indent << "dq: "; - Printer::stream(s, indent + " ", v.dq); - s << indent << "tau: "; - Printer::stream(s, indent + " ", v.tau); - s << indent << "Kp: "; - Printer::stream(s, indent + " ", v.Kp); - s << indent << "Kd: "; - Printer::stream(s, indent + " ", v.Kd); - s << indent << "reserve[]" << std::endl; - for (size_t i = 0; i < v.reserve.size(); ++i) - { - s << indent << " reserve[" << i << "]: "; - Printer::stream(s, indent + " ", v.reserve[i]); - } - } -}; - -} // namespace message_operations -} // namespace ros - -#endif // UNITREE_LEGGED_MSGS_MESSAGE_MOTORCMD_H +// Generated by gencpp from file unitree_legged_msgs/MotorCmd.msg +// DO NOT EDIT! + + +#ifndef UNITREE_LEGGED_MSGS_MESSAGE_MOTORCMD_H +#define UNITREE_LEGGED_MSGS_MESSAGE_MOTORCMD_H + + +#include +#include +#include + +#include +#include +#include +#include + + +namespace unitree_legged_msgs +{ +template +struct MotorCmd_ +{ + typedef MotorCmd_ Type; + + MotorCmd_() + : mode(0) + , q(0.0) + , dq(0.0) + , tau(0.0) + , Kp(0.0) + , Kd(0.0) + , reserve() { + reserve.assign(0); + } + MotorCmd_(const ContainerAllocator& _alloc) + : mode(0) + , q(0.0) + , dq(0.0) + , tau(0.0) + , Kp(0.0) + , Kd(0.0) + , reserve() { + (void)_alloc; + reserve.assign(0); + } + + + + typedef uint8_t _mode_type; + _mode_type mode; + + typedef float _q_type; + _q_type q; + + typedef float _dq_type; + _dq_type dq; + + typedef float _tau_type; + _tau_type tau; + + typedef float _Kp_type; + _Kp_type Kp; + + typedef float _Kd_type; + _Kd_type Kd; + + typedef boost::array _reserve_type; + _reserve_type reserve; + + + + + + typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd_ > Ptr; + typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd_ const> ConstPtr; + +}; // struct MotorCmd_ + +typedef ::unitree_legged_msgs::MotorCmd_ > MotorCmd; + +typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd > MotorCmdPtr; +typedef boost::shared_ptr< ::unitree_legged_msgs::MotorCmd const> MotorCmdConstPtr; + +// constants requiring out of line definition + + + +template +std::ostream& operator<<(std::ostream& s, const ::unitree_legged_msgs::MotorCmd_ & v) +{ +ros::message_operations::Printer< ::unitree_legged_msgs::MotorCmd_ >::stream(s, "", v); +return s; +} + + +template +bool operator==(const ::unitree_legged_msgs::MotorCmd_ & lhs, const ::unitree_legged_msgs::MotorCmd_ & rhs) +{ + return lhs.mode == rhs.mode && + lhs.q == rhs.q && + lhs.dq == rhs.dq && + lhs.tau == rhs.tau && + lhs.Kp == rhs.Kp && + lhs.Kd == rhs.Kd && + lhs.reserve == rhs.reserve; +} + +template +bool operator!=(const ::unitree_legged_msgs::MotorCmd_ & lhs, const ::unitree_legged_msgs::MotorCmd_ & rhs) +{ + return !(lhs == rhs); +} + + +} // namespace unitree_legged_msgs + +namespace ros +{ +namespace message_traits +{ + + + + + +template +struct IsFixedSize< ::unitree_legged_msgs::MotorCmd_ > + : TrueType + { }; + +template +struct IsFixedSize< ::unitree_legged_msgs::MotorCmd_ const> + : TrueType + { }; + +template +struct IsMessage< ::unitree_legged_msgs::MotorCmd_ > + : TrueType + { }; + +template +struct IsMessage< ::unitree_legged_msgs::MotorCmd_ const> + : TrueType + { }; + +template +struct HasHeader< ::unitree_legged_msgs::MotorCmd_ > + : FalseType + { }; + +template +struct HasHeader< ::unitree_legged_msgs::MotorCmd_ const> + : FalseType + { }; + + +template +struct MD5Sum< ::unitree_legged_msgs::MotorCmd_ > +{ + static const char* value() + { + return "bbb3b7d91319c3a1b99055f0149ba221"; + } + + static const char* value(const ::unitree_legged_msgs::MotorCmd_&) { return value(); } + static const uint64_t static_value1 = 0xbbb3b7d91319c3a1ULL; + static const uint64_t static_value2 = 0xb99055f0149ba221ULL; +}; + +template +struct DataType< ::unitree_legged_msgs::MotorCmd_ > +{ + static const char* value() + { + return "unitree_legged_msgs/MotorCmd"; + } + + static const char* value(const ::unitree_legged_msgs::MotorCmd_&) { return value(); } +}; + +template +struct Definition< ::unitree_legged_msgs::MotorCmd_ > +{ + static const char* value() + { + return "uint8 mode # motor target mode\n" +"float32 q # motor target position\n" +"float32 dq # motor target velocity\n" +"float32 tau # motor target torque\n" +"float32 Kp # motor spring stiffness coefficient\n" +"float32 Kd # motor damper coefficient\n" +"uint32[3] reserve # motor target torque\n" +; + } + + static const char* value(const ::unitree_legged_msgs::MotorCmd_&) { return value(); } +}; + +} // namespace message_traits +} // namespace ros + +namespace ros +{ +namespace serialization +{ + + template struct Serializer< ::unitree_legged_msgs::MotorCmd_ > + { + template inline static void allInOne(Stream& stream, T m) + { + stream.next(m.mode); + stream.next(m.q); + stream.next(m.dq); + stream.next(m.tau); + stream.next(m.Kp); + stream.next(m.Kd); + stream.next(m.reserve); + } + + ROS_DECLARE_ALLINONE_SERIALIZER + }; // struct MotorCmd_ + +} // namespace serialization +} // namespace ros + +namespace ros +{ +namespace message_operations +{ + +template +struct Printer< ::unitree_legged_msgs::MotorCmd_ > +{ + template static void stream(Stream& s, const std::string& indent, const ::unitree_legged_msgs::MotorCmd_& v) + { + s << indent << "mode: "; + Printer::stream(s, indent + " ", v.mode); + s << indent << "q: "; + Printer::stream(s, indent + " ", v.q); + s << indent << "dq: "; + Printer::stream(s, indent + " ", v.dq); + s << indent << "tau: "; + Printer::stream(s, indent + " ", v.tau); + s << indent << "Kp: "; + Printer::stream(s, indent + " ", v.Kp); + s << indent << "Kd: "; + Printer::stream(s, indent + " ", v.Kd); + s << indent << "reserve[]" << std::endl; + for (size_t i = 0; i < v.reserve.size(); ++i) + { + s << indent << " reserve[" << i << "]: "; + Printer::stream(s, indent + " ", v.reserve[i]); + } + } +}; + +} // namespace message_operations +} // namespace ros + +#endif // UNITREE_LEGGED_MSGS_MESSAGE_MOTORCMD_H diff --git a/include/message/MotorState.h b/include/message/MotorState.h index e7183e0..8dcfd42 100644 --- a/include/message/MotorState.h +++ b/include/message/MotorState.h @@ -1,291 +1,291 @@ -// Generated by gencpp from file unitree_legged_msgs/MotorState.msg -// DO NOT EDIT! - - -#ifndef UNITREE_LEGGED_MSGS_MESSAGE_MOTORSTATE_H -#define UNITREE_LEGGED_MSGS_MESSAGE_MOTORSTATE_H - - -#include -#include -#include - -#include -#include -#include -#include - - -namespace unitree_legged_msgs -{ -template -struct MotorState_ -{ - typedef MotorState_ Type; - - MotorState_() - : mode(0) - , q(0.0) - , dq(0.0) - , ddq(0.0) - , tauEst(0.0) - , q_raw(0.0) - , dq_raw(0.0) - , ddq_raw(0.0) - , temperature(0) - , reserve() { - reserve.assign(0); - } - MotorState_(const ContainerAllocator& _alloc) - : mode(0) - , q(0.0) - , dq(0.0) - , ddq(0.0) - , tauEst(0.0) - , q_raw(0.0) - , dq_raw(0.0) - , ddq_raw(0.0) - , temperature(0) - , reserve() { - (void)_alloc; - reserve.assign(0); - } - - - - typedef uint8_t _mode_type; - _mode_type mode; - - typedef float _q_type; - _q_type q; - - typedef float _dq_type; - _dq_type dq; - - typedef float _ddq_type; - _ddq_type ddq; - - typedef float _tauEst_type; - _tauEst_type tauEst; - - typedef float _q_raw_type; - _q_raw_type q_raw; - - typedef float _dq_raw_type; - _dq_raw_type dq_raw; - - typedef float _ddq_raw_type; - _ddq_raw_type ddq_raw; - - typedef int8_t _temperature_type; - _temperature_type temperature; - - typedef boost::array _reserve_type; - _reserve_type reserve; - - - - - - typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState_ > Ptr; - typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState_ const> ConstPtr; - -}; // struct MotorState_ - -typedef ::unitree_legged_msgs::MotorState_ > MotorState; - -typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState > MotorStatePtr; -typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState const> MotorStateConstPtr; - -// constants requiring out of line definition - - - -template -std::ostream& operator<<(std::ostream& s, const ::unitree_legged_msgs::MotorState_ & v) -{ -ros::message_operations::Printer< ::unitree_legged_msgs::MotorState_ >::stream(s, "", v); -return s; -} - - -template -bool operator==(const ::unitree_legged_msgs::MotorState_ & lhs, const ::unitree_legged_msgs::MotorState_ & rhs) -{ - return lhs.mode == rhs.mode && - lhs.q == rhs.q && - lhs.dq == rhs.dq && - lhs.ddq == rhs.ddq && - lhs.tauEst == rhs.tauEst && - lhs.q_raw == rhs.q_raw && - lhs.dq_raw == rhs.dq_raw && - lhs.ddq_raw == rhs.ddq_raw && - lhs.temperature == rhs.temperature && - lhs.reserve == rhs.reserve; -} - -template -bool operator!=(const ::unitree_legged_msgs::MotorState_ & lhs, const ::unitree_legged_msgs::MotorState_ & rhs) -{ - return !(lhs == rhs); -} - - -} // namespace unitree_legged_msgs - -namespace ros -{ -namespace message_traits -{ - - - - - -template -struct IsFixedSize< ::unitree_legged_msgs::MotorState_ > - : TrueType - { }; - -template -struct IsFixedSize< ::unitree_legged_msgs::MotorState_ const> - : TrueType - { }; - -template -struct IsMessage< ::unitree_legged_msgs::MotorState_ > - : TrueType - { }; - -template -struct IsMessage< ::unitree_legged_msgs::MotorState_ const> - : TrueType - { }; - -template -struct HasHeader< ::unitree_legged_msgs::MotorState_ > - : FalseType - { }; - -template -struct HasHeader< ::unitree_legged_msgs::MotorState_ const> - : FalseType - { }; - - -template -struct MD5Sum< ::unitree_legged_msgs::MotorState_ > -{ - static const char* value() - { - return "94c55ee3b7852be2bd437b20ce12a254"; - } - - static const char* value(const ::unitree_legged_msgs::MotorState_&) { return value(); } - static const uint64_t static_value1 = 0x94c55ee3b7852be2ULL; - static const uint64_t static_value2 = 0xbd437b20ce12a254ULL; -}; - -template -struct DataType< ::unitree_legged_msgs::MotorState_ > -{ - static const char* value() - { - return "unitree_legged_msgs/MotorState"; - } - - static const char* value(const ::unitree_legged_msgs::MotorState_&) { return value(); } -}; - -template -struct Definition< ::unitree_legged_msgs::MotorState_ > -{ - static const char* value() - { - return "uint8 mode # motor current mode \n" -"float32 q # motor current position(rad)\n" -"float32 dq # motor current speed(rad/s)\n" -"float32 ddq # motor current speed(rad/s)\n" -"float32 tauEst # current estimated output torque(N*m)\n" -"float32 q_raw # motor current position(rad)\n" -"float32 dq_raw # motor current speed(rad/s)\n" -"float32 ddq_raw # motor current speed(rad/s)\n" -"int8 temperature # motor temperature(slow conduction of temperature leads to lag)\n" -"uint32[2] reserve\n" -; - } - - static const char* value(const ::unitree_legged_msgs::MotorState_&) { return value(); } -}; - -} // namespace message_traits -} // namespace ros - -namespace ros -{ -namespace serialization -{ - - template struct Serializer< ::unitree_legged_msgs::MotorState_ > - { - template inline static void allInOne(Stream& stream, T m) - { - stream.next(m.mode); - stream.next(m.q); - stream.next(m.dq); - stream.next(m.ddq); - stream.next(m.tauEst); - stream.next(m.q_raw); - stream.next(m.dq_raw); - stream.next(m.ddq_raw); - stream.next(m.temperature); - stream.next(m.reserve); - } - - ROS_DECLARE_ALLINONE_SERIALIZER - }; // struct MotorState_ - -} // namespace serialization -} // namespace ros - -namespace ros -{ -namespace message_operations -{ - -template -struct Printer< ::unitree_legged_msgs::MotorState_ > -{ - template static void stream(Stream& s, const std::string& indent, const ::unitree_legged_msgs::MotorState_& v) - { - s << indent << "mode: "; - Printer::stream(s, indent + " ", v.mode); - s << indent << "q: "; - Printer::stream(s, indent + " ", v.q); - s << indent << "dq: "; - Printer::stream(s, indent + " ", v.dq); - s << indent << "ddq: "; - Printer::stream(s, indent + " ", v.ddq); - s << indent << "tauEst: "; - Printer::stream(s, indent + " ", v.tauEst); - s << indent << "q_raw: "; - Printer::stream(s, indent + " ", v.q_raw); - s << indent << "dq_raw: "; - Printer::stream(s, indent + " ", v.dq_raw); - s << indent << "ddq_raw: "; - Printer::stream(s, indent + " ", v.ddq_raw); - s << indent << "temperature: "; - Printer::stream(s, indent + " ", v.temperature); - s << indent << "reserve[]" << std::endl; - for (size_t i = 0; i < v.reserve.size(); ++i) - { - s << indent << " reserve[" << i << "]: "; - Printer::stream(s, indent + " ", v.reserve[i]); - } - } -}; - -} // namespace message_operations -} // namespace ros - -#endif // UNITREE_LEGGED_MSGS_MESSAGE_MOTORSTATE_H +// Generated by gencpp from file unitree_legged_msgs/MotorState.msg +// DO NOT EDIT! + + +#ifndef UNITREE_LEGGED_MSGS_MESSAGE_MOTORSTATE_H +#define UNITREE_LEGGED_MSGS_MESSAGE_MOTORSTATE_H + + +#include +#include +#include + +#include +#include +#include +#include + + +namespace unitree_legged_msgs +{ +template +struct MotorState_ +{ + typedef MotorState_ Type; + + MotorState_() + : mode(0) + , q(0.0) + , dq(0.0) + , ddq(0.0) + , tauEst(0.0) + , q_raw(0.0) + , dq_raw(0.0) + , ddq_raw(0.0) + , temperature(0) + , reserve() { + reserve.assign(0); + } + MotorState_(const ContainerAllocator& _alloc) + : mode(0) + , q(0.0) + , dq(0.0) + , ddq(0.0) + , tauEst(0.0) + , q_raw(0.0) + , dq_raw(0.0) + , ddq_raw(0.0) + , temperature(0) + , reserve() { + (void)_alloc; + reserve.assign(0); + } + + + + typedef uint8_t _mode_type; + _mode_type mode; + + typedef float _q_type; + _q_type q; + + typedef float _dq_type; + _dq_type dq; + + typedef float _ddq_type; + _ddq_type ddq; + + typedef float _tauEst_type; + _tauEst_type tauEst; + + typedef float _q_raw_type; + _q_raw_type q_raw; + + typedef float _dq_raw_type; + _dq_raw_type dq_raw; + + typedef float _ddq_raw_type; + _ddq_raw_type ddq_raw; + + typedef int8_t _temperature_type; + _temperature_type temperature; + + typedef boost::array _reserve_type; + _reserve_type reserve; + + + + + + typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState_ > Ptr; + typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState_ const> ConstPtr; + +}; // struct MotorState_ + +typedef ::unitree_legged_msgs::MotorState_ > MotorState; + +typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState > MotorStatePtr; +typedef boost::shared_ptr< ::unitree_legged_msgs::MotorState const> MotorStateConstPtr; + +// constants requiring out of line definition + + + +template +std::ostream& operator<<(std::ostream& s, const ::unitree_legged_msgs::MotorState_ & v) +{ +ros::message_operations::Printer< ::unitree_legged_msgs::MotorState_ >::stream(s, "", v); +return s; +} + + +template +bool operator==(const ::unitree_legged_msgs::MotorState_ & lhs, const ::unitree_legged_msgs::MotorState_ & rhs) +{ + return lhs.mode == rhs.mode && + lhs.q == rhs.q && + lhs.dq == rhs.dq && + lhs.ddq == rhs.ddq && + lhs.tauEst == rhs.tauEst && + lhs.q_raw == rhs.q_raw && + lhs.dq_raw == rhs.dq_raw && + lhs.ddq_raw == rhs.ddq_raw && + lhs.temperature == rhs.temperature && + lhs.reserve == rhs.reserve; +} + +template +bool operator!=(const ::unitree_legged_msgs::MotorState_ & lhs, const ::unitree_legged_msgs::MotorState_ & rhs) +{ + return !(lhs == rhs); +} + + +} // namespace unitree_legged_msgs + +namespace ros +{ +namespace message_traits +{ + + + + + +template +struct IsFixedSize< ::unitree_legged_msgs::MotorState_ > + : TrueType + { }; + +template +struct IsFixedSize< ::unitree_legged_msgs::MotorState_ const> + : TrueType + { }; + +template +struct IsMessage< ::unitree_legged_msgs::MotorState_ > + : TrueType + { }; + +template +struct IsMessage< ::unitree_legged_msgs::MotorState_ const> + : TrueType + { }; + +template +struct HasHeader< ::unitree_legged_msgs::MotorState_ > + : FalseType + { }; + +template +struct HasHeader< ::unitree_legged_msgs::MotorState_ const> + : FalseType + { }; + + +template +struct MD5Sum< ::unitree_legged_msgs::MotorState_ > +{ + static const char* value() + { + return "94c55ee3b7852be2bd437b20ce12a254"; + } + + static const char* value(const ::unitree_legged_msgs::MotorState_&) { return value(); } + static const uint64_t static_value1 = 0x94c55ee3b7852be2ULL; + static const uint64_t static_value2 = 0xbd437b20ce12a254ULL; +}; + +template +struct DataType< ::unitree_legged_msgs::MotorState_ > +{ + static const char* value() + { + return "unitree_legged_msgs/MotorState"; + } + + static const char* value(const ::unitree_legged_msgs::MotorState_&) { return value(); } +}; + +template +struct Definition< ::unitree_legged_msgs::MotorState_ > +{ + static const char* value() + { + return "uint8 mode # motor current mode \n" +"float32 q # motor current position(rad)\n" +"float32 dq # motor current speed(rad/s)\n" +"float32 ddq # motor current speed(rad/s)\n" +"float32 tauEst # current estimated output torque(N*m)\n" +"float32 q_raw # motor current position(rad)\n" +"float32 dq_raw # motor current speed(rad/s)\n" +"float32 ddq_raw # motor current speed(rad/s)\n" +"int8 temperature # motor temperature(slow conduction of temperature leads to lag)\n" +"uint32[2] reserve\n" +; + } + + static const char* value(const ::unitree_legged_msgs::MotorState_&) { return value(); } +}; + +} // namespace message_traits +} // namespace ros + +namespace ros +{ +namespace serialization +{ + + template struct Serializer< ::unitree_legged_msgs::MotorState_ > + { + template inline static void allInOne(Stream& stream, T m) + { + stream.next(m.mode); + stream.next(m.q); + stream.next(m.dq); + stream.next(m.ddq); + stream.next(m.tauEst); + stream.next(m.q_raw); + stream.next(m.dq_raw); + stream.next(m.ddq_raw); + stream.next(m.temperature); + stream.next(m.reserve); + } + + ROS_DECLARE_ALLINONE_SERIALIZER + }; // struct MotorState_ + +} // namespace serialization +} // namespace ros + +namespace ros +{ +namespace message_operations +{ + +template +struct Printer< ::unitree_legged_msgs::MotorState_ > +{ + template static void stream(Stream& s, const std::string& indent, const ::unitree_legged_msgs::MotorState_& v) + { + s << indent << "mode: "; + Printer::stream(s, indent + " ", v.mode); + s << indent << "q: "; + Printer::stream(s, indent + " ", v.q); + s << indent << "dq: "; + Printer::stream(s, indent + " ", v.dq); + s << indent << "ddq: "; + Printer::stream(s, indent + " ", v.ddq); + s << indent << "tauEst: "; + Printer::stream(s, indent + " ", v.tauEst); + s << indent << "q_raw: "; + Printer::stream(s, indent + " ", v.q_raw); + s << indent << "dq_raw: "; + Printer::stream(s, indent + " ", v.dq_raw); + s << indent << "ddq_raw: "; + Printer::stream(s, indent + " ", v.ddq_raw); + s << indent << "temperature: "; + Printer::stream(s, indent + " ", v.temperature); + s << indent << "reserve[]" << std::endl; + for (size_t i = 0; i < v.reserve.size(); ++i) + { + s << indent << " reserve[" << i << "]: "; + Printer::stream(s, indent + " ", v.reserve[i]); + } + } +}; + +} // namespace message_operations +} // namespace ros + +#endif // UNITREE_LEGGED_MSGS_MESSAGE_MOTORSTATE_H diff --git a/include/message/arm_common.h b/include/message/arm_common.h old mode 100644 new mode 100755 diff --git a/include/thirdparty/quadProgpp/Array.hh b/include/thirdparty/quadProgpp/Array.hh old mode 100644 new mode 100755 index 29e494d..53ab624 --- a/include/thirdparty/quadProgpp/Array.hh +++ b/include/thirdparty/quadProgpp/Array.hh @@ -1,2532 +1,2532 @@ -// $Id: Array.hh 249 2008-11-20 09:58:23Z schaerf $ -// This file is part of EasyLocalpp: a C++ Object-Oriented framework -// aimed at easing the development of Local Search algorithms. -// Copyright (C) 2001--2008 Andrea Schaerf, Luca Di Gaspero. -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. - -#if !defined(_ARRAY_HH) -#define _ARRAY_HH - -#include -#include -#include -#include -#include -#include - -namespace quadprogpp { - -enum MType { DIAG }; - -template -class Vector -{ -public: - Vector(); - Vector(const unsigned int n); - Vector(const T& a, const unsigned int n); //initialize to constant value - Vector(const T* a, const unsigned int n); // Initialize to array - Vector(const Vector &rhs); // copy constructor - ~Vector(); // destructor - - inline void set(const T* a, const unsigned int n); - Vector extract(const std::set& indexes) const; - inline T& operator[](const unsigned int& i); //i-th element - inline const T& operator[](const unsigned int& i) const; - - inline unsigned int size() const; - inline void resize(const unsigned int n); - inline void resize(const T& a, const unsigned int n); - - Vector& operator=(const Vector& rhs); //assignment - Vector& operator=(const T& a); //assign a to every element - inline Vector& operator+=(const Vector& rhs); - inline Vector& operator-=(const Vector& rhs); - inline Vector& operator*=(const Vector& rhs); - inline Vector& operator/=(const Vector& rhs); - inline Vector& operator^=(const Vector& rhs); - inline Vector& operator+=(const T& a); - inline Vector& operator-=(const T& a); - inline Vector& operator*=(const T& a); - inline Vector& operator/=(const T& a); - inline Vector& operator^=(const T& a); -private: - unsigned int n; // size of array. upper index is n-1 - T* v; // storage for data -}; - -template -Vector::Vector() - : n(0), v(0) -{} - -template -Vector::Vector(const unsigned int n) - : v(new T[n]) -{ - this->n = n; -} - -template -Vector::Vector(const T& a, const unsigned int n) - : v(new T[n]) -{ - this->n = n; - for (unsigned int i = 0; i < n; i++) - v[i] = a; -} - -template -Vector::Vector(const T* a, const unsigned int n) - : v(new T[n]) -{ - this->n = n; - for (unsigned int i = 0; i < n; i++) - v[i] = *a++; -} - -template -Vector::Vector(const Vector& rhs) - : v(new T[rhs.n]) -{ - this->n = rhs.n; - for (unsigned int i = 0; i < n; i++) - v[i] = rhs[i]; -} - -template -Vector::~Vector() -{ - if (v != 0) - delete[] (v); -} - -template -void Vector::resize(const unsigned int n) -{ - if (n == this->n) - return; - if (v != 0) - delete[] (v); - v = new T[n]; - this->n = n; -} - -template -void Vector::resize(const T& a, const unsigned int n) -{ - resize(n); - for (unsigned int i = 0; i < n; i++) - v[i] = a; -} - - -template -inline Vector& Vector::operator=(const Vector& rhs) -// postcondition: normal assignment via copying has been performed; -// if vector and rhs were different sizes, vector -// has been resized to match the size of rhs -{ - if (this != &rhs) - { - resize(rhs.n); - for (unsigned int i = 0; i < n; i++) - v[i] = rhs[i]; - } - return *this; -} - -template -inline Vector & Vector::operator=(const T& a) //assign a to every element -{ - for (unsigned int i = 0; i < n; i++) - v[i] = a; - return *this; -} - -template -inline T & Vector::operator[](const unsigned int& i) //subscripting -{ - return v[i]; -} - -template -inline const T& Vector::operator[](const unsigned int& i) const //subscripting -{ - return v[i]; -} - -template -inline unsigned int Vector::size() const -{ - return n; -} - -template -inline void Vector::set(const T* a, unsigned int n) -{ - resize(n); - for (unsigned int i = 0; i < n; i++) - v[i] = a[i]; -} - -template -inline Vector Vector::extract(const std::set& indexes) const -{ - Vector tmp(indexes.size()); - unsigned int i = 0; - - for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) - { - if (*el >= n) - throw std::logic_error("Error extracting subvector: the indexes are out of vector bounds"); - tmp[i++] = v[*el]; - } - - return tmp; -} - -template -inline Vector& Vector::operator+=(const Vector& rhs) -{ - if (this->size() != rhs.size()) - throw std::logic_error("Operator+=: vectors have different sizes"); - for (unsigned int i = 0; i < n; i++) - v[i] += rhs[i]; - - return *this; -} - - -template -inline Vector& Vector::operator+=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - v[i] += a; - - return *this; -} - -template -inline Vector operator+(const Vector& rhs) -{ - return rhs; -} - -template -inline Vector operator+(const Vector& lhs, const Vector& rhs) -{ - if (lhs.size() != rhs.size()) - throw std::logic_error("Operator+: vectors have different sizes"); - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] + rhs[i]; - - return tmp; -} - -template -inline Vector operator+(const Vector& lhs, const T& a) -{ - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] + a; - - return tmp; -} - -template -inline Vector operator+(const T& a, const Vector& rhs) -{ - Vector tmp(rhs.size()); - for (unsigned int i = 0; i < rhs.size(); i++) - tmp[i] = a + rhs[i]; - - return tmp; -} - -template -inline Vector& Vector::operator-=(const Vector& rhs) -{ - if (this->size() != rhs.size()) - throw std::logic_error("Operator-=: vectors have different sizes"); - for (unsigned int i = 0; i < n; i++) - v[i] -= rhs[i]; - - return *this; -} - - -template -inline Vector& Vector::operator-=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - v[i] -= a; - - return *this; -} - -template -inline Vector operator-(const Vector& rhs) -{ - return (T)(-1) * rhs; -} - -template -inline Vector operator-(const Vector& lhs, const Vector& rhs) -{ - if (lhs.size() != rhs.size()) - throw std::logic_error("Operator-: vectors have different sizes"); - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] - rhs[i]; - - return tmp; -} - -template -inline Vector operator-(const Vector& lhs, const T& a) -{ - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] - a; - - return tmp; -} - -template -inline Vector operator-(const T& a, const Vector& rhs) -{ - Vector tmp(rhs.size()); - for (unsigned int i = 0; i < rhs.size(); i++) - tmp[i] = a - rhs[i]; - - return tmp; -} - -template -inline Vector& Vector::operator*=(const Vector& rhs) -{ - if (this->size() != rhs.size()) - throw std::logic_error("Operator*=: vectors have different sizes"); - for (unsigned int i = 0; i < n; i++) - v[i] *= rhs[i]; - - return *this; -} - - -template -inline Vector& Vector::operator*=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - v[i] *= a; - - return *this; -} - -template -inline Vector operator*(const Vector& lhs, const Vector& rhs) -{ - if (lhs.size() != rhs.size()) - throw std::logic_error("Operator*: vectors have different sizes"); - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] * rhs[i]; - - return tmp; -} - -template -inline Vector operator*(const Vector& lhs, const T& a) -{ - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] * a; - - return tmp; -} - -template -inline Vector operator*(const T& a, const Vector& rhs) -{ - Vector tmp(rhs.size()); - for (unsigned int i = 0; i < rhs.size(); i++) - tmp[i] = a * rhs[i]; - - return tmp; -} - -template -inline Vector& Vector::operator/=(const Vector& rhs) -{ - if (this->size() != rhs.size()) - throw std::logic_error("Operator/=: vectors have different sizes"); - for (unsigned int i = 0; i < n; i++) - v[i] /= rhs[i]; - - return *this; -} - - -template -inline Vector& Vector::operator/=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - v[i] /= a; - - return *this; -} - -template -inline Vector operator/(const Vector& lhs, const Vector& rhs) -{ - if (lhs.size() != rhs.size()) - throw std::logic_error("Operator/: vectors have different sizes"); - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] / rhs[i]; - - return tmp; -} - -template -inline Vector operator/(const Vector& lhs, const T& a) -{ - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = lhs[i] / a; - - return tmp; -} - -template -inline Vector operator/(const T& a, const Vector& rhs) -{ - Vector tmp(rhs.size()); - for (unsigned int i = 0; i < rhs.size(); i++) - tmp[i] = a / rhs[i]; - - return tmp; -} - -template -inline Vector operator^(const Vector& lhs, const Vector& rhs) -{ - if (lhs.size() != rhs.size()) - throw std::logic_error("Operator^: vectors have different sizes"); - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = pow(lhs[i], rhs[i]); - - return tmp; -} - -template -inline Vector operator^(const Vector& lhs, const T& a) -{ - Vector tmp(lhs.size()); - for (unsigned int i = 0; i < lhs.size(); i++) - tmp[i] = pow(lhs[i], a); - - return tmp; -} - -template -inline Vector operator^(const T& a, const Vector& rhs) -{ - Vector tmp(rhs.size()); - for (unsigned int i = 0; i < rhs.size(); i++) - tmp[i] = pow(a, rhs[i]); - - return tmp; -} - -template -inline Vector& Vector::operator^=(const Vector& rhs) -{ - if (this->size() != rhs.size()) - throw std::logic_error("Operator^=: vectors have different sizes"); - for (unsigned int i = 0; i < n; i++) - v[i] = pow(v[i], rhs[i]); - - return *this; -} - -template -inline Vector& Vector::operator^=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - v[i] = pow(v[i], a); - - return *this; -} - -template -inline bool operator==(const Vector& v, const Vector& w) -{ - if (v.size() != w.size()) - throw std::logic_error("Vectors of different size are not confrontable"); - for (unsigned i = 0; i < v.size(); i++) - if (v[i] != w[i]) - return false; - return true; -} - -template -inline bool operator!=(const Vector& v, const Vector& w) -{ - if (v.size() != w.size()) - throw std::logic_error("Vectors of different size are not confrontable"); - for (unsigned i = 0; i < v.size(); i++) - if (v[i] != w[i]) - return true; - return false; -} - -template -inline bool operator<(const Vector& v, const Vector& w) -{ - if (v.size() != w.size()) - throw std::logic_error("Vectors of different size are not confrontable"); - for (unsigned i = 0; i < v.size(); i++) - if (v[i] >= w[i]) - return false; - return true; -} - -template -inline bool operator<=(const Vector& v, const Vector& w) -{ - if (v.size() != w.size()) - throw std::logic_error("Vectors of different size are not confrontable"); - for (unsigned i = 0; i < v.size(); i++) - if (v[i] > w[i]) - return false; - return true; -} - -template -inline bool operator>(const Vector& v, const Vector& w) -{ - if (v.size() != w.size()) - throw std::logic_error("Vectors of different size are not confrontable"); - for (unsigned i = 0; i < v.size(); i++) - if (v[i] <= w[i]) - return false; - return true; -} - -template -inline bool operator>=(const Vector& v, const Vector& w) -{ - if (v.size() != w.size()) - throw std::logic_error("Vectors of different size are not confrontable"); - for (unsigned i = 0; i < v.size(); i++) - if (v[i] < w[i]) - return false; - return true; -} - -/** - Input/Output -*/ -template -inline std::ostream& operator<<(std::ostream& os, const Vector& v) -{ - os << std::endl << v.size() << std::endl; - for (unsigned int i = 0; i < v.size() - 1; i++) - os << std::setw(20) << std::setprecision(16) << v[i] << ", "; - os << std::setw(20) << std::setprecision(16) << v[v.size() - 1] << std::endl; - - return os; -} - -template -std::istream& operator>>(std::istream& is, Vector& v) -{ - int elements; - char comma; - is >> elements; - v.resize(elements); - for (unsigned int i = 0; i < elements; i++) - is >> v[i] >> comma; - - return is; -} - -/** - Index utilities -*/ - -std::set seq(unsigned int s, unsigned int e); - -std::set singleton(unsigned int i); - -template -class CanonicalBaseVector : public Vector -{ -public: - CanonicalBaseVector(unsigned int i, unsigned int n); - inline void reset(unsigned int i); -private: - unsigned int e; -}; - -template -CanonicalBaseVector::CanonicalBaseVector(unsigned int i, unsigned int n) - : Vector((T)0, n), e(i) -{ (*this)[e] = (T)1; } - -template -inline void CanonicalBaseVector::reset(unsigned int i) -{ - (*this)[e] = (T)0; - e = i; - (*this)[e] = (T)1; -} - -#include - -template -inline T sum(const Vector& v) -{ - T tmp = (T)0; - for (unsigned int i = 0; i < v.size(); i++) - tmp += v[i]; - - return tmp; -} - -template -inline T prod(const Vector& v) -{ - T tmp = (T)1; - for (unsigned int i = 0; i < v.size(); i++) - tmp *= v[i]; - - return tmp; -} - -template -inline T mean(const Vector& v) -{ - T sum = (T)0; - for (unsigned int i = 0; i < v.size(); i++) - sum += v[i]; - return sum / v.size(); -} - -template -inline T median(const Vector& v) -{ - Vector tmp = sort(v); - if (v.size() % 2 == 1) // it is an odd-sized vector - return tmp[v.size() / 2]; - else - return 0.5 * (tmp[v.size() / 2 - 1] + tmp[v.size() / 2]); -} - -template -inline T stdev(const Vector& v, bool sample_correction = false) -{ - return sqrt(var(v, sample_correction)); -} - -template -inline T var(const Vector& v, bool sample_correction = false) -{ - T sum = (T)0, ssum = (T)0; - unsigned int n = v.size(); - for (unsigned int i = 0; i < n; i++) - { - sum += v[i]; - ssum += (v[i] * v[i]); - } - if (!sample_correction) - return (ssum / n) - (sum / n) * (sum / n); - else - return n * ((ssum / n) - (sum / n) * (sum / n)) / (n - 1); -} - -template -inline T max(const Vector& v) -{ - T value = v[0]; - for (unsigned int i = 1; i < v.size(); i++) - value = std::max(v[i], value); - - return value; -} - -template -inline T min(const Vector& v) -{ - T value = v[0]; - for (unsigned int i = 1; i < v.size(); i++) - value = std::min(v[i], value); - - return value; -} - -template -inline unsigned int index_max(const Vector& v) -{ - unsigned int max = 0; - for (unsigned int i = 1; i < v.size(); i++) - if (v[i] > v[max]) - max = i; - - return max; -} - -template -inline unsigned int index_min(const Vector& v) -{ - unsigned int min = 0; - for (unsigned int i = 1; i < v.size(); i++) - if (v[i] < v[min]) - min = i; - - return min; -} - - -template -inline T dot_prod(const Vector& a, const Vector& b) -{ - T sum = (T)0; - if (a.size() != b.size()) - throw std::logic_error("Dotprod error: the vectors are not the same size"); - for (unsigned int i = 0; i < a.size(); i++) - sum += a[i] * b[i]; - - return sum; -} - -/** - Single element mathematical functions -*/ - -template -inline Vector exp(const Vector& v) -{ - Vector tmp(v.size()); - for (unsigned int i = 0; i < v.size(); i++) - tmp[i] = exp(v[i]); - - return tmp; -} - -template -inline Vector log(const Vector& v) -{ - Vector tmp(v.size()); - for (unsigned int i = 0; i < v.size(); i++) - tmp[i] = log(v[i]); - - return tmp; -} - -template -inline Vector vec_sqrt(const Vector& v) -{ - Vector tmp(v.size()); - for (unsigned int i = 0; i < v.size(); i++) - tmp[i] = sqrt(v[i]); - - return tmp; -} - -template -inline Vector pow(const Vector& v, double a) -{ - Vector tmp(v.size()); - for (unsigned int i = 0; i < v.size(); i++) - tmp[i] = pow(v[i], a); - - return tmp; -} - -template -inline Vector abs(const Vector& v) -{ - Vector tmp(v.size()); - for (unsigned int i = 0; i < v.size(); i++) - tmp[i] = (T)fabs(v[i]); - - return tmp; -} - -template -inline Vector sign(const Vector& v) -{ - Vector tmp(v.size()); - for (unsigned int i = 0; i < v.size(); i++) - tmp[i] = v[i] > 0 ? +1 : v[i] == 0 ? 0 : -1; - - return tmp; -} - -template -inline unsigned int partition(Vector& v, unsigned int begin, unsigned int end) -{ - unsigned int i = begin + 1, j = begin + 1; - T pivot = v[begin]; - while (j <= end) - { - if (v[j] < pivot) { - std::swap(v[i], v[j]); - i++; - } - j++; - } - v[begin] = v[i - 1]; - v[i - 1] = pivot; - return i - 2; -} - - -template -inline void quicksort(Vector& v, unsigned int begin, unsigned int end) -{ - if (end > begin) - { - unsigned int index = partition(v, begin, end); - quicksort(v, begin, index); - quicksort(v, index + 2, end); - } -} - -template -inline Vector sort(const Vector& v) -{ - Vector tmp(v); - - quicksort(tmp, 0, tmp.size() - 1); - - return tmp; -} - -template -inline Vector rank(const Vector& v) -{ - Vector tmp(v); - Vector tmp_rank(0.0, v.size()); - - for (unsigned int i = 0; i < tmp.size(); i++) - { - unsigned int smaller = 0, equal = 0; - for (unsigned int j = 0; j < tmp.size(); j++) - if (i == j) - continue; - else - if (tmp[j] < tmp[i]) - smaller++; - else if (tmp[j] == tmp[i]) - equal++; - tmp_rank[i] = smaller + 1; - if (equal > 0) - { - for (unsigned int j = 1; j <= equal; j++) - tmp_rank[i] += smaller + 1 + j; - tmp_rank[i] /= (double)(equal + 1); - } - } - - return tmp_rank; -} - -//enum MType { DIAG }; - -template -class Matrix -{ -public: - Matrix(); // Default constructor - Matrix(const unsigned int n, const unsigned int m); // Construct a n x m matrix - Matrix(const T& a, const unsigned int n, const unsigned int m); // Initialize the content to constant a - Matrix(MType t, const T& a, const T& o, const unsigned int n, const unsigned int m); - Matrix(MType t, const Vector& v, const T& o, const unsigned int n, const unsigned int m); - Matrix(const T* a, const unsigned int n, const unsigned int m); // Initialize to array - Matrix(const Matrix& rhs); // Copy constructor - ~Matrix(); // destructor - - inline T* operator[](const unsigned int& i) { return v[i]; } // Subscripting: row i - inline const T* operator[](const unsigned int& i) const { return v[i]; }; // const subsctipting - - inline void resize(const unsigned int n, const unsigned int m); - inline void resize(const T& a, const unsigned int n, const unsigned int m); - - - inline Vector extractRow(const unsigned int i) const; - inline Vector extractColumn(const unsigned int j) const; - inline Vector extractDiag() const; - inline Matrix extractRows(const std::set& indexes) const; - inline Matrix extractColumns(const std::set& indexes) const; - inline Matrix extract(const std::set& r_indexes, const std::set& c_indexes) const; - - inline void set(const T* a, unsigned int n, unsigned int m); - inline void set(const std::set& r_indexes, const std::set& c_indexes, const Matrix& m); - inline void setRow(const unsigned int index, const Vector& v); - inline void setRow(const unsigned int index, const Matrix& v); - inline void setRows(const std::set& indexes, const Matrix& m); - inline void setColumn(const unsigned int index, const Vector& v); - inline void setColumn(const unsigned int index, const Matrix& v); - inline void setColumns(const std::set& indexes, const Matrix& m); - - - inline unsigned int nrows() const { return n; } // number of rows - inline unsigned int ncols() const { return m; } // number of columns - - inline Matrix& operator=(const Matrix& rhs); // Assignment operator - inline Matrix& operator=(const T& a); // Assign to every element value a - inline Matrix& operator+=(const Matrix& rhs); - inline Matrix& operator-=(const Matrix& rhs); - inline Matrix& operator*=(const Matrix& rhs); - inline Matrix& operator/=(const Matrix& rhs); - inline Matrix& operator^=(const Matrix& rhs); - inline Matrix& operator+=(const T& a); - inline Matrix& operator-=(const T& a); - inline Matrix& operator*=(const T& a); - inline Matrix& operator/=(const T& a); - inline Matrix& operator^=(const T& a); - inline operator Vector(); -private: - unsigned int n; // number of rows - unsigned int m; // number of columns - T **v; // storage for data -}; - -template -Matrix::Matrix() - : n(0), m(0), v(0) -{} - -template -Matrix::Matrix(unsigned int n, unsigned int m) - : v(new T*[n]) -{ - this->n = n; this->m = m; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; -} - -template -Matrix::Matrix(const T& a, unsigned int n, unsigned int m) - : v(new T*[n]) -{ - this->n = n; this->m = m; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = a; -} - -template -Matrix::Matrix(const T* a, unsigned int n, unsigned int m) - : v(new T*[n]) -{ - this->n = n; this->m = m; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = *a++; -} - -template -Matrix::Matrix(MType t, const T& a, const T& o, unsigned int n, unsigned int m) - : v(new T*[n]) -{ - this->n = n; this->m = m; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; - switch (t) - { - case DIAG: - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - if (i != j) - v[i][j] = o; - else - v[i][j] = a; - break; - default: - throw std::logic_error("Matrix type not supported"); - } -} - -template -Matrix::Matrix(MType t, const Vector& a, const T& o, unsigned int n, unsigned int m) - : v(new T*[n]) -{ - this->n = n; this->m = m; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; - switch (t) - { - case DIAG: - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - if (i != j) - v[i][j] = o; - else - v[i][j] = a[i]; - break; - default: - throw std::logic_error("Matrix type not supported"); - } -} - -template -Matrix::Matrix(const Matrix& rhs) - : v(new T*[rhs.n]) -{ - n = rhs.n; m = rhs.m; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = rhs[i][j]; -} - -template -Matrix::~Matrix() -{ - if (v != 0) { - delete[] (v[0]); - delete[] (v); - } -} - -template -inline Matrix& Matrix::operator=(const Matrix &rhs) -// postcondition: normal assignment via copying has been performed; -// if matrix and rhs were different sizes, matrix -// has been resized to match the size of rhs -{ - if (this != &rhs) - { - resize(rhs.n, rhs.m); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = rhs[i][j]; - } - return *this; -} - -template -inline Matrix& Matrix::operator=(const T& a) // assign a to every element -{ - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = a; - return *this; -} - - -template -inline void Matrix::resize(const unsigned int n, const unsigned int m) -{ - if (n == this->n && m == this->m) - return; - if (v != 0) - { - delete[] (v[0]); - delete[] (v); - } - this->n = n; this->m = m; - v = new T*[n]; - v[0] = new T[m * n]; - for (unsigned int i = 1; i < n; i++) - v[i] = v[i - 1] + m; -} - -template -inline void Matrix::resize(const T& a, const unsigned int n, const unsigned int m) -{ - resize(n, m); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = a; -} - - - -template -inline Vector Matrix::extractRow(const unsigned int i) const -{ - if (i >= n) - throw std::logic_error("Error in extractRow: trying to extract a row out of matrix bounds"); - Vector tmp(v[i], m); - - return tmp; -} - -template -inline Vector Matrix::extractColumn(const unsigned int j) const -{ - if (j >= m) - throw std::logic_error("Error in extractRow: trying to extract a row out of matrix bounds"); - Vector tmp(n); - - for (unsigned int i = 0; i < n; i++) - tmp[i] = v[i][j]; - - return tmp; -} - -template -inline Vector Matrix::extractDiag() const -{ - unsigned int d = std::min(n, m); - - Vector tmp(d); - - for (unsigned int i = 0; i < d; i++) - tmp[i] = v[i][i]; - - return tmp; - -} - -template -inline Matrix Matrix::extractRows(const std::set& indexes) const -{ - Matrix tmp(indexes.size(), m); - unsigned int i = 0; - - for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) - { - for (unsigned int j = 0; j < m; j++) - { - if (*el >= n) - throw std::logic_error("Error extracting rows: the indexes are out of matrix bounds"); - tmp[i][j] = v[*el][j]; - } - i++; - } - - return tmp; -} - -template -inline Matrix Matrix::extractColumns(const std::set& indexes) const -{ - Matrix tmp(n, indexes.size()); - unsigned int j = 0; - - for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) - { - for (unsigned int i = 0; i < n; i++) - { - if (*el >= m) - throw std::logic_error("Error extracting columns: the indexes are out of matrix bounds"); - tmp[i][j] = v[i][*el]; - } - j++; - } - - return tmp; -} - -template -inline Matrix Matrix::extract(const std::set& r_indexes, const std::set& c_indexes) const -{ - Matrix tmp(r_indexes.size(), c_indexes.size()); - unsigned int i = 0, j; - - for (std::set::const_iterator r_el = r_indexes.begin(); r_el != r_indexes.end(); r_el++) - { - if (*r_el >= n) - throw std::logic_error("Error extracting submatrix: the indexes are out of matrix bounds"); - j = 0; - for (std::set::const_iterator c_el = c_indexes.begin(); c_el != c_indexes.end(); c_el++) - { - if (*c_el >= m) - throw std::logic_error("Error extracting rows: the indexes are out of matrix bounds"); - tmp[i][j] = v[*r_el][*c_el]; - j++; - } - i++; - } - - return tmp; -} - -template -inline void Matrix::setRow(unsigned int i, const Vector& a) -{ - if (i >= n) - throw std::logic_error("Error in setRow: trying to set a row out of matrix bounds"); - if (this->m != a.size()) - throw std::logic_error("Error setting matrix row: ranges are not compatible"); - for (unsigned int j = 0; j < ncols(); j++) - v[i][j] = a[j]; -} - -template -inline void Matrix::setRow(unsigned int i, const Matrix& a) -{ - if (i >= n) - throw std::logic_error("Error in setRow: trying to set a row out of matrix bounds"); - if (this->m != a.ncols()) - throw std::logic_error("Error setting matrix column: ranges are not compatible"); - if (a.nrows() != 1) - throw std::logic_error("Error setting matrix column with a non-row matrix"); - for (unsigned int j = 0; j < ncols(); j++) - v[i][j] = a[0][j]; -} - -template -inline void Matrix::setRows(const std::set& indexes, const Matrix& m) -{ - unsigned int i = 0; - - if (indexes.size() != m.nrows() || this->m != m.ncols()) - throw std::logic_error("Error setting matrix rows: ranges are not compatible"); - for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) - { - for (unsigned int j = 0; j < ncols(); j++) - { - if (*el >= n) - throw std::logic_error("Error in setRows: trying to set a row out of matrix bounds"); - v[*el][j] = m[i][j]; - } - i++; - } -} - -template -inline void Matrix::setColumn(unsigned int j, const Vector& a) -{ - if (j >= m) - throw std::logic_error("Error in setColumn: trying to set a column out of matrix bounds"); - if (this->n != a.size()) - throw std::logic_error("Error setting matrix column: ranges are not compatible"); - for (unsigned int i = 0; i < nrows(); i++) - v[i][j] = a[i]; -} - -template -inline void Matrix::setColumn(unsigned int j, const Matrix& a) -{ - if (j >= m) - throw std::logic_error("Error in setColumn: trying to set a column out of matrix bounds"); - if (this->n != a.nrows()) - throw std::logic_error("Error setting matrix column: ranges are not compatible"); - if (a.ncols() != 1) - throw std::logic_error("Error setting matrix column with a non-column matrix"); - for (unsigned int i = 0; i < nrows(); i++) - v[i][j] = a[i][0]; -} - - -template -inline void Matrix::setColumns(const std::set& indexes, const Matrix& a) -{ - unsigned int j = 0; - - if (indexes.size() != a.ncols() || this->n != a.nrows()) - throw std::logic_error("Error setting matrix columns: ranges are not compatible"); - for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) - { - for (unsigned int i = 0; i < nrows(); i++) - { - if (*el >= m) - throw std::logic_error("Error in setColumns: trying to set a column out of matrix bounds"); - v[i][*el] = a[i][j]; - } - j++; - } -} - -template -inline void Matrix::set(const std::set& r_indexes, const std::set& c_indexes, const Matrix& a) -{ - unsigned int i = 0, j; - if (c_indexes.size() != a.ncols() || r_indexes.size() != a.nrows()) - throw std::logic_error("Error setting matrix elements: ranges are not compatible"); - - for (std::set::const_iterator r_el = r_indexes.begin(); r_el != r_indexes.end(); r_el++) - { - if (*r_el >= n) - throw std::logic_error("Error in set: trying to set a row out of matrix bounds"); - j = 0; - for (std::set::const_iterator c_el = c_indexes.begin(); c_el != c_indexes.end(); c_el++) - { - if (*c_el >= m) - throw std::logic_error("Error in set: trying to set a column out of matrix bounds"); - v[*r_el][*c_el] = a[i][j]; - j++; - } - i++; - } -} - -template -inline void Matrix::set(const T* a, unsigned int n, unsigned int m) -{ - if (this->n != n || this->m != m) - resize(n, m); - unsigned int k = 0; - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = a[k++]; -} - - -template -Matrix operator+(const Matrix& rhs) -{ - return rhs; -} - -template -Matrix operator+(const Matrix& lhs, const Matrix& rhs) -{ - if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) - throw std::logic_error("Operator+: matrices have different sizes"); - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] + rhs[i][j]; - - return tmp; -} - -template -Matrix operator+(const Matrix& lhs, const T& a) -{ - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] + a; - - return tmp; -} - -template -Matrix operator+(const T& a, const Matrix& rhs) -{ - Matrix tmp(rhs.nrows(), rhs.ncols()); - for (unsigned int i = 0; i < rhs.nrows(); i++) - for (unsigned int j = 0; j < rhs.ncols(); j++) - tmp[i][j] = a + rhs[i][j]; - - return tmp; -} - -template -inline Matrix& Matrix::operator+=(const Matrix& rhs) -{ - if (m != rhs.ncols() || n != rhs.nrows()) - throw std::logic_error("Operator+=: matrices have different sizes"); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] += rhs[i][j]; - - return *this; -} - -template -inline Matrix& Matrix::operator+=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] += a; - - return *this; -} - -template -Matrix operator-(const Matrix& rhs) -{ - return (T)(-1) * rhs; -} - -template -Matrix operator-(const Matrix& lhs, const Matrix& rhs) -{ - if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) - throw std::logic_error("Operator-: matrices have different sizes"); - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] - rhs[i][j]; - - return tmp; -} - -template -Matrix operator-(const Matrix& lhs, const T& a) -{ - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] - a; - - return tmp; -} - -template -Matrix operator-(const T& a, const Matrix& rhs) -{ - Matrix tmp(rhs.nrows(), rhs.ncols()); - for (unsigned int i = 0; i < rhs.nrows(); i++) - for (unsigned int j = 0; j < rhs.ncols(); j++) - tmp[i][j] = a - rhs[i][j]; - - return tmp; -} - -template -inline Matrix& Matrix::operator-=(const Matrix& rhs) -{ - if (m != rhs.ncols() || n != rhs.nrows()) - throw std::logic_error("Operator-=: matrices have different sizes"); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] -= rhs[i][j]; - - return *this; -} - -template -inline Matrix& Matrix::operator-=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] -= a; - - return *this; -} - -template -Matrix operator*(const Matrix& lhs, const Matrix& rhs) -{ - if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) - throw std::logic_error("Operator*: matrices have different sizes"); - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] * rhs[i][j]; - - return tmp; -} - -template -Matrix operator*(const Matrix& lhs, const T& a) -{ - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] * a; - - return tmp; -} - -template -Matrix operator*(const T& a, const Matrix& rhs) -{ - Matrix tmp(rhs.nrows(), rhs.ncols()); - for (unsigned int i = 0; i < rhs.nrows(); i++) - for (unsigned int j = 0; j < rhs.ncols(); j++) - tmp[i][j] = a * rhs[i][j]; - - return tmp; -} - -template -inline Matrix& Matrix::operator*=(const Matrix& rhs) -{ - if (m != rhs.ncols() || n != rhs.nrows()) - throw std::logic_error("Operator*=: matrices have different sizes"); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] *= rhs[i][j]; - - return *this; -} - -template -inline Matrix& Matrix::operator*=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] *= a; - - return *this; -} - -template -Matrix operator/(const Matrix& lhs, const Matrix& rhs) -{ - if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) - throw std::logic_error("Operator+: matrices have different sizes"); - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] / rhs[i][j]; - - return tmp; -} - -template -Matrix operator/(const Matrix& lhs, const T& a) -{ - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = lhs[i][j] / a; - - return tmp; -} - -template -Matrix operator/(const T& a, const Matrix& rhs) -{ - Matrix tmp(rhs.nrows(), rhs.ncols()); - for (unsigned int i = 0; i < rhs.nrows(); i++) - for (unsigned int j = 0; j < rhs.ncols(); j++) - tmp[i][j] = a / rhs[i][j]; - - return tmp; -} - -template -inline Matrix& Matrix::operator/=(const Matrix& rhs) -{ - if (m != rhs.ncols() || n != rhs.nrows()) - throw std::logic_error("Operator+=: matrices have different sizes"); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] /= rhs[i][j]; - - return *this; -} - -template -inline Matrix& Matrix::operator/=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] /= a; - - return *this; -} - -template -Matrix operator^(const Matrix& lhs, const T& a) -{ - Matrix tmp(lhs.nrows(), lhs.ncols()); - for (unsigned int i = 0; i < lhs.nrows(); i++) - for (unsigned int j = 0; j < lhs.ncols(); j++) - tmp[i][j] = pow(lhs[i][j], a); - - return tmp; -} - -template -inline Matrix& Matrix::operator^=(const Matrix& rhs) -{ - if (m != rhs.ncols() || n != rhs.nrows()) - throw std::logic_error("Operator^=: matrices have different sizes"); - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = pow(v[i][j], rhs[i][j]); - - return *this; -} - - -template -inline Matrix& Matrix::operator^=(const T& a) -{ - for (unsigned int i = 0; i < n; i++) - for (unsigned int j = 0; j < m; j++) - v[i][j] = pow(v[i][j], a); - - return *this; -} - -template -inline Matrix::operator Vector() -{ - if (n > 1 && m > 1) - throw std::logic_error("Error matrix cast to vector: trying to cast a multi-dimensional matrix"); - if (n == 1) - return extractRow(0); - else - return extractColumn(0); -} - -template -inline bool operator==(const Matrix& a, const Matrix& b) -{ - if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) - throw std::logic_error("Matrices of different size are not confrontable"); - for (unsigned i = 0; i < a.nrows(); i++) - for (unsigned j = 0; j < a.ncols(); j++) - if (a[i][j] != b[i][j]) - return false; - return true; -} - -template -inline bool operator!=(const Matrix& a, const Matrix& b) -{ - if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) - throw std::logic_error("Matrices of different size are not confrontable"); - for (unsigned i = 0; i < a.nrows(); i++) - for (unsigned j = 0; j < a.ncols(); j++) - if (a[i][j] != b[i][j]) - return true; - return false; -} - - - -/** - Input/Output -*/ -template -std::ostream& operator<<(std::ostream& os, const Matrix& m) -{ - os << std::endl << m.nrows() << " " << m.ncols() << std::endl; - for (unsigned int i = 0; i < m.nrows(); i++) - { - for (unsigned int j = 0; j < m.ncols() - 1; j++) - os << std::setw(20) << std::setprecision(16) << m[i][j] << ", "; - os << std::setw(20) << std::setprecision(16) << m[i][m.ncols() - 1] << std::endl; - } - - return os; -} - -template -std::istream& operator>>(std::istream& is, Matrix& m) -{ - int rows, cols; - char comma; - is >> rows >> cols; - m.resize(rows, cols); - for (unsigned int i = 0; i < rows; i++) - for (unsigned int j = 0; j < cols; j++) - is >> m[i][j] >> comma; - - return is; -} - -template -T sign(const T& v) -{ - if (v >= (T)0.0) - return (T)1.0; - else - return (T)-1.0; -} - -template -T dist(const T& a, const T& b) -{ - T abs_a = (T)fabs(a), abs_b = (T)fabs(b); - if (abs_a > abs_b) - return abs_a * sqrt((T)1.0 + (abs_b / abs_a) * (abs_b / abs_a)); - else - return (abs_b == (T)0.0 ? (T)0.0 : abs_b * sqrt((T)1.0 + (abs_a / abs_b) * (abs_a / abs_b))); -} - -template -void svd(const Matrix& A, Matrix& U, Vector& W, Matrix& V) -{ - int m = A.nrows(), n = A.ncols(), i, j, k, l, jj, nm; - const unsigned int max_its = 30; - bool flag; - Vector rv1(n); - U = A; - W.resize(n); - V.resize(n, n); - T anorm, c, f, g, h, s, scale, x, y, z; - g = scale = anorm = (T)0.0; - - // Householder reduction to bidiagonal form - for (i = 0; i < n; i++) - { - l = i + 1; - rv1[i] = scale * g; - g = s = scale = (T)0.0; - if (i < m) - { - for (k = i; k < m; k++) - scale += fabs(U[k][i]); - if (scale != (T)0.0) - { - for (k = i; k < m; k++) - { - U[k][i] /= scale; - s += U[k][i] * U[k][i]; - } - f = U[i][i]; - g = -sign(f) * sqrt(s); - h = f * g - s; - U[i][i] = f - g; - for (j = l; j < n; j++) - { - s = (T)0.0; - for (k = i; k < m; k++) - s += U[k][i] * U[k][j]; - f = s / h; - for (k = i; k < m; k++) - U[k][j] += f * U[k][i]; - } - for (k = i; k < m; k++) - U[k][i] *= scale; - } - } - W[i] = scale * g; - g = s = scale = (T)0.0; - if (i < m && i != n - 1) - { - for (k = l; k < n; k++) - scale += fabs(U[i][k]); - if (scale != (T)0.0) - { - for (k = l; k < n; k++) - { - U[i][k] /= scale; - s += U[i][k] * U[i][k]; - } - f = U[i][l]; - g = -sign(f) * sqrt(s); - h = f * g - s; - U[i][l] = f - g; - for (k = l; k = 0; i--) - { - if (i < n - 1) - { - if (g != (T)0.0) - { - for (j = l; j < n; j++) - V[j][i] = (U[i][j] / U[i][l]) / g; - for (j = l; j < n; j++) - { - s = (T)0.0; - for (k = l; k < n; k++) - s += U[i][k] * V[k][j]; - for (k = l; k < n; k++) - V[k][j] += s * V[k][i]; - } - } - for (j = l; j < n; j++) - V[i][j] = V[j][i] = (T)0.0; - } - V[i][i] = (T)1.0; - g = rv1[i]; - l = i; - } - // Accumulation of left-hand transformations - for (i = std::min(m, n) - 1; i >= 0; i--) - { - l = i + 1; - g = W[i]; - for (j = l; j < n; j++) - U[i][j] = (T)0.0; - if (g != (T)0.0) - { - g = (T)1.0 / g; - for (j = l; j < n; j++) - { - s = (T)0.0; - for (k = l; k < m; k++) - s += U[k][i] * U[k][j]; - f = (s / U[i][i]) * g; - for (k = i; k < m; k++) - U[k][j] += f * U[k][i]; - } - for (j = i; j < m; j++) - U[j][i] *= g; - } - else - for (j = i; j < m; j++) - U[j][i] = (T)0.0; - U[i][i]++; - } - // Diagonalization of the bidiagonal form: loop over singular values, and over allowed iterations. - for (k = n - 1; k >= 0; k--) - { - for (unsigned int its = 0; its < max_its; its++) - { - flag = true; - for (l = k; l >= 0; l--) - { // Test for splitting - nm = l - 1; // Note that rV[0] is always zero - if ((T)(fabs(rv1[l]) + anorm) == anorm) - { - flag = false; - break; - } - if ((T)(fabs(W[nm]) + anorm) == anorm) - break; - } - if (flag) - { - // Cancellation of rv1[l], if l > 0 FIXME: it was l > 1 in NR - c = (T)0.0; - s = (T)1.0; - for (i = l; i <= k; i++) - { - f = s * rv1[i]; - rv1[i] *= c; - if ((T)(fabs(f) + anorm) == anorm) - break; - g = W[i]; - h = dist(f, g); - W[i] = h; - h = (T)1.0 / h; - c = g * h; - s = -f * h; - for (j = 0; j < m; j++) - { - y = U[j][nm]; - z = U[j][i]; - U[j][nm] = y * c + z * s; - U[j][i] = z * c - y * s; - } - } - } - z = W[k]; - if (l == k) - { // Convergence - if (z < (T)0.0) - { // Singular value is made nonnegative - W[k] = -z; - for (j = 0; j < n; j++) - V[j][k] = -V[j][k]; - } - break; - } - if (its == max_its) - throw std::logic_error("Error svd: no convergence in the maximum number of iterations"); - x = W[l]; - nm = k - 1; - y = W[nm]; - g = rv1[nm]; - h = rv1[k]; - f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y); - g = dist(f, (T)1.0); - f = ((x - z) * (x + z) + h * ((y / (f + sign(f)*fabs(g))) - h)) / x; - c = s = (T)1.0; // Next QR transformation - for (j = l; j <= nm; j++) - { - i = j + 1; - g = rv1[i]; - y = W[i]; - h = s * g; - g *= c; - z = dist(f, h); - rv1[j] = z; - c = f / z; - s = h / z; - f = x * c + g * s; - g = g * c - x * s; - h = y * s; - y *= c; - for (jj = 0; jj < n; jj++) - { - x = V[jj][j]; - z = V[jj][i]; - V[jj][j] = x * c + z * s; - V[jj][i] = z * c - x * s; - } - z = dist(f, h); - W[j] = z; - if (z != 0) // Rotation can be arbitrary if z = 0 - { - z = (T)1.0 / z; - c = f * z; - s = h * z; - } - f = c * g + s * y; - x = c * y - s * g; - for (jj = 0; jj < m; jj++) - { - y = U[jj][j]; - z = U[jj][i]; - U[jj][j] = y * c + z * s; - U[jj][i] = z * c - y * s; - } - } - rv1[l] = (T)0.0; - rv1[k] = f; - W[k] = x; - } - } -} - -template -Matrix pinv(const Matrix& A) -{ - Matrix U, V, x, tmp(A.ncols(), A.nrows()); - Vector W; - CanonicalBaseVector e(0, A.nrows()); - svd(A, U, W, V); - for (unsigned int i = 0; i < A.nrows(); i++) - { - e.reset(i); - tmp.setColumn(i, dot_prod(dot_prod(dot_prod(V, Matrix(DIAG, 1.0 / W, 0.0, W.size(), W.size())), t(U)), e)); - } - - return tmp; -} - -template -int lu(const Matrix& A, Matrix& LU, Vector& index) -{ - if (A.ncols() != A.nrows()) - throw std::logic_error("Error in LU decomposition: matrix must be squared"); - int i, p, j, k, n = A.ncols(), ex; - T val, tmp; - Vector d(n); - LU = A; - index.resize(n); - - ex = 1; - for (i = 0; i < n; i++) - { - index[i] = i; - val = (T)0.0; - for (j = 0; j < n; j++) - val = std::max(val, (T)fabs(LU[i][j])); - if (val == (T)0.0) - std::logic_error("Error in LU decomposition: matrix was singular"); - d[i] = val; - } - - for (k = 0; k < n - 1; k++) - { - p = k; - val = fabs(LU[k][k]) / d[k]; - for (i = k + 1; i < n; i++) - { - tmp = fabs(LU[i][k]) / d[i]; - if (tmp > val) - { - val = tmp; - p = i; - } - } - if (val == (T)0.0) - std::logic_error("Error in LU decomposition: matrix was singular"); - if (p > k) - { - ex = -ex; - std::swap(index[k], index[p]); - std::swap(d[k], d[p]); - for (j = 0; j < n; j++) - std::swap(LU[k][j], LU[p][j]); - } - - for (i = k + 1; i < n; i++) - { - LU[i][k] /= LU[k][k]; - for (j = k + 1; j < n; j++) - LU[i][j] -= LU[i][k] * LU[k][j]; - } - } - if (LU[n - 1][n - 1] == (T)0.0) - std::logic_error("Error in LU decomposition: matrix was singular"); - - return ex; -} - -template -Vector lu_solve(const Matrix& LU, const Vector& b, Vector& index) -{ - if (LU.ncols() != LU.nrows()) - throw std::logic_error("Error in LU solve: LU matrix should be squared"); - unsigned int n = LU.ncols(); - if (b.size() != n) - throw std::logic_error("Error in LU solve: b vector must be of the same dimensions of LU matrix"); - Vector x((T)0.0, n); - int i, j, p; - T sum; - - p = index[0]; - x[0] = b[p]; - - for (i = 1; i < n; i++) - { - sum = (T)0.0; - for (j = 0; j < i; j++) - sum += LU[i][j] * x[j]; - p = index[i]; - x[i] = b[p] - sum; - } - x[n - 1] /= LU[n - 1][n - 1]; - for (i = n - 2; i >= 0; i--) - { - sum = (T)0.0; - for (j = i + 1; j < n; j++) - sum += LU[i][j] * x[j]; - x[i] = (x[i] - sum) / LU[i][i]; - } - return x; -} - -template -void lu_solve(const Matrix& LU, Vector& x, const Vector& b, Vector& index) -{ - x = lu_solve(LU, b, index); -} - -template -Matrix lu_inverse(const Matrix& A) -{ - if (A.ncols() != A.nrows()) - throw std::logic_error("Error in LU invert: matrix must be squared"); - unsigned int n = A.ncols(); - Matrix A1(n, n), LU; - Vector index; - - lu(A, LU, index); - CanonicalBaseVector e(0, n); - for (unsigned i = 0; i < n; i++) - { - e.reset(i); - A1.setColumn(i, lu_solve(LU, e, index)); - } - - return A1; -} - -template -T lu_det(const Matrix& A) -{ - if (A.ncols() != A.nrows()) - throw std::logic_error("Error in LU determinant: matrix must be squared"); - unsigned int d; - Matrix LU; - Vector index; - - d = lu(A, LU, index); - - return d * prod(LU.extractDiag()); -} - -template -void cholesky(const Matrix A, Matrix& LL) -{ - if (A.ncols() != A.nrows()) - throw std::logic_error("Error in Cholesky decomposition: matrix must be squared"); - int n = A.ncols(); - double sum; - LL = A; - - for (unsigned int i = 0; i < n; i++) - { - for (unsigned int j = i; j < n; j++) - { - sum = LL[i][j]; - for (int k = i - 1; k >= 0; k--) - sum -= LL[i][k] * LL[j][k]; - if (i == j) - { - if (sum <= 0.0) - throw std::logic_error("Error in Cholesky decomposition: matrix is not postive definite"); - LL[i][i] = sqrt(sum); - } - else - LL[j][i] = sum / LL[i][i]; - } - for (unsigned int k = i + 1; k < n; k++) - LL[i][k] = LL[k][i]; - } -} - -template -Matrix cholesky(const Matrix A) -{ - Matrix LL; - cholesky(A, LL); - - return LL; -} - -template -Vector cholesky_solve(const Matrix& LL, const Vector& b) -{ - if (LL.ncols() != LL.nrows()) - throw std::logic_error("Error in Cholesky solve: matrix must be squared"); - unsigned int n = LL.ncols(); - if (b.size() != n) - throw std::logic_error("Error in Cholesky decomposition: b vector must be of the same dimensions of LU matrix"); - Vector x, y; - - /* Solve L * y = b */ - forward_elimination(LL, y, b); - /* Solve L^T * x = y */ - backward_elimination(LL, x, y); - - return x; -} - -template -void cholesky_solve(const Matrix& LL, Vector& x, const Vector& b) -{ - x = cholesky_solve(LL, b); -} - -template -void forward_elimination(const Matrix& L, Vector& y, const Vector b) -{ - if (L.ncols() != L.nrows()) - throw std::logic_error("Error in Forward elimination: matrix must be squared (lower triangular)"); - if (b.size() != L.nrows()) - throw std::logic_error("Error in Forward elimination: b vector must be of the same dimensions of L matrix"); - unsigned int n = b.size(); - y.resize(n); - - y[0] = b[0] / L[0][0]; - for (unsigned int i = 1; i < n; i++) - { - y[i] = b[i]; - for (unsigned int j = 0; j < i; j++) - y[i] -= L[i][j] * y[j]; - y[i] = y[i] / L[i][i]; - } -} - -template -Vector forward_elimination(const Matrix& L, const Vector b) -{ - Vector y; - forward_elimination(L, y, b); - - return y; -} - -template -void backward_elimination(const Matrix& U, Vector& x, const Vector& y) -{ - if (U.ncols() != U.nrows()) - throw std::logic_error("Error in Backward elimination: matrix must be squared (upper triangular)"); - if (y.size() != U.nrows()) - throw std::logic_error("Error in Backward elimination: b vector must be of the same dimensions of U matrix"); - int n = y.size(); - x.resize(n); - - x[n - 1] = y[n - 1] / U[n - 1][n - 1]; - for (int i = n - 2; i >= 0; i--) - { - x[i] = y[i]; - for (int j = i + 1; j < n; j++) - x[i] -= U[i][j] * x[j]; - x[i] = x[i] / U[i][i]; - } -} - -template -Vector backward_elimination(const Matrix& U, const Vector y) -{ - Vector x; - forward_elimination(U, x, y); - - return x; -} - -/* Setting default linear systems machinery */ - -// #define det lu_det -// #define inverse lu_inverse -// #define solve lu_solve - -/* Random */ - -template -void random(Matrix& m) -{ - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - m[i][j] = (T)(rand() / double(RAND_MAX)); -} - -/** - Aggregate functions -*/ - -template -Vector sum(const Matrix& m) -{ - Vector tmp((T)0, m.ncols()); - for (unsigned int j = 0; j < m.ncols(); j++) - for (unsigned int i = 0; i < m.nrows(); i++) - tmp[j] += m[i][j]; - return tmp; -} - -template -Vector r_sum(const Matrix& m) -{ - Vector tmp((T)0, m.nrows()); - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp[i] += m[i][j]; - return tmp; -} - -template -T all_sum(const Matrix& m) -{ - T tmp = (T)0; - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp += m[i][j]; - return tmp; -} - -template -Vector prod(const Matrix& m) -{ - Vector tmp((T)1, m.ncols()); - for (unsigned int j = 0; j < m.ncols(); j++) - for (unsigned int i = 0; i < m.nrows(); i++) - tmp[j] *= m[i][j]; - return tmp; -} - -template -Vector r_prod(const Matrix& m) -{ - Vector tmp((T)1, m.nrows()); - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp[i] *= m[i][j]; - return tmp; -} - -template -T all_prod(const Matrix& m) -{ - T tmp = (T)1; - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp *= m[i][j]; - return tmp; -} - -template -Vector mean(const Matrix& m) -{ - Vector res((T)0, m.ncols()); - for (unsigned int j = 0; j < m.ncols(); j++) - { - for (unsigned int i = 0; i < m.nrows(); i++) - res[j] += m[i][j]; - res[j] /= m.nrows(); - } - - return res; -} - -template -Vector r_mean(const Matrix& m) -{ - Vector res((T)0, m.rows()); - for (unsigned int i = 0; i < m.nrows(); i++) - { - for (unsigned int j = 0; j < m.ncols(); j++) - res[i] += m[i][j]; - res[i] /= m.nrows(); - } - - return res; -} - -template -T all_mean(const Matrix& m) -{ - T tmp = (T)0; - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp += m[i][j]; - return tmp / (m.nrows() * m.ncols()); -} - -template -Vector var(const Matrix& m, bool sample_correction = false) -{ - Vector res((T)0, m.ncols()); - unsigned int n = m.nrows(); - double sum, ssum; - for (unsigned int j = 0; j < m.ncols(); j++) - { - sum = (T)0.0; ssum = (T)0.0; - for (unsigned int i = 0; i < m.nrows(); i++) - { - sum += m[i][j]; - ssum += (m[i][j] * m[i][j]); - } - if (!sample_correction) - res[j] = (ssum / n) - (sum / n) * (sum / n); - else - res[j] = n * ((ssum / n) - (sum / n) * (sum / n)) / (n - 1); - } - - return res; -} - -template -Vector stdev(const Matrix& m, bool sample_correction = false) -{ - return vec_sqrt(var(m, sample_correction)); -} - -template -Vector r_var(const Matrix& m, bool sample_correction = false) -{ - Vector res((T)0, m.nrows()); - double sum, ssum; - unsigned int n = m.ncols(); - for (unsigned int i = 0; i < m.nrows(); i++) - { - sum = 0.0; ssum = 0.0; - for (unsigned int j = 0; j < m.ncols(); j++) - { - sum += m[i][j]; - ssum += (m[i][j] * m[i][j]); - } - if (!sample_correction) - res[i] = (ssum / n) - (sum / n) * (sum / n); - else - res[i] = n * ((ssum / n) - (sum / n) * (sum / n)) / (n - 1); - } - - return res; -} - -template -Vector r_stdev(const Matrix& m, bool sample_correction = false) -{ - return vec_sqrt(r_var(m, sample_correction)); -} - -template -Vector max(const Matrix& m) -{ - Vector res(m.ncols()); - double value; - for (unsigned int j = 0; j < m.ncols(); j++) - { - value = m[0][j]; - for (unsigned int i = 1; i < m.nrows(); i++) - value = std::max(m[i][j], value); - res[j] = value; - } - - return res; -} - -template -Vector r_max(const Matrix& m) -{ - Vector res(m.nrows()); - double value; - for (unsigned int i = 0; i < m.nrows(); i++) - { - value = m[i][0]; - for (unsigned int j = 1; j < m.ncols(); j++) - value = std::max(m[i][j], value); - res[i] = value; - } - - return res; -} - -template -Vector min(const Matrix& m) -{ - Vector res(m.ncols()); - double value; - for (unsigned int j = 0; j < m.ncols(); j++) - { - value = m[0][j]; - for (unsigned int i = 1; i < m.nrows(); i++) - value = std::min(m[i][j], value); - res[j] = value; - } - - return res; -} - -template -Vector r_min(const Matrix& m) -{ - Vector res(m.nrows()); - double value; - for (unsigned int i = 0; i < m.nrows(); i++) - { - value = m[i][0]; - for (unsigned int j = 1; j < m.ncols(); j++) - value = std::min(m[i][j], value); - res[i] = value; - } - - return res; -} - - - -/** - Single element mathematical functions -*/ - -template -Matrix exp(const Matrix&m) -{ - Matrix tmp(m.nrows(), m.ncols()); - - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp[i][j] = exp(m[i][j]); - - return tmp; -} - -template -Matrix mat_sqrt(const Matrix&m) -{ - Matrix tmp(m.nrows(), m.ncols()); - - for (unsigned int i = 0; i < m.nrows(); i++) - for (unsigned int j = 0; j < m.ncols(); j++) - tmp[i][j] = sqrt(m[i][j]); - - return tmp; -} - -/** - Matrix operators -*/ - -template -Matrix kron(const Vector& b, const Vector& a) -{ - Matrix tmp(b.size(), a.size()); - for (unsigned int i = 0; i < b.size(); i++) - for (unsigned int j = 0; j < a.size(); j++) - tmp[i][j] = a[j] * b[i]; - - return tmp; -} - -template -Matrix t(const Matrix& a) -{ - Matrix tmp(a.ncols(), a.nrows()); - for (unsigned int i = 0; i < a.nrows(); i++) - for (unsigned int j = 0; j < a.ncols(); j++) - tmp[j][i] = a[i][j]; - - return tmp; -} - -template -Matrix dot_prod(const Matrix& a, const Matrix& b) -{ - if (a.ncols() != b.nrows()) - throw std::logic_error("Error matrix dot product: dimensions of the matrices are not compatible"); - Matrix tmp(a.nrows(), b.ncols()); - for (unsigned int i = 0; i < tmp.nrows(); i++) - for (unsigned int j = 0; j < tmp.ncols(); j++) - { - tmp[i][j] = (T)0; - for (unsigned int k = 0; k < a.ncols(); k++) - tmp[i][j] += a[i][k] * b[k][j]; - } - - return tmp; -} - -template -Matrix dot_prod(const Matrix& a, const Vector& b) -{ - if (a.ncols() != b.size()) - throw std::logic_error("Error matrix dot product: dimensions of the matrix and the vector are not compatible"); - Matrix tmp(a.nrows(), 1); - for (unsigned int i = 0; i < tmp.nrows(); i++) - { - tmp[i][0] = (T)0; - for (unsigned int k = 0; k < a.ncols(); k++) - tmp[i][0] += a[i][k] * b[k]; - } - - return tmp; -} - -template -Matrix dot_prod(const Vector& a, const Matrix& b) -{ - if (a.size() != b.nrows()) - throw std::logic_error("Error matrix dot product: dimensions of the vector and matrix are not compatible"); - Matrix tmp(1, b.ncols()); - for (unsigned int j = 0; j < tmp.ncols(); j++) - { - tmp[0][j] = (T)0; - for (unsigned int k = 0; k < a.size(); k++) - tmp[0][j] += a[k] * b[k][j]; - } - - return tmp; -} - -template -inline Matrix rank(const Matrix m) -{ - Matrix tmp(m.nrows(), m.ncols()); - for (unsigned int j = 0; j < m.ncols(); j++) - tmp.setColumn(j, rank(m.extractColumn(j))); - - return tmp; -} - -template -inline Matrix r_rank(const Matrix m) -{ - Matrix tmp(m.nrows(), m.ncols()); - for (unsigned int i = 0; i < m.nrows(); i++) - tmp.setRow(i, rank(m.extractRow(i))); - - return tmp; -} - -} // namespace quadprogpp - -#endif // define _ARRAY_HH_ +// $Id: Array.hh 249 2008-11-20 09:58:23Z schaerf $ +// This file is part of EasyLocalpp: a C++ Object-Oriented framework +// aimed at easing the development of Local Search algorithms. +// Copyright (C) 2001--2008 Andrea Schaerf, Luca Di Gaspero. +// +// This software may be modified and distributed under the terms +// of the MIT license. See the LICENSE file for details. + +#if !defined(_ARRAY_HH) +#define _ARRAY_HH + +#include +#include +#include +#include +#include +#include + +namespace quadprogpp { + +enum MType { DIAG }; + +template +class Vector +{ +public: + Vector(); + Vector(const unsigned int n); + Vector(const T& a, const unsigned int n); //initialize to constant value + Vector(const T* a, const unsigned int n); // Initialize to array + Vector(const Vector &rhs); // copy constructor + ~Vector(); // destructor + + inline void set(const T* a, const unsigned int n); + Vector extract(const std::set& indexes) const; + inline T& operator[](const unsigned int& i); //i-th element + inline const T& operator[](const unsigned int& i) const; + + inline unsigned int size() const; + inline void resize(const unsigned int n); + inline void resize(const T& a, const unsigned int n); + + Vector& operator=(const Vector& rhs); //assignment + Vector& operator=(const T& a); //assign a to every element + inline Vector& operator+=(const Vector& rhs); + inline Vector& operator-=(const Vector& rhs); + inline Vector& operator*=(const Vector& rhs); + inline Vector& operator/=(const Vector& rhs); + inline Vector& operator^=(const Vector& rhs); + inline Vector& operator+=(const T& a); + inline Vector& operator-=(const T& a); + inline Vector& operator*=(const T& a); + inline Vector& operator/=(const T& a); + inline Vector& operator^=(const T& a); +private: + unsigned int n; // size of array. upper index is n-1 + T* v; // storage for data +}; + +template +Vector::Vector() + : n(0), v(0) +{} + +template +Vector::Vector(const unsigned int n) + : v(new T[n]) +{ + this->n = n; +} + +template +Vector::Vector(const T& a, const unsigned int n) + : v(new T[n]) +{ + this->n = n; + for (unsigned int i = 0; i < n; i++) + v[i] = a; +} + +template +Vector::Vector(const T* a, const unsigned int n) + : v(new T[n]) +{ + this->n = n; + for (unsigned int i = 0; i < n; i++) + v[i] = *a++; +} + +template +Vector::Vector(const Vector& rhs) + : v(new T[rhs.n]) +{ + this->n = rhs.n; + for (unsigned int i = 0; i < n; i++) + v[i] = rhs[i]; +} + +template +Vector::~Vector() +{ + if (v != 0) + delete[] (v); +} + +template +void Vector::resize(const unsigned int n) +{ + if (n == this->n) + return; + if (v != 0) + delete[] (v); + v = new T[n]; + this->n = n; +} + +template +void Vector::resize(const T& a, const unsigned int n) +{ + resize(n); + for (unsigned int i = 0; i < n; i++) + v[i] = a; +} + + +template +inline Vector& Vector::operator=(const Vector& rhs) +// postcondition: normal assignment via copying has been performed; +// if vector and rhs were different sizes, vector +// has been resized to match the size of rhs +{ + if (this != &rhs) + { + resize(rhs.n); + for (unsigned int i = 0; i < n; i++) + v[i] = rhs[i]; + } + return *this; +} + +template +inline Vector & Vector::operator=(const T& a) //assign a to every element +{ + for (unsigned int i = 0; i < n; i++) + v[i] = a; + return *this; +} + +template +inline T & Vector::operator[](const unsigned int& i) //subscripting +{ + return v[i]; +} + +template +inline const T& Vector::operator[](const unsigned int& i) const //subscripting +{ + return v[i]; +} + +template +inline unsigned int Vector::size() const +{ + return n; +} + +template +inline void Vector::set(const T* a, unsigned int n) +{ + resize(n); + for (unsigned int i = 0; i < n; i++) + v[i] = a[i]; +} + +template +inline Vector Vector::extract(const std::set& indexes) const +{ + Vector tmp(indexes.size()); + unsigned int i = 0; + + for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) + { + if (*el >= n) + throw std::logic_error("Error extracting subvector: the indexes are out of vector bounds"); + tmp[i++] = v[*el]; + } + + return tmp; +} + +template +inline Vector& Vector::operator+=(const Vector& rhs) +{ + if (this->size() != rhs.size()) + throw std::logic_error("Operator+=: vectors have different sizes"); + for (unsigned int i = 0; i < n; i++) + v[i] += rhs[i]; + + return *this; +} + + +template +inline Vector& Vector::operator+=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + v[i] += a; + + return *this; +} + +template +inline Vector operator+(const Vector& rhs) +{ + return rhs; +} + +template +inline Vector operator+(const Vector& lhs, const Vector& rhs) +{ + if (lhs.size() != rhs.size()) + throw std::logic_error("Operator+: vectors have different sizes"); + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] + rhs[i]; + + return tmp; +} + +template +inline Vector operator+(const Vector& lhs, const T& a) +{ + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] + a; + + return tmp; +} + +template +inline Vector operator+(const T& a, const Vector& rhs) +{ + Vector tmp(rhs.size()); + for (unsigned int i = 0; i < rhs.size(); i++) + tmp[i] = a + rhs[i]; + + return tmp; +} + +template +inline Vector& Vector::operator-=(const Vector& rhs) +{ + if (this->size() != rhs.size()) + throw std::logic_error("Operator-=: vectors have different sizes"); + for (unsigned int i = 0; i < n; i++) + v[i] -= rhs[i]; + + return *this; +} + + +template +inline Vector& Vector::operator-=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + v[i] -= a; + + return *this; +} + +template +inline Vector operator-(const Vector& rhs) +{ + return (T)(-1) * rhs; +} + +template +inline Vector operator-(const Vector& lhs, const Vector& rhs) +{ + if (lhs.size() != rhs.size()) + throw std::logic_error("Operator-: vectors have different sizes"); + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] - rhs[i]; + + return tmp; +} + +template +inline Vector operator-(const Vector& lhs, const T& a) +{ + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] - a; + + return tmp; +} + +template +inline Vector operator-(const T& a, const Vector& rhs) +{ + Vector tmp(rhs.size()); + for (unsigned int i = 0; i < rhs.size(); i++) + tmp[i] = a - rhs[i]; + + return tmp; +} + +template +inline Vector& Vector::operator*=(const Vector& rhs) +{ + if (this->size() != rhs.size()) + throw std::logic_error("Operator*=: vectors have different sizes"); + for (unsigned int i = 0; i < n; i++) + v[i] *= rhs[i]; + + return *this; +} + + +template +inline Vector& Vector::operator*=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + v[i] *= a; + + return *this; +} + +template +inline Vector operator*(const Vector& lhs, const Vector& rhs) +{ + if (lhs.size() != rhs.size()) + throw std::logic_error("Operator*: vectors have different sizes"); + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] * rhs[i]; + + return tmp; +} + +template +inline Vector operator*(const Vector& lhs, const T& a) +{ + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] * a; + + return tmp; +} + +template +inline Vector operator*(const T& a, const Vector& rhs) +{ + Vector tmp(rhs.size()); + for (unsigned int i = 0; i < rhs.size(); i++) + tmp[i] = a * rhs[i]; + + return tmp; +} + +template +inline Vector& Vector::operator/=(const Vector& rhs) +{ + if (this->size() != rhs.size()) + throw std::logic_error("Operator/=: vectors have different sizes"); + for (unsigned int i = 0; i < n; i++) + v[i] /= rhs[i]; + + return *this; +} + + +template +inline Vector& Vector::operator/=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + v[i] /= a; + + return *this; +} + +template +inline Vector operator/(const Vector& lhs, const Vector& rhs) +{ + if (lhs.size() != rhs.size()) + throw std::logic_error("Operator/: vectors have different sizes"); + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] / rhs[i]; + + return tmp; +} + +template +inline Vector operator/(const Vector& lhs, const T& a) +{ + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = lhs[i] / a; + + return tmp; +} + +template +inline Vector operator/(const T& a, const Vector& rhs) +{ + Vector tmp(rhs.size()); + for (unsigned int i = 0; i < rhs.size(); i++) + tmp[i] = a / rhs[i]; + + return tmp; +} + +template +inline Vector operator^(const Vector& lhs, const Vector& rhs) +{ + if (lhs.size() != rhs.size()) + throw std::logic_error("Operator^: vectors have different sizes"); + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = pow(lhs[i], rhs[i]); + + return tmp; +} + +template +inline Vector operator^(const Vector& lhs, const T& a) +{ + Vector tmp(lhs.size()); + for (unsigned int i = 0; i < lhs.size(); i++) + tmp[i] = pow(lhs[i], a); + + return tmp; +} + +template +inline Vector operator^(const T& a, const Vector& rhs) +{ + Vector tmp(rhs.size()); + for (unsigned int i = 0; i < rhs.size(); i++) + tmp[i] = pow(a, rhs[i]); + + return tmp; +} + +template +inline Vector& Vector::operator^=(const Vector& rhs) +{ + if (this->size() != rhs.size()) + throw std::logic_error("Operator^=: vectors have different sizes"); + for (unsigned int i = 0; i < n; i++) + v[i] = pow(v[i], rhs[i]); + + return *this; +} + +template +inline Vector& Vector::operator^=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + v[i] = pow(v[i], a); + + return *this; +} + +template +inline bool operator==(const Vector& v, const Vector& w) +{ + if (v.size() != w.size()) + throw std::logic_error("Vectors of different size are not confrontable"); + for (unsigned i = 0; i < v.size(); i++) + if (v[i] != w[i]) + return false; + return true; +} + +template +inline bool operator!=(const Vector& v, const Vector& w) +{ + if (v.size() != w.size()) + throw std::logic_error("Vectors of different size are not confrontable"); + for (unsigned i = 0; i < v.size(); i++) + if (v[i] != w[i]) + return true; + return false; +} + +template +inline bool operator<(const Vector& v, const Vector& w) +{ + if (v.size() != w.size()) + throw std::logic_error("Vectors of different size are not confrontable"); + for (unsigned i = 0; i < v.size(); i++) + if (v[i] >= w[i]) + return false; + return true; +} + +template +inline bool operator<=(const Vector& v, const Vector& w) +{ + if (v.size() != w.size()) + throw std::logic_error("Vectors of different size are not confrontable"); + for (unsigned i = 0; i < v.size(); i++) + if (v[i] > w[i]) + return false; + return true; +} + +template +inline bool operator>(const Vector& v, const Vector& w) +{ + if (v.size() != w.size()) + throw std::logic_error("Vectors of different size are not confrontable"); + for (unsigned i = 0; i < v.size(); i++) + if (v[i] <= w[i]) + return false; + return true; +} + +template +inline bool operator>=(const Vector& v, const Vector& w) +{ + if (v.size() != w.size()) + throw std::logic_error("Vectors of different size are not confrontable"); + for (unsigned i = 0; i < v.size(); i++) + if (v[i] < w[i]) + return false; + return true; +} + +/** + Input/Output +*/ +template +inline std::ostream& operator<<(std::ostream& os, const Vector& v) +{ + os << std::endl << v.size() << std::endl; + for (unsigned int i = 0; i < v.size() - 1; i++) + os << std::setw(20) << std::setprecision(16) << v[i] << ", "; + os << std::setw(20) << std::setprecision(16) << v[v.size() - 1] << std::endl; + + return os; +} + +template +std::istream& operator>>(std::istream& is, Vector& v) +{ + int elements; + char comma; + is >> elements; + v.resize(elements); + for (unsigned int i = 0; i < elements; i++) + is >> v[i] >> comma; + + return is; +} + +/** + Index utilities +*/ + +std::set seq(unsigned int s, unsigned int e); + +std::set singleton(unsigned int i); + +template +class CanonicalBaseVector : public Vector +{ +public: + CanonicalBaseVector(unsigned int i, unsigned int n); + inline void reset(unsigned int i); +private: + unsigned int e; +}; + +template +CanonicalBaseVector::CanonicalBaseVector(unsigned int i, unsigned int n) + : Vector((T)0, n), e(i) +{ (*this)[e] = (T)1; } + +template +inline void CanonicalBaseVector::reset(unsigned int i) +{ + (*this)[e] = (T)0; + e = i; + (*this)[e] = (T)1; +} + +#include + +template +inline T sum(const Vector& v) +{ + T tmp = (T)0; + for (unsigned int i = 0; i < v.size(); i++) + tmp += v[i]; + + return tmp; +} + +template +inline T prod(const Vector& v) +{ + T tmp = (T)1; + for (unsigned int i = 0; i < v.size(); i++) + tmp *= v[i]; + + return tmp; +} + +template +inline T mean(const Vector& v) +{ + T sum = (T)0; + for (unsigned int i = 0; i < v.size(); i++) + sum += v[i]; + return sum / v.size(); +} + +template +inline T median(const Vector& v) +{ + Vector tmp = sort(v); + if (v.size() % 2 == 1) // it is an odd-sized vector + return tmp[v.size() / 2]; + else + return 0.5 * (tmp[v.size() / 2 - 1] + tmp[v.size() / 2]); +} + +template +inline T stdev(const Vector& v, bool sample_correction = false) +{ + return sqrt(var(v, sample_correction)); +} + +template +inline T var(const Vector& v, bool sample_correction = false) +{ + T sum = (T)0, ssum = (T)0; + unsigned int n = v.size(); + for (unsigned int i = 0; i < n; i++) + { + sum += v[i]; + ssum += (v[i] * v[i]); + } + if (!sample_correction) + return (ssum / n) - (sum / n) * (sum / n); + else + return n * ((ssum / n) - (sum / n) * (sum / n)) / (n - 1); +} + +template +inline T max(const Vector& v) +{ + T value = v[0]; + for (unsigned int i = 1; i < v.size(); i++) + value = std::max(v[i], value); + + return value; +} + +template +inline T min(const Vector& v) +{ + T value = v[0]; + for (unsigned int i = 1; i < v.size(); i++) + value = std::min(v[i], value); + + return value; +} + +template +inline unsigned int index_max(const Vector& v) +{ + unsigned int max = 0; + for (unsigned int i = 1; i < v.size(); i++) + if (v[i] > v[max]) + max = i; + + return max; +} + +template +inline unsigned int index_min(const Vector& v) +{ + unsigned int min = 0; + for (unsigned int i = 1; i < v.size(); i++) + if (v[i] < v[min]) + min = i; + + return min; +} + + +template +inline T dot_prod(const Vector& a, const Vector& b) +{ + T sum = (T)0; + if (a.size() != b.size()) + throw std::logic_error("Dotprod error: the vectors are not the same size"); + for (unsigned int i = 0; i < a.size(); i++) + sum += a[i] * b[i]; + + return sum; +} + +/** + Single element mathematical functions +*/ + +template +inline Vector exp(const Vector& v) +{ + Vector tmp(v.size()); + for (unsigned int i = 0; i < v.size(); i++) + tmp[i] = exp(v[i]); + + return tmp; +} + +template +inline Vector log(const Vector& v) +{ + Vector tmp(v.size()); + for (unsigned int i = 0; i < v.size(); i++) + tmp[i] = log(v[i]); + + return tmp; +} + +template +inline Vector vec_sqrt(const Vector& v) +{ + Vector tmp(v.size()); + for (unsigned int i = 0; i < v.size(); i++) + tmp[i] = sqrt(v[i]); + + return tmp; +} + +template +inline Vector pow(const Vector& v, double a) +{ + Vector tmp(v.size()); + for (unsigned int i = 0; i < v.size(); i++) + tmp[i] = pow(v[i], a); + + return tmp; +} + +template +inline Vector abs(const Vector& v) +{ + Vector tmp(v.size()); + for (unsigned int i = 0; i < v.size(); i++) + tmp[i] = (T)fabs(v[i]); + + return tmp; +} + +template +inline Vector sign(const Vector& v) +{ + Vector tmp(v.size()); + for (unsigned int i = 0; i < v.size(); i++) + tmp[i] = v[i] > 0 ? +1 : v[i] == 0 ? 0 : -1; + + return tmp; +} + +template +inline unsigned int partition(Vector& v, unsigned int begin, unsigned int end) +{ + unsigned int i = begin + 1, j = begin + 1; + T pivot = v[begin]; + while (j <= end) + { + if (v[j] < pivot) { + std::swap(v[i], v[j]); + i++; + } + j++; + } + v[begin] = v[i - 1]; + v[i - 1] = pivot; + return i - 2; +} + + +template +inline void quicksort(Vector& v, unsigned int begin, unsigned int end) +{ + if (end > begin) + { + unsigned int index = partition(v, begin, end); + quicksort(v, begin, index); + quicksort(v, index + 2, end); + } +} + +template +inline Vector sort(const Vector& v) +{ + Vector tmp(v); + + quicksort(tmp, 0, tmp.size() - 1); + + return tmp; +} + +template +inline Vector rank(const Vector& v) +{ + Vector tmp(v); + Vector tmp_rank(0.0, v.size()); + + for (unsigned int i = 0; i < tmp.size(); i++) + { + unsigned int smaller = 0, equal = 0; + for (unsigned int j = 0; j < tmp.size(); j++) + if (i == j) + continue; + else + if (tmp[j] < tmp[i]) + smaller++; + else if (tmp[j] == tmp[i]) + equal++; + tmp_rank[i] = smaller + 1; + if (equal > 0) + { + for (unsigned int j = 1; j <= equal; j++) + tmp_rank[i] += smaller + 1 + j; + tmp_rank[i] /= (double)(equal + 1); + } + } + + return tmp_rank; +} + +//enum MType { DIAG }; + +template +class Matrix +{ +public: + Matrix(); // Default constructor + Matrix(const unsigned int n, const unsigned int m); // Construct a n x m matrix + Matrix(const T& a, const unsigned int n, const unsigned int m); // Initialize the content to constant a + Matrix(MType t, const T& a, const T& o, const unsigned int n, const unsigned int m); + Matrix(MType t, const Vector& v, const T& o, const unsigned int n, const unsigned int m); + Matrix(const T* a, const unsigned int n, const unsigned int m); // Initialize to array + Matrix(const Matrix& rhs); // Copy constructor + ~Matrix(); // destructor + + inline T* operator[](const unsigned int& i) { return v[i]; } // Subscripting: row i + inline const T* operator[](const unsigned int& i) const { return v[i]; }; // const subsctipting + + inline void resize(const unsigned int n, const unsigned int m); + inline void resize(const T& a, const unsigned int n, const unsigned int m); + + + inline Vector extractRow(const unsigned int i) const; + inline Vector extractColumn(const unsigned int j) const; + inline Vector extractDiag() const; + inline Matrix extractRows(const std::set& indexes) const; + inline Matrix extractColumns(const std::set& indexes) const; + inline Matrix extract(const std::set& r_indexes, const std::set& c_indexes) const; + + inline void set(const T* a, unsigned int n, unsigned int m); + inline void set(const std::set& r_indexes, const std::set& c_indexes, const Matrix& m); + inline void setRow(const unsigned int index, const Vector& v); + inline void setRow(const unsigned int index, const Matrix& v); + inline void setRows(const std::set& indexes, const Matrix& m); + inline void setColumn(const unsigned int index, const Vector& v); + inline void setColumn(const unsigned int index, const Matrix& v); + inline void setColumns(const std::set& indexes, const Matrix& m); + + + inline unsigned int nrows() const { return n; } // number of rows + inline unsigned int ncols() const { return m; } // number of columns + + inline Matrix& operator=(const Matrix& rhs); // Assignment operator + inline Matrix& operator=(const T& a); // Assign to every element value a + inline Matrix& operator+=(const Matrix& rhs); + inline Matrix& operator-=(const Matrix& rhs); + inline Matrix& operator*=(const Matrix& rhs); + inline Matrix& operator/=(const Matrix& rhs); + inline Matrix& operator^=(const Matrix& rhs); + inline Matrix& operator+=(const T& a); + inline Matrix& operator-=(const T& a); + inline Matrix& operator*=(const T& a); + inline Matrix& operator/=(const T& a); + inline Matrix& operator^=(const T& a); + inline operator Vector(); +private: + unsigned int n; // number of rows + unsigned int m; // number of columns + T **v; // storage for data +}; + +template +Matrix::Matrix() + : n(0), m(0), v(0) +{} + +template +Matrix::Matrix(unsigned int n, unsigned int m) + : v(new T*[n]) +{ + this->n = n; this->m = m; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; +} + +template +Matrix::Matrix(const T& a, unsigned int n, unsigned int m) + : v(new T*[n]) +{ + this->n = n; this->m = m; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = a; +} + +template +Matrix::Matrix(const T* a, unsigned int n, unsigned int m) + : v(new T*[n]) +{ + this->n = n; this->m = m; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = *a++; +} + +template +Matrix::Matrix(MType t, const T& a, const T& o, unsigned int n, unsigned int m) + : v(new T*[n]) +{ + this->n = n; this->m = m; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; + switch (t) + { + case DIAG: + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + if (i != j) + v[i][j] = o; + else + v[i][j] = a; + break; + default: + throw std::logic_error("Matrix type not supported"); + } +} + +template +Matrix::Matrix(MType t, const Vector& a, const T& o, unsigned int n, unsigned int m) + : v(new T*[n]) +{ + this->n = n; this->m = m; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; + switch (t) + { + case DIAG: + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + if (i != j) + v[i][j] = o; + else + v[i][j] = a[i]; + break; + default: + throw std::logic_error("Matrix type not supported"); + } +} + +template +Matrix::Matrix(const Matrix& rhs) + : v(new T*[rhs.n]) +{ + n = rhs.n; m = rhs.m; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = rhs[i][j]; +} + +template +Matrix::~Matrix() +{ + if (v != 0) { + delete[] (v[0]); + delete[] (v); + } +} + +template +inline Matrix& Matrix::operator=(const Matrix &rhs) +// postcondition: normal assignment via copying has been performed; +// if matrix and rhs were different sizes, matrix +// has been resized to match the size of rhs +{ + if (this != &rhs) + { + resize(rhs.n, rhs.m); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = rhs[i][j]; + } + return *this; +} + +template +inline Matrix& Matrix::operator=(const T& a) // assign a to every element +{ + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = a; + return *this; +} + + +template +inline void Matrix::resize(const unsigned int n, const unsigned int m) +{ + if (n == this->n && m == this->m) + return; + if (v != 0) + { + delete[] (v[0]); + delete[] (v); + } + this->n = n; this->m = m; + v = new T*[n]; + v[0] = new T[m * n]; + for (unsigned int i = 1; i < n; i++) + v[i] = v[i - 1] + m; +} + +template +inline void Matrix::resize(const T& a, const unsigned int n, const unsigned int m) +{ + resize(n, m); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = a; +} + + + +template +inline Vector Matrix::extractRow(const unsigned int i) const +{ + if (i >= n) + throw std::logic_error("Error in extractRow: trying to extract a row out of matrix bounds"); + Vector tmp(v[i], m); + + return tmp; +} + +template +inline Vector Matrix::extractColumn(const unsigned int j) const +{ + if (j >= m) + throw std::logic_error("Error in extractRow: trying to extract a row out of matrix bounds"); + Vector tmp(n); + + for (unsigned int i = 0; i < n; i++) + tmp[i] = v[i][j]; + + return tmp; +} + +template +inline Vector Matrix::extractDiag() const +{ + unsigned int d = std::min(n, m); + + Vector tmp(d); + + for (unsigned int i = 0; i < d; i++) + tmp[i] = v[i][i]; + + return tmp; + +} + +template +inline Matrix Matrix::extractRows(const std::set& indexes) const +{ + Matrix tmp(indexes.size(), m); + unsigned int i = 0; + + for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) + { + for (unsigned int j = 0; j < m; j++) + { + if (*el >= n) + throw std::logic_error("Error extracting rows: the indexes are out of matrix bounds"); + tmp[i][j] = v[*el][j]; + } + i++; + } + + return tmp; +} + +template +inline Matrix Matrix::extractColumns(const std::set& indexes) const +{ + Matrix tmp(n, indexes.size()); + unsigned int j = 0; + + for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) + { + for (unsigned int i = 0; i < n; i++) + { + if (*el >= m) + throw std::logic_error("Error extracting columns: the indexes are out of matrix bounds"); + tmp[i][j] = v[i][*el]; + } + j++; + } + + return tmp; +} + +template +inline Matrix Matrix::extract(const std::set& r_indexes, const std::set& c_indexes) const +{ + Matrix tmp(r_indexes.size(), c_indexes.size()); + unsigned int i = 0, j; + + for (std::set::const_iterator r_el = r_indexes.begin(); r_el != r_indexes.end(); r_el++) + { + if (*r_el >= n) + throw std::logic_error("Error extracting submatrix: the indexes are out of matrix bounds"); + j = 0; + for (std::set::const_iterator c_el = c_indexes.begin(); c_el != c_indexes.end(); c_el++) + { + if (*c_el >= m) + throw std::logic_error("Error extracting rows: the indexes are out of matrix bounds"); + tmp[i][j] = v[*r_el][*c_el]; + j++; + } + i++; + } + + return tmp; +} + +template +inline void Matrix::setRow(unsigned int i, const Vector& a) +{ + if (i >= n) + throw std::logic_error("Error in setRow: trying to set a row out of matrix bounds"); + if (this->m != a.size()) + throw std::logic_error("Error setting matrix row: ranges are not compatible"); + for (unsigned int j = 0; j < ncols(); j++) + v[i][j] = a[j]; +} + +template +inline void Matrix::setRow(unsigned int i, const Matrix& a) +{ + if (i >= n) + throw std::logic_error("Error in setRow: trying to set a row out of matrix bounds"); + if (this->m != a.ncols()) + throw std::logic_error("Error setting matrix column: ranges are not compatible"); + if (a.nrows() != 1) + throw std::logic_error("Error setting matrix column with a non-row matrix"); + for (unsigned int j = 0; j < ncols(); j++) + v[i][j] = a[0][j]; +} + +template +inline void Matrix::setRows(const std::set& indexes, const Matrix& m) +{ + unsigned int i = 0; + + if (indexes.size() != m.nrows() || this->m != m.ncols()) + throw std::logic_error("Error setting matrix rows: ranges are not compatible"); + for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) + { + for (unsigned int j = 0; j < ncols(); j++) + { + if (*el >= n) + throw std::logic_error("Error in setRows: trying to set a row out of matrix bounds"); + v[*el][j] = m[i][j]; + } + i++; + } +} + +template +inline void Matrix::setColumn(unsigned int j, const Vector& a) +{ + if (j >= m) + throw std::logic_error("Error in setColumn: trying to set a column out of matrix bounds"); + if (this->n != a.size()) + throw std::logic_error("Error setting matrix column: ranges are not compatible"); + for (unsigned int i = 0; i < nrows(); i++) + v[i][j] = a[i]; +} + +template +inline void Matrix::setColumn(unsigned int j, const Matrix& a) +{ + if (j >= m) + throw std::logic_error("Error in setColumn: trying to set a column out of matrix bounds"); + if (this->n != a.nrows()) + throw std::logic_error("Error setting matrix column: ranges are not compatible"); + if (a.ncols() != 1) + throw std::logic_error("Error setting matrix column with a non-column matrix"); + for (unsigned int i = 0; i < nrows(); i++) + v[i][j] = a[i][0]; +} + + +template +inline void Matrix::setColumns(const std::set& indexes, const Matrix& a) +{ + unsigned int j = 0; + + if (indexes.size() != a.ncols() || this->n != a.nrows()) + throw std::logic_error("Error setting matrix columns: ranges are not compatible"); + for (std::set::const_iterator el = indexes.begin(); el != indexes.end(); el++) + { + for (unsigned int i = 0; i < nrows(); i++) + { + if (*el >= m) + throw std::logic_error("Error in setColumns: trying to set a column out of matrix bounds"); + v[i][*el] = a[i][j]; + } + j++; + } +} + +template +inline void Matrix::set(const std::set& r_indexes, const std::set& c_indexes, const Matrix& a) +{ + unsigned int i = 0, j; + if (c_indexes.size() != a.ncols() || r_indexes.size() != a.nrows()) + throw std::logic_error("Error setting matrix elements: ranges are not compatible"); + + for (std::set::const_iterator r_el = r_indexes.begin(); r_el != r_indexes.end(); r_el++) + { + if (*r_el >= n) + throw std::logic_error("Error in set: trying to set a row out of matrix bounds"); + j = 0; + for (std::set::const_iterator c_el = c_indexes.begin(); c_el != c_indexes.end(); c_el++) + { + if (*c_el >= m) + throw std::logic_error("Error in set: trying to set a column out of matrix bounds"); + v[*r_el][*c_el] = a[i][j]; + j++; + } + i++; + } +} + +template +inline void Matrix::set(const T* a, unsigned int n, unsigned int m) +{ + if (this->n != n || this->m != m) + resize(n, m); + unsigned int k = 0; + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = a[k++]; +} + + +template +Matrix operator+(const Matrix& rhs) +{ + return rhs; +} + +template +Matrix operator+(const Matrix& lhs, const Matrix& rhs) +{ + if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) + throw std::logic_error("Operator+: matrices have different sizes"); + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] + rhs[i][j]; + + return tmp; +} + +template +Matrix operator+(const Matrix& lhs, const T& a) +{ + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] + a; + + return tmp; +} + +template +Matrix operator+(const T& a, const Matrix& rhs) +{ + Matrix tmp(rhs.nrows(), rhs.ncols()); + for (unsigned int i = 0; i < rhs.nrows(); i++) + for (unsigned int j = 0; j < rhs.ncols(); j++) + tmp[i][j] = a + rhs[i][j]; + + return tmp; +} + +template +inline Matrix& Matrix::operator+=(const Matrix& rhs) +{ + if (m != rhs.ncols() || n != rhs.nrows()) + throw std::logic_error("Operator+=: matrices have different sizes"); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] += rhs[i][j]; + + return *this; +} + +template +inline Matrix& Matrix::operator+=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] += a; + + return *this; +} + +template +Matrix operator-(const Matrix& rhs) +{ + return (T)(-1) * rhs; +} + +template +Matrix operator-(const Matrix& lhs, const Matrix& rhs) +{ + if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) + throw std::logic_error("Operator-: matrices have different sizes"); + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] - rhs[i][j]; + + return tmp; +} + +template +Matrix operator-(const Matrix& lhs, const T& a) +{ + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] - a; + + return tmp; +} + +template +Matrix operator-(const T& a, const Matrix& rhs) +{ + Matrix tmp(rhs.nrows(), rhs.ncols()); + for (unsigned int i = 0; i < rhs.nrows(); i++) + for (unsigned int j = 0; j < rhs.ncols(); j++) + tmp[i][j] = a - rhs[i][j]; + + return tmp; +} + +template +inline Matrix& Matrix::operator-=(const Matrix& rhs) +{ + if (m != rhs.ncols() || n != rhs.nrows()) + throw std::logic_error("Operator-=: matrices have different sizes"); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] -= rhs[i][j]; + + return *this; +} + +template +inline Matrix& Matrix::operator-=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] -= a; + + return *this; +} + +template +Matrix operator*(const Matrix& lhs, const Matrix& rhs) +{ + if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) + throw std::logic_error("Operator*: matrices have different sizes"); + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] * rhs[i][j]; + + return tmp; +} + +template +Matrix operator*(const Matrix& lhs, const T& a) +{ + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] * a; + + return tmp; +} + +template +Matrix operator*(const T& a, const Matrix& rhs) +{ + Matrix tmp(rhs.nrows(), rhs.ncols()); + for (unsigned int i = 0; i < rhs.nrows(); i++) + for (unsigned int j = 0; j < rhs.ncols(); j++) + tmp[i][j] = a * rhs[i][j]; + + return tmp; +} + +template +inline Matrix& Matrix::operator*=(const Matrix& rhs) +{ + if (m != rhs.ncols() || n != rhs.nrows()) + throw std::logic_error("Operator*=: matrices have different sizes"); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] *= rhs[i][j]; + + return *this; +} + +template +inline Matrix& Matrix::operator*=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] *= a; + + return *this; +} + +template +Matrix operator/(const Matrix& lhs, const Matrix& rhs) +{ + if (lhs.ncols() != rhs.ncols() || lhs.nrows() != rhs.nrows()) + throw std::logic_error("Operator+: matrices have different sizes"); + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] / rhs[i][j]; + + return tmp; +} + +template +Matrix operator/(const Matrix& lhs, const T& a) +{ + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = lhs[i][j] / a; + + return tmp; +} + +template +Matrix operator/(const T& a, const Matrix& rhs) +{ + Matrix tmp(rhs.nrows(), rhs.ncols()); + for (unsigned int i = 0; i < rhs.nrows(); i++) + for (unsigned int j = 0; j < rhs.ncols(); j++) + tmp[i][j] = a / rhs[i][j]; + + return tmp; +} + +template +inline Matrix& Matrix::operator/=(const Matrix& rhs) +{ + if (m != rhs.ncols() || n != rhs.nrows()) + throw std::logic_error("Operator+=: matrices have different sizes"); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] /= rhs[i][j]; + + return *this; +} + +template +inline Matrix& Matrix::operator/=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] /= a; + + return *this; +} + +template +Matrix operator^(const Matrix& lhs, const T& a) +{ + Matrix tmp(lhs.nrows(), lhs.ncols()); + for (unsigned int i = 0; i < lhs.nrows(); i++) + for (unsigned int j = 0; j < lhs.ncols(); j++) + tmp[i][j] = pow(lhs[i][j], a); + + return tmp; +} + +template +inline Matrix& Matrix::operator^=(const Matrix& rhs) +{ + if (m != rhs.ncols() || n != rhs.nrows()) + throw std::logic_error("Operator^=: matrices have different sizes"); + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = pow(v[i][j], rhs[i][j]); + + return *this; +} + + +template +inline Matrix& Matrix::operator^=(const T& a) +{ + for (unsigned int i = 0; i < n; i++) + for (unsigned int j = 0; j < m; j++) + v[i][j] = pow(v[i][j], a); + + return *this; +} + +template +inline Matrix::operator Vector() +{ + if (n > 1 && m > 1) + throw std::logic_error("Error matrix cast to vector: trying to cast a multi-dimensional matrix"); + if (n == 1) + return extractRow(0); + else + return extractColumn(0); +} + +template +inline bool operator==(const Matrix& a, const Matrix& b) +{ + if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) + throw std::logic_error("Matrices of different size are not confrontable"); + for (unsigned i = 0; i < a.nrows(); i++) + for (unsigned j = 0; j < a.ncols(); j++) + if (a[i][j] != b[i][j]) + return false; + return true; +} + +template +inline bool operator!=(const Matrix& a, const Matrix& b) +{ + if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) + throw std::logic_error("Matrices of different size are not confrontable"); + for (unsigned i = 0; i < a.nrows(); i++) + for (unsigned j = 0; j < a.ncols(); j++) + if (a[i][j] != b[i][j]) + return true; + return false; +} + + + +/** + Input/Output +*/ +template +std::ostream& operator<<(std::ostream& os, const Matrix& m) +{ + os << std::endl << m.nrows() << " " << m.ncols() << std::endl; + for (unsigned int i = 0; i < m.nrows(); i++) + { + for (unsigned int j = 0; j < m.ncols() - 1; j++) + os << std::setw(20) << std::setprecision(16) << m[i][j] << ", "; + os << std::setw(20) << std::setprecision(16) << m[i][m.ncols() - 1] << std::endl; + } + + return os; +} + +template +std::istream& operator>>(std::istream& is, Matrix& m) +{ + int rows, cols; + char comma; + is >> rows >> cols; + m.resize(rows, cols); + for (unsigned int i = 0; i < rows; i++) + for (unsigned int j = 0; j < cols; j++) + is >> m[i][j] >> comma; + + return is; +} + +template +T sign(const T& v) +{ + if (v >= (T)0.0) + return (T)1.0; + else + return (T)-1.0; +} + +template +T dist(const T& a, const T& b) +{ + T abs_a = (T)fabs(a), abs_b = (T)fabs(b); + if (abs_a > abs_b) + return abs_a * sqrt((T)1.0 + (abs_b / abs_a) * (abs_b / abs_a)); + else + return (abs_b == (T)0.0 ? (T)0.0 : abs_b * sqrt((T)1.0 + (abs_a / abs_b) * (abs_a / abs_b))); +} + +template +void svd(const Matrix& A, Matrix& U, Vector& W, Matrix& V) +{ + int m = A.nrows(), n = A.ncols(), i, j, k, l, jj, nm; + const unsigned int max_its = 30; + bool flag; + Vector rv1(n); + U = A; + W.resize(n); + V.resize(n, n); + T anorm, c, f, g, h, s, scale, x, y, z; + g = scale = anorm = (T)0.0; + + // Householder reduction to bidiagonal form + for (i = 0; i < n; i++) + { + l = i + 1; + rv1[i] = scale * g; + g = s = scale = (T)0.0; + if (i < m) + { + for (k = i; k < m; k++) + scale += fabs(U[k][i]); + if (scale != (T)0.0) + { + for (k = i; k < m; k++) + { + U[k][i] /= scale; + s += U[k][i] * U[k][i]; + } + f = U[i][i]; + g = -sign(f) * sqrt(s); + h = f * g - s; + U[i][i] = f - g; + for (j = l; j < n; j++) + { + s = (T)0.0; + for (k = i; k < m; k++) + s += U[k][i] * U[k][j]; + f = s / h; + for (k = i; k < m; k++) + U[k][j] += f * U[k][i]; + } + for (k = i; k < m; k++) + U[k][i] *= scale; + } + } + W[i] = scale * g; + g = s = scale = (T)0.0; + if (i < m && i != n - 1) + { + for (k = l; k < n; k++) + scale += fabs(U[i][k]); + if (scale != (T)0.0) + { + for (k = l; k < n; k++) + { + U[i][k] /= scale; + s += U[i][k] * U[i][k]; + } + f = U[i][l]; + g = -sign(f) * sqrt(s); + h = f * g - s; + U[i][l] = f - g; + for (k = l; k = 0; i--) + { + if (i < n - 1) + { + if (g != (T)0.0) + { + for (j = l; j < n; j++) + V[j][i] = (U[i][j] / U[i][l]) / g; + for (j = l; j < n; j++) + { + s = (T)0.0; + for (k = l; k < n; k++) + s += U[i][k] * V[k][j]; + for (k = l; k < n; k++) + V[k][j] += s * V[k][i]; + } + } + for (j = l; j < n; j++) + V[i][j] = V[j][i] = (T)0.0; + } + V[i][i] = (T)1.0; + g = rv1[i]; + l = i; + } + // Accumulation of left-hand transformations + for (i = std::min(m, n) - 1; i >= 0; i--) + { + l = i + 1; + g = W[i]; + for (j = l; j < n; j++) + U[i][j] = (T)0.0; + if (g != (T)0.0) + { + g = (T)1.0 / g; + for (j = l; j < n; j++) + { + s = (T)0.0; + for (k = l; k < m; k++) + s += U[k][i] * U[k][j]; + f = (s / U[i][i]) * g; + for (k = i; k < m; k++) + U[k][j] += f * U[k][i]; + } + for (j = i; j < m; j++) + U[j][i] *= g; + } + else + for (j = i; j < m; j++) + U[j][i] = (T)0.0; + U[i][i]++; + } + // Diagonalization of the bidiagonal form: loop over singular values, and over allowed iterations. + for (k = n - 1; k >= 0; k--) + { + for (unsigned int its = 0; its < max_its; its++) + { + flag = true; + for (l = k; l >= 0; l--) + { // Test for splitting + nm = l - 1; // Note that rV[0] is always zero + if ((T)(fabs(rv1[l]) + anorm) == anorm) + { + flag = false; + break; + } + if ((T)(fabs(W[nm]) + anorm) == anorm) + break; + } + if (flag) + { + // Cancellation of rv1[l], if l > 0 FIXME: it was l > 1 in NR + c = (T)0.0; + s = (T)1.0; + for (i = l; i <= k; i++) + { + f = s * rv1[i]; + rv1[i] *= c; + if ((T)(fabs(f) + anorm) == anorm) + break; + g = W[i]; + h = dist(f, g); + W[i] = h; + h = (T)1.0 / h; + c = g * h; + s = -f * h; + for (j = 0; j < m; j++) + { + y = U[j][nm]; + z = U[j][i]; + U[j][nm] = y * c + z * s; + U[j][i] = z * c - y * s; + } + } + } + z = W[k]; + if (l == k) + { // Convergence + if (z < (T)0.0) + { // Singular value is made nonnegative + W[k] = -z; + for (j = 0; j < n; j++) + V[j][k] = -V[j][k]; + } + break; + } + if (its == max_its) + throw std::logic_error("Error svd: no convergence in the maximum number of iterations"); + x = W[l]; + nm = k - 1; + y = W[nm]; + g = rv1[nm]; + h = rv1[k]; + f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y); + g = dist(f, (T)1.0); + f = ((x - z) * (x + z) + h * ((y / (f + sign(f)*fabs(g))) - h)) / x; + c = s = (T)1.0; // Next QR transformation + for (j = l; j <= nm; j++) + { + i = j + 1; + g = rv1[i]; + y = W[i]; + h = s * g; + g *= c; + z = dist(f, h); + rv1[j] = z; + c = f / z; + s = h / z; + f = x * c + g * s; + g = g * c - x * s; + h = y * s; + y *= c; + for (jj = 0; jj < n; jj++) + { + x = V[jj][j]; + z = V[jj][i]; + V[jj][j] = x * c + z * s; + V[jj][i] = z * c - x * s; + } + z = dist(f, h); + W[j] = z; + if (z != 0) // Rotation can be arbitrary if z = 0 + { + z = (T)1.0 / z; + c = f * z; + s = h * z; + } + f = c * g + s * y; + x = c * y - s * g; + for (jj = 0; jj < m; jj++) + { + y = U[jj][j]; + z = U[jj][i]; + U[jj][j] = y * c + z * s; + U[jj][i] = z * c - y * s; + } + } + rv1[l] = (T)0.0; + rv1[k] = f; + W[k] = x; + } + } +} + +template +Matrix pinv(const Matrix& A) +{ + Matrix U, V, x, tmp(A.ncols(), A.nrows()); + Vector W; + CanonicalBaseVector e(0, A.nrows()); + svd(A, U, W, V); + for (unsigned int i = 0; i < A.nrows(); i++) + { + e.reset(i); + tmp.setColumn(i, dot_prod(dot_prod(dot_prod(V, Matrix(DIAG, 1.0 / W, 0.0, W.size(), W.size())), t(U)), e)); + } + + return tmp; +} + +template +int lu(const Matrix& A, Matrix& LU, Vector& index) +{ + if (A.ncols() != A.nrows()) + throw std::logic_error("Error in LU decomposition: matrix must be squared"); + int i, p, j, k, n = A.ncols(), ex; + T val, tmp; + Vector d(n); + LU = A; + index.resize(n); + + ex = 1; + for (i = 0; i < n; i++) + { + index[i] = i; + val = (T)0.0; + for (j = 0; j < n; j++) + val = std::max(val, (T)fabs(LU[i][j])); + if (val == (T)0.0) + std::logic_error("Error in LU decomposition: matrix was singular"); + d[i] = val; + } + + for (k = 0; k < n - 1; k++) + { + p = k; + val = fabs(LU[k][k]) / d[k]; + for (i = k + 1; i < n; i++) + { + tmp = fabs(LU[i][k]) / d[i]; + if (tmp > val) + { + val = tmp; + p = i; + } + } + if (val == (T)0.0) + std::logic_error("Error in LU decomposition: matrix was singular"); + if (p > k) + { + ex = -ex; + std::swap(index[k], index[p]); + std::swap(d[k], d[p]); + for (j = 0; j < n; j++) + std::swap(LU[k][j], LU[p][j]); + } + + for (i = k + 1; i < n; i++) + { + LU[i][k] /= LU[k][k]; + for (j = k + 1; j < n; j++) + LU[i][j] -= LU[i][k] * LU[k][j]; + } + } + if (LU[n - 1][n - 1] == (T)0.0) + std::logic_error("Error in LU decomposition: matrix was singular"); + + return ex; +} + +template +Vector lu_solve(const Matrix& LU, const Vector& b, Vector& index) +{ + if (LU.ncols() != LU.nrows()) + throw std::logic_error("Error in LU solve: LU matrix should be squared"); + unsigned int n = LU.ncols(); + if (b.size() != n) + throw std::logic_error("Error in LU solve: b vector must be of the same dimensions of LU matrix"); + Vector x((T)0.0, n); + int i, j, p; + T sum; + + p = index[0]; + x[0] = b[p]; + + for (i = 1; i < n; i++) + { + sum = (T)0.0; + for (j = 0; j < i; j++) + sum += LU[i][j] * x[j]; + p = index[i]; + x[i] = b[p] - sum; + } + x[n - 1] /= LU[n - 1][n - 1]; + for (i = n - 2; i >= 0; i--) + { + sum = (T)0.0; + for (j = i + 1; j < n; j++) + sum += LU[i][j] * x[j]; + x[i] = (x[i] - sum) / LU[i][i]; + } + return x; +} + +template +void lu_solve(const Matrix& LU, Vector& x, const Vector& b, Vector& index) +{ + x = lu_solve(LU, b, index); +} + +template +Matrix lu_inverse(const Matrix& A) +{ + if (A.ncols() != A.nrows()) + throw std::logic_error("Error in LU invert: matrix must be squared"); + unsigned int n = A.ncols(); + Matrix A1(n, n), LU; + Vector index; + + lu(A, LU, index); + CanonicalBaseVector e(0, n); + for (unsigned i = 0; i < n; i++) + { + e.reset(i); + A1.setColumn(i, lu_solve(LU, e, index)); + } + + return A1; +} + +template +T lu_det(const Matrix& A) +{ + if (A.ncols() != A.nrows()) + throw std::logic_error("Error in LU determinant: matrix must be squared"); + unsigned int d; + Matrix LU; + Vector index; + + d = lu(A, LU, index); + + return d * prod(LU.extractDiag()); +} + +template +void cholesky(const Matrix A, Matrix& LL) +{ + if (A.ncols() != A.nrows()) + throw std::logic_error("Error in Cholesky decomposition: matrix must be squared"); + int n = A.ncols(); + double sum; + LL = A; + + for (unsigned int i = 0; i < n; i++) + { + for (unsigned int j = i; j < n; j++) + { + sum = LL[i][j]; + for (int k = i - 1; k >= 0; k--) + sum -= LL[i][k] * LL[j][k]; + if (i == j) + { + if (sum <= 0.0) + throw std::logic_error("Error in Cholesky decomposition: matrix is not postive definite"); + LL[i][i] = sqrt(sum); + } + else + LL[j][i] = sum / LL[i][i]; + } + for (unsigned int k = i + 1; k < n; k++) + LL[i][k] = LL[k][i]; + } +} + +template +Matrix cholesky(const Matrix A) +{ + Matrix LL; + cholesky(A, LL); + + return LL; +} + +template +Vector cholesky_solve(const Matrix& LL, const Vector& b) +{ + if (LL.ncols() != LL.nrows()) + throw std::logic_error("Error in Cholesky solve: matrix must be squared"); + unsigned int n = LL.ncols(); + if (b.size() != n) + throw std::logic_error("Error in Cholesky decomposition: b vector must be of the same dimensions of LU matrix"); + Vector x, y; + + /* Solve L * y = b */ + forward_elimination(LL, y, b); + /* Solve L^T * x = y */ + backward_elimination(LL, x, y); + + return x; +} + +template +void cholesky_solve(const Matrix& LL, Vector& x, const Vector& b) +{ + x = cholesky_solve(LL, b); +} + +template +void forward_elimination(const Matrix& L, Vector& y, const Vector b) +{ + if (L.ncols() != L.nrows()) + throw std::logic_error("Error in Forward elimination: matrix must be squared (lower triangular)"); + if (b.size() != L.nrows()) + throw std::logic_error("Error in Forward elimination: b vector must be of the same dimensions of L matrix"); + unsigned int n = b.size(); + y.resize(n); + + y[0] = b[0] / L[0][0]; + for (unsigned int i = 1; i < n; i++) + { + y[i] = b[i]; + for (unsigned int j = 0; j < i; j++) + y[i] -= L[i][j] * y[j]; + y[i] = y[i] / L[i][i]; + } +} + +template +Vector forward_elimination(const Matrix& L, const Vector b) +{ + Vector y; + forward_elimination(L, y, b); + + return y; +} + +template +void backward_elimination(const Matrix& U, Vector& x, const Vector& y) +{ + if (U.ncols() != U.nrows()) + throw std::logic_error("Error in Backward elimination: matrix must be squared (upper triangular)"); + if (y.size() != U.nrows()) + throw std::logic_error("Error in Backward elimination: b vector must be of the same dimensions of U matrix"); + int n = y.size(); + x.resize(n); + + x[n - 1] = y[n - 1] / U[n - 1][n - 1]; + for (int i = n - 2; i >= 0; i--) + { + x[i] = y[i]; + for (int j = i + 1; j < n; j++) + x[i] -= U[i][j] * x[j]; + x[i] = x[i] / U[i][i]; + } +} + +template +Vector backward_elimination(const Matrix& U, const Vector y) +{ + Vector x; + forward_elimination(U, x, y); + + return x; +} + +/* Setting default linear systems machinery */ + +// #define det lu_det +// #define inverse lu_inverse +// #define solve lu_solve + +/* Random */ + +template +void random(Matrix& m) +{ + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + m[i][j] = (T)(rand() / double(RAND_MAX)); +} + +/** + Aggregate functions +*/ + +template +Vector sum(const Matrix& m) +{ + Vector tmp((T)0, m.ncols()); + for (unsigned int j = 0; j < m.ncols(); j++) + for (unsigned int i = 0; i < m.nrows(); i++) + tmp[j] += m[i][j]; + return tmp; +} + +template +Vector r_sum(const Matrix& m) +{ + Vector tmp((T)0, m.nrows()); + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp[i] += m[i][j]; + return tmp; +} + +template +T all_sum(const Matrix& m) +{ + T tmp = (T)0; + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp += m[i][j]; + return tmp; +} + +template +Vector prod(const Matrix& m) +{ + Vector tmp((T)1, m.ncols()); + for (unsigned int j = 0; j < m.ncols(); j++) + for (unsigned int i = 0; i < m.nrows(); i++) + tmp[j] *= m[i][j]; + return tmp; +} + +template +Vector r_prod(const Matrix& m) +{ + Vector tmp((T)1, m.nrows()); + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp[i] *= m[i][j]; + return tmp; +} + +template +T all_prod(const Matrix& m) +{ + T tmp = (T)1; + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp *= m[i][j]; + return tmp; +} + +template +Vector mean(const Matrix& m) +{ + Vector res((T)0, m.ncols()); + for (unsigned int j = 0; j < m.ncols(); j++) + { + for (unsigned int i = 0; i < m.nrows(); i++) + res[j] += m[i][j]; + res[j] /= m.nrows(); + } + + return res; +} + +template +Vector r_mean(const Matrix& m) +{ + Vector res((T)0, m.rows()); + for (unsigned int i = 0; i < m.nrows(); i++) + { + for (unsigned int j = 0; j < m.ncols(); j++) + res[i] += m[i][j]; + res[i] /= m.nrows(); + } + + return res; +} + +template +T all_mean(const Matrix& m) +{ + T tmp = (T)0; + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp += m[i][j]; + return tmp / (m.nrows() * m.ncols()); +} + +template +Vector var(const Matrix& m, bool sample_correction = false) +{ + Vector res((T)0, m.ncols()); + unsigned int n = m.nrows(); + double sum, ssum; + for (unsigned int j = 0; j < m.ncols(); j++) + { + sum = (T)0.0; ssum = (T)0.0; + for (unsigned int i = 0; i < m.nrows(); i++) + { + sum += m[i][j]; + ssum += (m[i][j] * m[i][j]); + } + if (!sample_correction) + res[j] = (ssum / n) - (sum / n) * (sum / n); + else + res[j] = n * ((ssum / n) - (sum / n) * (sum / n)) / (n - 1); + } + + return res; +} + +template +Vector stdev(const Matrix& m, bool sample_correction = false) +{ + return vec_sqrt(var(m, sample_correction)); +} + +template +Vector r_var(const Matrix& m, bool sample_correction = false) +{ + Vector res((T)0, m.nrows()); + double sum, ssum; + unsigned int n = m.ncols(); + for (unsigned int i = 0; i < m.nrows(); i++) + { + sum = 0.0; ssum = 0.0; + for (unsigned int j = 0; j < m.ncols(); j++) + { + sum += m[i][j]; + ssum += (m[i][j] * m[i][j]); + } + if (!sample_correction) + res[i] = (ssum / n) - (sum / n) * (sum / n); + else + res[i] = n * ((ssum / n) - (sum / n) * (sum / n)) / (n - 1); + } + + return res; +} + +template +Vector r_stdev(const Matrix& m, bool sample_correction = false) +{ + return vec_sqrt(r_var(m, sample_correction)); +} + +template +Vector max(const Matrix& m) +{ + Vector res(m.ncols()); + double value; + for (unsigned int j = 0; j < m.ncols(); j++) + { + value = m[0][j]; + for (unsigned int i = 1; i < m.nrows(); i++) + value = std::max(m[i][j], value); + res[j] = value; + } + + return res; +} + +template +Vector r_max(const Matrix& m) +{ + Vector res(m.nrows()); + double value; + for (unsigned int i = 0; i < m.nrows(); i++) + { + value = m[i][0]; + for (unsigned int j = 1; j < m.ncols(); j++) + value = std::max(m[i][j], value); + res[i] = value; + } + + return res; +} + +template +Vector min(const Matrix& m) +{ + Vector res(m.ncols()); + double value; + for (unsigned int j = 0; j < m.ncols(); j++) + { + value = m[0][j]; + for (unsigned int i = 1; i < m.nrows(); i++) + value = std::min(m[i][j], value); + res[j] = value; + } + + return res; +} + +template +Vector r_min(const Matrix& m) +{ + Vector res(m.nrows()); + double value; + for (unsigned int i = 0; i < m.nrows(); i++) + { + value = m[i][0]; + for (unsigned int j = 1; j < m.ncols(); j++) + value = std::min(m[i][j], value); + res[i] = value; + } + + return res; +} + + + +/** + Single element mathematical functions +*/ + +template +Matrix exp(const Matrix&m) +{ + Matrix tmp(m.nrows(), m.ncols()); + + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp[i][j] = exp(m[i][j]); + + return tmp; +} + +template +Matrix mat_sqrt(const Matrix&m) +{ + Matrix tmp(m.nrows(), m.ncols()); + + for (unsigned int i = 0; i < m.nrows(); i++) + for (unsigned int j = 0; j < m.ncols(); j++) + tmp[i][j] = sqrt(m[i][j]); + + return tmp; +} + +/** + Matrix operators +*/ + +template +Matrix kron(const Vector& b, const Vector& a) +{ + Matrix tmp(b.size(), a.size()); + for (unsigned int i = 0; i < b.size(); i++) + for (unsigned int j = 0; j < a.size(); j++) + tmp[i][j] = a[j] * b[i]; + + return tmp; +} + +template +Matrix t(const Matrix& a) +{ + Matrix tmp(a.ncols(), a.nrows()); + for (unsigned int i = 0; i < a.nrows(); i++) + for (unsigned int j = 0; j < a.ncols(); j++) + tmp[j][i] = a[i][j]; + + return tmp; +} + +template +Matrix dot_prod(const Matrix& a, const Matrix& b) +{ + if (a.ncols() != b.nrows()) + throw std::logic_error("Error matrix dot product: dimensions of the matrices are not compatible"); + Matrix tmp(a.nrows(), b.ncols()); + for (unsigned int i = 0; i < tmp.nrows(); i++) + for (unsigned int j = 0; j < tmp.ncols(); j++) + { + tmp[i][j] = (T)0; + for (unsigned int k = 0; k < a.ncols(); k++) + tmp[i][j] += a[i][k] * b[k][j]; + } + + return tmp; +} + +template +Matrix dot_prod(const Matrix& a, const Vector& b) +{ + if (a.ncols() != b.size()) + throw std::logic_error("Error matrix dot product: dimensions of the matrix and the vector are not compatible"); + Matrix tmp(a.nrows(), 1); + for (unsigned int i = 0; i < tmp.nrows(); i++) + { + tmp[i][0] = (T)0; + for (unsigned int k = 0; k < a.ncols(); k++) + tmp[i][0] += a[i][k] * b[k]; + } + + return tmp; +} + +template +Matrix dot_prod(const Vector& a, const Matrix& b) +{ + if (a.size() != b.nrows()) + throw std::logic_error("Error matrix dot product: dimensions of the vector and matrix are not compatible"); + Matrix tmp(1, b.ncols()); + for (unsigned int j = 0; j < tmp.ncols(); j++) + { + tmp[0][j] = (T)0; + for (unsigned int k = 0; k < a.size(); k++) + tmp[0][j] += a[k] * b[k][j]; + } + + return tmp; +} + +template +inline Matrix rank(const Matrix m) +{ + Matrix tmp(m.nrows(), m.ncols()); + for (unsigned int j = 0; j < m.ncols(); j++) + tmp.setColumn(j, rank(m.extractColumn(j))); + + return tmp; +} + +template +inline Matrix r_rank(const Matrix m) +{ + Matrix tmp(m.nrows(), m.ncols()); + for (unsigned int i = 0; i < m.nrows(); i++) + tmp.setRow(i, rank(m.extractRow(i))); + + return tmp; +} + +} // namespace quadprogpp + +#endif // define _ARRAY_HH_ diff --git a/include/thirdparty/quadProgpp/QuadProg++.hh b/include/thirdparty/quadProgpp/QuadProg++.hh old mode 100644 new mode 100755 index c2954d4..88660e1 --- a/include/thirdparty/quadProgpp/QuadProg++.hh +++ b/include/thirdparty/quadProgpp/QuadProg++.hh @@ -1,77 +1,77 @@ -/* - File $Id: QuadProg++.hh 232 2007-06-21 12:29:00Z digasper $ - - The quadprog_solve() function implements the algorithm of Goldfarb and Idnani - for the solution of a (convex) Quadratic Programming problem - by means of an active-set dual method. - -The problem is in the form: - -min 0.5 * x G x + g0 x -s.t. - CE^T x + ce0 = 0 - CI^T x + ci0 >= 0 - - The matrix and vectors dimensions are as follows: - G: n * n - g0: n - - CE: n * p - ce0: p - - CI: n * m - ci0: m - - x: n - - The function will return the cost of the solution written in the x vector or - std::numeric_limits::infinity() if the problem is infeasible. In the latter case - the value of the x vector is not correct. - - References: D. Goldfarb, A. Idnani. A numerically stable dual method for solving - strictly convex quadratic programs. Mathematical Programming 27 (1983) pp. 1-33. - - Notes: - 1. pay attention in setting up the vectors ce0 and ci0. - If the constraints of your problem are specified in the form - A^T x = b and C^T x >= d, then you should set ce0 = -b and ci0 = -d. - 2. The matrices have column dimension equal to MATRIX_DIM, - a constant set to 20 in this file (by means of a #define macro). - If the matrices are bigger than 20 x 20 the limit could be - increased by means of a -DMATRIX_DIM=n on the compiler command line. - 3. The matrix G is modified within the function since it is used to compute - the G = L^T L cholesky factorization for further computations inside the function. - If you need the original matrix G you should make a copy of it and pass the copy - to the function. - - Author: Luca Di Gaspero - DIEGM - University of Udine, Italy - luca.digaspero@uniud.it - http://www.diegm.uniud.it/digaspero/ - - The author will be grateful if the researchers using this software will - acknowledge the contribution of this function in their research papers. - - Copyright (c) 2007-2016 Luca Di Gaspero - - This software may be modified and distributed under the terms - of the MIT license. See the LICENSE file for details. -*/ - - -#ifndef _QUADPROGPP -#define _QUADPROGPP - -#include "thirdparty/quadProgpp/Array.hh" -#include - -namespace quadprogpp { - -double solve_quadprog(Matrix& G, Vector& g0, - const Matrix& CE, const Vector& ce0, - const Matrix& CI, const Vector& ci0, - Vector& x); - -} // namespace quadprogpp - -#endif // #define _QUADPROGPP +/* + File $Id: QuadProg++.hh 232 2007-06-21 12:29:00Z digasper $ + + The quadprog_solve() function implements the algorithm of Goldfarb and Idnani + for the solution of a (convex) Quadratic Programming problem + by means of an active-set dual method. + +The problem is in the form: + +min 0.5 * x G x + g0 x +s.t. + CE^T x + ce0 = 0 + CI^T x + ci0 >= 0 + + The matrix and vectors dimensions are as follows: + G: n * n + g0: n + + CE: n * p + ce0: p + + CI: n * m + ci0: m + + x: n + + The function will return the cost of the solution written in the x vector or + std::numeric_limits::infinity() if the problem is infeasible. In the latter case + the value of the x vector is not correct. + + References: D. Goldfarb, A. Idnani. A numerically stable dual method for solving + strictly convex quadratic programs. Mathematical Programming 27 (1983) pp. 1-33. + + Notes: + 1. pay attention in setting up the vectors ce0 and ci0. + If the constraints of your problem are specified in the form + A^T x = b and C^T x >= d, then you should set ce0 = -b and ci0 = -d. + 2. The matrices have column dimension equal to MATRIX_DIM, + a constant set to 20 in this file (by means of a #define macro). + If the matrices are bigger than 20 x 20 the limit could be + increased by means of a -DMATRIX_DIM=n on the compiler command line. + 3. The matrix G is modified within the function since it is used to compute + the G = L^T L cholesky factorization for further computations inside the function. + If you need the original matrix G you should make a copy of it and pass the copy + to the function. + + Author: Luca Di Gaspero + DIEGM - University of Udine, Italy + luca.digaspero@uniud.it + http://www.diegm.uniud.it/digaspero/ + + The author will be grateful if the researchers using this software will + acknowledge the contribution of this function in their research papers. + + Copyright (c) 2007-2016 Luca Di Gaspero + + This software may be modified and distributed under the terms + of the MIT license. See the LICENSE file for details. +*/ + + +#ifndef _QUADPROGPP +#define _QUADPROGPP + +#include "thirdparty/quadProgpp/Array.hh" +#include + +namespace quadprogpp { + +double solve_quadprog(Matrix& G, Vector& g0, + const Matrix& CE, const Vector& ce0, + const Matrix& CI, const Vector& ci0, + Vector& x); + +} // namespace quadprogpp + +#endif // #define _QUADPROGPP diff --git a/include/thirdparty/tinyxml/tinystr.h b/include/thirdparty/tinyxml/tinystr.h index 89cca33..c3cac34 100644 --- a/include/thirdparty/tinyxml/tinystr.h +++ b/include/thirdparty/tinyxml/tinystr.h @@ -1,305 +1,305 @@ -/* -www.sourceforge.net/projects/tinyxml - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - - -#ifndef TIXML_USE_STL - -#ifndef TIXML_STRING_INCLUDED -#define TIXML_STRING_INCLUDED - -#include -#include - -/* The support for explicit isn't that universal, and it isn't really - required - it is used to check that the TiXmlString class isn't incorrectly - used. Be nice to old compilers and macro it here: -*/ -#if defined(_MSC_VER) && (_MSC_VER >= 1200 ) - // Microsoft visual studio, version 6 and higher. - #define TIXML_EXPLICIT explicit -#elif defined(__GNUC__) && (__GNUC__ >= 3 ) - // GCC version 3 and higher.s - #define TIXML_EXPLICIT explicit -#else - #define TIXML_EXPLICIT -#endif - - -/* - TiXmlString is an emulation of a subset of the std::string template. - Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. - Only the member functions relevant to the TinyXML project have been implemented. - The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase - a string and there's no more room, we allocate a buffer twice as big as we need. -*/ -class TiXmlString -{ - public : - // The size type used - typedef size_t size_type; - - // Error value for find primitive - static const size_type npos; // = -1; - - - // TiXmlString empty constructor - TiXmlString () : rep_(&nullrep_) - { - } - - // TiXmlString copy constructor - TiXmlString ( const TiXmlString & copy) : rep_(0) - { - init(copy.length()); - memcpy(start(), copy.data(), length()); - } - - // TiXmlString constructor, based on a string - TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) - { - init( static_cast( strlen(copy) )); - memcpy(start(), copy, length()); - } - - // TiXmlString constructor, based on a string - TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) - { - init(len); - memcpy(start(), str, len); - } - - // TiXmlString destructor - ~TiXmlString () - { - quit(); - } - - TiXmlString& operator = (const char * copy) - { - return assign( copy, (size_type)strlen(copy)); - } - - TiXmlString& operator = (const TiXmlString & copy) - { - return assign(copy.start(), copy.length()); - } - - - // += operator. Maps to append - TiXmlString& operator += (const char * suffix) - { - return append(suffix, static_cast( strlen(suffix) )); - } - - // += operator. Maps to append - TiXmlString& operator += (char single) - { - return append(&single, 1); - } - - // += operator. Maps to append - TiXmlString& operator += (const TiXmlString & suffix) - { - return append(suffix.data(), suffix.length()); - } - - - // Convert a TiXmlString into a null-terminated char * - const char * c_str () const { return rep_->str; } - - // Convert a TiXmlString into a char * (need not be null terminated). - const char * data () const { return rep_->str; } - - // Return the length of a TiXmlString - size_type length () const { return rep_->size; } - - // Alias for length() - size_type size () const { return rep_->size; } - - // Checks if a TiXmlString is empty - bool empty () const { return rep_->size == 0; } - - // Return capacity of string - size_type capacity () const { return rep_->capacity; } - - - // single char extraction - const char& at (size_type index) const - { - assert( index < length() ); - return rep_->str[ index ]; - } - - // [] operator - char& operator [] (size_type index) const - { - assert( index < length() ); - return rep_->str[ index ]; - } - - // find a char in a string. Return TiXmlString::npos if not found - size_type find (char lookup) const - { - return find(lookup, 0); - } - - // find a char in a string from an offset. Return TiXmlString::npos if not found - size_type find (char tofind, size_type offset) const - { - if (offset >= length()) return npos; - - for (const char* p = c_str() + offset; *p != '\0'; ++p) - { - if (*p == tofind) return static_cast< size_type >( p - c_str() ); - } - return npos; - } - - void clear () - { - //Lee: - //The original was just too strange, though correct: - // TiXmlString().swap(*this); - //Instead use the quit & re-init: - quit(); - init(0,0); - } - - /* Function to reserve a big amount of data when we know we'll need it. Be aware that this - function DOES NOT clear the content of the TiXmlString if any exists. - */ - void reserve (size_type cap); - - TiXmlString& assign (const char* str, size_type len); - - TiXmlString& append (const char* str, size_type len); - - void swap (TiXmlString& other) - { - Rep* r = rep_; - rep_ = other.rep_; - other.rep_ = r; - } - - private: - - void init(size_type sz) { init(sz, sz); } - void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } - char* start() const { return rep_->str; } - char* finish() const { return rep_->str + rep_->size; } - - struct Rep - { - size_type size, capacity; - char str[1]; - }; - - void init(size_type sz, size_type cap) - { - if (cap) - { - // Lee: the original form: - // rep_ = static_cast(operator new(sizeof(Rep) + cap)); - // doesn't work in some cases of new being overloaded. Switching - // to the normal allocation, although use an 'int' for systems - // that are overly picky about structure alignment. - const size_type bytesNeeded = sizeof(Rep) + cap; - const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); - rep_ = reinterpret_cast( new int[ intsNeeded ] ); - - rep_->str[ rep_->size = sz ] = '\0'; - rep_->capacity = cap; - } - else - { - rep_ = &nullrep_; - } - } - - void quit() - { - if (rep_ != &nullrep_) - { - // The rep_ is really an array of ints. (see the allocator, above). - // Cast it back before delete, so the compiler won't incorrectly call destructors. - delete [] ( reinterpret_cast( rep_ ) ); - } - } - - Rep * rep_; - static Rep nullrep_; - -} ; - - -inline bool operator == (const TiXmlString & a, const TiXmlString & b) -{ - return ( a.length() == b.length() ) // optimization on some platforms - && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare -} -inline bool operator < (const TiXmlString & a, const TiXmlString & b) -{ - return strcmp(a.c_str(), b.c_str()) < 0; -} - -inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } -inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } -inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } -inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } - -inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } -inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } -inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } -inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } - -TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); -TiXmlString operator + (const TiXmlString & a, const char* b); -TiXmlString operator + (const char* a, const TiXmlString & b); - - -/* - TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. - Only the operators that we need for TinyXML have been developped. -*/ -class TiXmlOutStream : public TiXmlString -{ -public : - - // TiXmlOutStream << operator. - TiXmlOutStream & operator << (const TiXmlString & in) - { - *this += in; - return *this; - } - - // TiXmlOutStream << operator. - TiXmlOutStream & operator << (const char * in) - { - *this += in; - return *this; - } - -} ; - -#endif // TIXML_STRING_INCLUDED -#endif // TIXML_USE_STL +/* +www.sourceforge.net/projects/tinyxml + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#ifndef TIXML_USE_STL + +#ifndef TIXML_STRING_INCLUDED +#define TIXML_STRING_INCLUDED + +#include +#include + +/* The support for explicit isn't that universal, and it isn't really + required - it is used to check that the TiXmlString class isn't incorrectly + used. Be nice to old compilers and macro it here: +*/ +#if defined(_MSC_VER) && (_MSC_VER >= 1200 ) + // Microsoft visual studio, version 6 and higher. + #define TIXML_EXPLICIT explicit +#elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + #define TIXML_EXPLICIT explicit +#else + #define TIXML_EXPLICIT +#endif + + +/* + TiXmlString is an emulation of a subset of the std::string template. + Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. + Only the member functions relevant to the TinyXML project have been implemented. + The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase + a string and there's no more room, we allocate a buffer twice as big as we need. +*/ +class TiXmlString +{ + public : + // The size type used + typedef size_t size_type; + + // Error value for find primitive + static const size_type npos; // = -1; + + + // TiXmlString empty constructor + TiXmlString () : rep_(&nullrep_) + { + } + + // TiXmlString copy constructor + TiXmlString ( const TiXmlString & copy) : rep_(0) + { + init(copy.length()); + memcpy(start(), copy.data(), length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) + { + init( static_cast( strlen(copy) )); + memcpy(start(), copy, length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) + { + init(len); + memcpy(start(), str, len); + } + + // TiXmlString destructor + ~TiXmlString () + { + quit(); + } + + TiXmlString& operator = (const char * copy) + { + return assign( copy, (size_type)strlen(copy)); + } + + TiXmlString& operator = (const TiXmlString & copy) + { + return assign(copy.start(), copy.length()); + } + + + // += operator. Maps to append + TiXmlString& operator += (const char * suffix) + { + return append(suffix, static_cast( strlen(suffix) )); + } + + // += operator. Maps to append + TiXmlString& operator += (char single) + { + return append(&single, 1); + } + + // += operator. Maps to append + TiXmlString& operator += (const TiXmlString & suffix) + { + return append(suffix.data(), suffix.length()); + } + + + // Convert a TiXmlString into a null-terminated char * + const char * c_str () const { return rep_->str; } + + // Convert a TiXmlString into a char * (need not be null terminated). + const char * data () const { return rep_->str; } + + // Return the length of a TiXmlString + size_type length () const { return rep_->size; } + + // Alias for length() + size_type size () const { return rep_->size; } + + // Checks if a TiXmlString is empty + bool empty () const { return rep_->size == 0; } + + // Return capacity of string + size_type capacity () const { return rep_->capacity; } + + + // single char extraction + const char& at (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // [] operator + char& operator [] (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // find a char in a string. Return TiXmlString::npos if not found + size_type find (char lookup) const + { + return find(lookup, 0); + } + + // find a char in a string from an offset. Return TiXmlString::npos if not found + size_type find (char tofind, size_type offset) const + { + if (offset >= length()) return npos; + + for (const char* p = c_str() + offset; *p != '\0'; ++p) + { + if (*p == tofind) return static_cast< size_type >( p - c_str() ); + } + return npos; + } + + void clear () + { + //Lee: + //The original was just too strange, though correct: + // TiXmlString().swap(*this); + //Instead use the quit & re-init: + quit(); + init(0,0); + } + + /* Function to reserve a big amount of data when we know we'll need it. Be aware that this + function DOES NOT clear the content of the TiXmlString if any exists. + */ + void reserve (size_type cap); + + TiXmlString& assign (const char* str, size_type len); + + TiXmlString& append (const char* str, size_type len); + + void swap (TiXmlString& other) + { + Rep* r = rep_; + rep_ = other.rep_; + other.rep_ = r; + } + + private: + + void init(size_type sz) { init(sz, sz); } + void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } + char* start() const { return rep_->str; } + char* finish() const { return rep_->str + rep_->size; } + + struct Rep + { + size_type size, capacity; + char str[1]; + }; + + void init(size_type sz, size_type cap) + { + if (cap) + { + // Lee: the original form: + // rep_ = static_cast(operator new(sizeof(Rep) + cap)); + // doesn't work in some cases of new being overloaded. Switching + // to the normal allocation, although use an 'int' for systems + // that are overly picky about structure alignment. + const size_type bytesNeeded = sizeof(Rep) + cap; + const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); + rep_ = reinterpret_cast( new int[ intsNeeded ] ); + + rep_->str[ rep_->size = sz ] = '\0'; + rep_->capacity = cap; + } + else + { + rep_ = &nullrep_; + } + } + + void quit() + { + if (rep_ != &nullrep_) + { + // The rep_ is really an array of ints. (see the allocator, above). + // Cast it back before delete, so the compiler won't incorrectly call destructors. + delete [] ( reinterpret_cast( rep_ ) ); + } + } + + Rep * rep_; + static Rep nullrep_; + +} ; + + +inline bool operator == (const TiXmlString & a, const TiXmlString & b) +{ + return ( a.length() == b.length() ) // optimization on some platforms + && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare +} +inline bool operator < (const TiXmlString & a, const TiXmlString & b) +{ + return strcmp(a.c_str(), b.c_str()) < 0; +} + +inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } +inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } +inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } +inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } + +inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } +inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } +inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } +inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); +TiXmlString operator + (const TiXmlString & a, const char* b); +TiXmlString operator + (const char* a, const TiXmlString & b); + + +/* + TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. + Only the operators that we need for TinyXML have been developped. +*/ +class TiXmlOutStream : public TiXmlString +{ +public : + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const TiXmlString & in) + { + *this += in; + return *this; + } + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const char * in) + { + *this += in; + return *this; + } + +} ; + +#endif // TIXML_STRING_INCLUDED +#endif // TIXML_USE_STL diff --git a/include/thirdparty/tinyxml/tinyxml.h b/include/thirdparty/tinyxml/tinyxml.h index a3589e5..d051548 100644 --- a/include/thirdparty/tinyxml/tinyxml.h +++ b/include/thirdparty/tinyxml/tinyxml.h @@ -1,1805 +1,1805 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code by Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - - -#ifndef TINYXML_INCLUDED -#define TINYXML_INCLUDED - -#ifdef _MSC_VER -#pragma warning( push ) -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include -#include -#include -#include -#include - -// Help out windows: -#if defined( _DEBUG ) && !defined( DEBUG ) -#define DEBUG -#endif - -#ifdef TIXML_USE_STL - #include - #include - #include - #define TIXML_STRING std::string -#else - #include "tinystr.h" - #define TIXML_STRING TiXmlString -#endif - -// Deprecated library function hell. Compilers want to use the -// new safe versions. This probably doesn't fully address the problem, -// but it gets closer. There are too many compilers for me to fully -// test. If you get compilation troubles, undefine TIXML_SAFE -#define TIXML_SAFE - -#ifdef TIXML_SAFE - #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) - // Microsoft visual studio, version 2005 and higher. - #define TIXML_SNPRINTF _snprintf_s - #define TIXML_SSCANF sscanf_s - #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) - // Microsoft visual studio, version 6 and higher. - //#pragma message( "Using _sn* functions." ) - #define TIXML_SNPRINTF _snprintf - #define TIXML_SSCANF sscanf - #elif defined(__GNUC__) && (__GNUC__ >= 3 ) - // GCC version 3 and higher.s - //#warning( "Using sn* functions." ) - #define TIXML_SNPRINTF snprintf - #define TIXML_SSCANF sscanf - #else - #define TIXML_SNPRINTF snprintf - #define TIXML_SSCANF sscanf - #endif -#endif - -class TiXmlDocument; -class TiXmlElement; -class TiXmlComment; -class TiXmlUnknown; -class TiXmlAttribute; -class TiXmlText; -class TiXmlDeclaration; -class TiXmlParsingData; - -const int TIXML_MAJOR_VERSION = 2; -const int TIXML_MINOR_VERSION = 6; -const int TIXML_PATCH_VERSION = 2; - -/* Internal structure for tracking location of items - in the XML file. -*/ -struct TiXmlCursor -{ - TiXmlCursor() { Clear(); } - void Clear() { row = col = -1; } - - int row; // 0 based. - int col; // 0 based. -}; - - -/** - Implements the interface to the "Visitor pattern" (see the Accept() method.) - If you call the Accept() method, it requires being passed a TiXmlVisitor - class to handle callbacks. For nodes that contain other nodes (Document, Element) - you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves - are simply called with Visit(). - - If you return 'true' from a Visit method, recursive parsing will continue. If you return - false, no children of this node or its sibilings will be Visited. - - All flavors of Visit methods have a default implementation that returns 'true' (continue - visiting). You need to only override methods that are interesting to you. - - Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. - - You should never change the document from a callback. - - @sa TiXmlNode::Accept() -*/ -class TiXmlVisitor -{ -public: - virtual ~TiXmlVisitor() {} - - /// Visit a document. - virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } - /// Visit a document. - virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } - - /// Visit an element. - virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } - /// Visit an element. - virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } - - /// Visit a declaration - virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } - /// Visit a text node - virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } - /// Visit a comment node - virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } - /// Visit an unknown node - virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } -}; - -// Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE -}; - - -// Used by the parsing routines. -enum TiXmlEncoding -{ - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY -}; - -const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; - -/** TiXmlBase is a base class for every class in TinyXml. - It does little except to establish that TinyXml classes - can be printed and provide some utility functions. - - In XML, the document and elements can contain - other elements and other types of nodes. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - A Decleration contains: Attributes (not on tree) - @endverbatim -*/ -class TiXmlBase -{ - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; - -public: - TiXmlBase() : userData(0) {} - virtual ~TiXmlBase() {} - - /** All TinyXml classes can print themselves to a filestream - or the string class (TiXmlString in non-STL mode, std::string - in STL mode.) Either or both cfile and str can be null. - - This is a formatted print, and will insert - tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - value is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const { return location.row + 1; } - int Column() const { return location.col + 1; } ///< See Row() - - void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. - void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. - const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - - /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, - or they will be transformed into entities! - */ - static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - TIXML_ERROR_PARSING_CDATA, - TIXML_ERROR_DOCUMENT_TOP_ONLY, - - TIXML_ERROR_STRING_COUNT - }; - -protected: - - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } - inline static bool IsWhiteSpace( int c ) - { - if ( c < 256 ) - return IsWhiteSpace( (char) c ); - return false; // Again, only truly correct for English/Latin...but usually works. - } - - #ifdef TIXML_USE_STL - static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); - static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); - #endif - - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((const unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), - // and the null terminator isn't needed - for( int i=0; p[i] && i<*length; ++i ) { - _value[i] = p[i]; - } - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to English words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - -private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; -}; - - -/** The parent class for everything in the Document Object Model. - (Except for attributes). - Nodes have siblings, a parent, and children. A node can be - in a document, or stand on its own. The type of a TiXmlNode - can be queried, and it can be cast to its more defined type. -*/ -class TiXmlNode : public TiXmlBase -{ - friend class TiXmlDocument; - friend class TiXmlElement; - -public: - #ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - - #endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - TINYXML_DOCUMENT, - TINYXML_ELEMENT, - TINYXML_COMMENT, - TINYXML_UNKNOWN, - TINYXML_TEXT, - TINYXML_DECLARATION, - TINYXML_TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char *Value() const { return value.c_str (); } - - #ifdef TIXML_USE_STL - /** Return Value() as a std::string. If you only use STL, - this is more efficient than calling Value(). - Only available in STL mode. - */ - const std::string& ValueStr() const { return value; } - #endif - - const TIXML_STRING& ValueTStr() const { return value; } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) { value = _value;} - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) { value = _value; } - #endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() { return parent; } - const TiXmlNode* Parent() const { return parent; } - - const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild() { return firstChild; } - const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - /// The first child of this node with the matching 'value'. Will be null if none found. - TiXmlNode* FirstChild( const char * _value ) { - // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) - // call the method, cast the return back to non-const. - return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); - } - const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild() { return lastChild; } - - const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - TiXmlNode* LastChild( const char * _value ) { - return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. - #endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const TiXmlNode* previous ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); - } - - /// This flavor of IterateChildren searches for children with a particular 'value' - const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - #endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling() const { return prev; } - TiXmlNode* PreviousSibling() { return prev; } - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling( const char * ) const; - TiXmlNode* PreviousSibling( const char *_prev ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Navigate to a sibling node. - const TiXmlNode* NextSibling() const { return next; } - TiXmlNode* NextSibling() { return next; } - - /// Navigate to a sibling node with the given 'value'. - const TiXmlNode* NextSibling( const char * ) const; - TiXmlNode* NextSibling( const char* _next ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); - } - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement() const; - TiXmlElement* NextSiblingElement() { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); - } - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement( const char * ) const; - TiXmlElement* NextSiblingElement( const char *_next ) { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement() const; - TiXmlElement* FirstChildElement() { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); - } - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement( const char * _value ) const; - TiXmlElement* FirstChildElement( const char * _value ) { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /** Query the type (as an enumerated value, above) of this node. - The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, - TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. - */ - int Type() const { return type; } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - const TiXmlDocument* GetDocument() const; - TiXmlDocument* GetDocument() { - return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); - } - - /// Returns true if this node has no children. - bool NoChildren() const { return !firstChild; } - - virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - - virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; - - /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the - XML tree will be conditionally visited and the host will be called back - via the TiXmlVisitor interface. - - This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse - the XML for the callbacks, so the performance of TinyXML is unchanged by using this - interface versus any other.) - - The interface has been based on ideas from: - - - http://www.saxproject.org/ - - http://c2.com/cgi/wiki?HierarchicalVisitorPattern - - Which are both good references for "visiting". - - An example of using Accept(): - @verbatim - TiXmlPrinter printer; - tinyxmlDoc.Accept( &printer ); - const char* xmlcstr = printer.CStr(); - @endverbatim - */ - virtual bool Accept( TiXmlVisitor* visitor ) const = 0; - -protected: - TiXmlNode( NodeType _type ); - - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; - - #ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; - #endif - - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - - TiXmlNode* parent; - NodeType type; - - TiXmlNode* firstChild; - TiXmlNode* lastChild; - - TIXML_STRING value; - - TiXmlNode* prev; - TiXmlNode* next; - -private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. -}; - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not TiXmlNodes, since they are not - part of the tinyXML document object model. There are other - suggested ways to look at this problem. -*/ -class TiXmlAttribute : public TiXmlBase -{ - friend class TiXmlAttributeSet; - -public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - #endif - - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. - const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. - #ifdef TIXML_USE_STL - const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. - #endif - int IntValue() const; ///< Return the value of this attribute, converted to an integer. - double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - // Get the tinyxml string representation - const TIXML_STRING& NameTStr() const { return name; } - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* _value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* _value ) const; - - void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. - void SetValue( const char* _value ) { value = _value; } ///< Set the value. - - void SetIntValue( int _value ); ///< Set the value from an integer. - void SetDoubleValue( double _value ); ///< Set the value from a double. - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) { name = _name; } - /// STL std::string form. - void SetValue( const std::string& _value ) { value = _value; } - #endif - - /// Get the next sibling attribute in the DOM. Returns null at end. - const TiXmlAttribute* Next() const; - TiXmlAttribute* Next() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); - } - - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - const TiXmlAttribute* Previous() const; - TiXmlAttribute* Previous() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); - } - - bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } - bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } - bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const { - Print( cfile, depth, 0 ); - } - void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; - - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) { document = doc; } - -private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; -}; - - -/* A class used to manage a group of attributes. - It is only used internally, both by the ELEMENT and the DECLARATION. - - The set can be changed transparent to the Element and Declaration - classes that use it, but NOT transparent to the Attribute - which has to implement a next() and previous() method. Which makes - it a bit problematic and prevents the use of STL. - - This version is implemented with circular lists because: - - I like circular lists - - it demonstrates some independence from the (typical) doubly linked list. -*/ -class TiXmlAttributeSet -{ -public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - - TiXmlAttribute* Find( const char* _name ) const; - TiXmlAttribute* FindOrCreate( const char* _name ); - -# ifdef TIXML_USE_STL - TiXmlAttribute* Find( const std::string& _name ) const; - TiXmlAttribute* FindOrCreate( const std::string& _name ); -# endif - - -private: - //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), - //*ME: this class must be also use a hidden/disabled copy-constructor !!! - TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed - void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) - - TiXmlAttribute sentinel; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class TiXmlElement : public TiXmlNode -{ -public: - /// Construct an element. - TiXmlElement (const char * in_value); - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); - #endif - - TiXmlElement( const TiXmlElement& ); - - TiXmlElement& operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - int QueryIntAttribute( const char* name, int* _value ) const; - /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). - int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; - /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). - Note that '1', 'true', or 'yes' are considered true, while '0', 'false' - and 'no' are considered false. - */ - int QueryBoolAttribute( const char* name, bool* _value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* _value ) const; - /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). - int QueryFloatAttribute( const char* name, float* _value ) const { - double d; - int result = QueryDoubleAttribute( name, &d ); - if ( result == TIXML_SUCCESS ) { - *_value = (float)d; - } - return result; - } - - #ifdef TIXML_USE_STL - /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). - int QueryStringAttribute( const char* name, std::string* _value ) const { - const char* cstr = Attribute( name ); - if ( cstr ) { - *_value = std::string( cstr ); - return TIXML_SUCCESS; - } - return TIXML_NO_ATTRIBUTE; - } - - /** Template form of the attribute query which will try to read the - attribute into the specified type. Very easy, very powerful, but - be careful to make sure to call this with the correct type. - - NOTE: This method doesn't work correctly for 'string' types that contain spaces. - - @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE - */ - template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const - { - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - std::stringstream sstream( node->ValueStr() ); - sstream >> *outValue; - if ( !sstream.fail() ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; - } - - int QueryValueAttribute( const std::string& name, std::string* outValue ) const - { - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - *outValue = node->ValueStr(); - return TIXML_SUCCESS; - } - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * _value ); - - #ifdef TIXML_USE_STL - const std::string* Attribute( const std::string& name ) const; - const std::string* Attribute( const std::string& name, int* i ) const; - const std::string* Attribute( const std::string& name, double* d ) const; - int QueryIntAttribute( const std::string& name, int* _value ) const; - int QueryDoubleAttribute( const std::string& name, double* _value ) const; - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ); - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ); - ///< STL std::string form. - void SetDoubleAttribute( const std::string& name, double value ); - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); - #ifdef TIXML_USE_STL - void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. - #endif - - const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. - TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } - const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. - TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } - - /** Convenience function for easy access to the text inside an element. Although easy - and concise, GetText() is limited compared to getting the TiXmlText child - and accessing it directly. - - If the first child of 'this' is a TiXmlText, the GetText() - returns the character string of the Text node, else null is returned. - - This is a convenient method for getting the text of simple contained text: - @verbatim - This is text - const char* str = fooElement->GetText(); - @endverbatim - - 'str' will be a pointer to "This is text". - - Note that this function can be misleading. If the element foo was created from - this XML: - @verbatim - This is text - @endverbatim - - then the value of str would be null. The first child node isn't a text node, it is - another element. From this XML: - @verbatim - This is text - @endverbatim - GetText() will return "This is ". - - WARNING: GetText() accesses a child node - don't become confused with the - similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are - safe type casts on the referenced node. - */ - const char* GetText() const; - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well - - // Used to be public [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -private: - TiXmlAttributeSet attributeSet; -}; - - -/** An XML comment. -*/ -class TiXmlComment : public TiXmlNode -{ -public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} - /// Construct a comment from text. - TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { - SetValue( _value ); - } - TiXmlComment( const TiXmlComment& ); - TiXmlComment& operator=( const TiXmlComment& base ); - - virtual ~TiXmlComment() {} - - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - // Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif -// virtual void StreamOut( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** XML text. A text node can have 2 ways to output the next. "normal" output - and CDATA. It will default to the mode it was parsed from the XML file and - you generally want to leave it alone, but you can change the output mode with - SetCDATA() and query it with CDATA(). -*/ -class TiXmlText : public TiXmlNode -{ - friend class TiXmlElement; -public: - /** Constructor for text element. By default, it is treated as - normal, encoded text. If you want it be output as a CDATA text - element, set the parameter _cdata to 'true' - */ - TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) - { - SetValue( initValue ); - cdata = false; - } - virtual ~TiXmlText() {} - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) - { - SetValue( initValue ); - cdata = false; - } - #endif - - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } - TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } - - // Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /// Queries whether this represents text using a CDATA section. - bool CDATA() const { return cdata; } - /// Turns on or off a CDATA representation of text. - void SetCDATA( bool _cdata ) { cdata = _cdata; } - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - bool Blank() const; // returns true if all white space and new lines - // [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - bool cdata; // true if this should be input and output as a CDATA style text element -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXml will happily read or write files without a declaration, - however. There are 3 possible attributes to the declaration: - version, encoding, and standalone. - - Note: In this version of the code, the attributes are - handled as special cases, not generic attributes, simply - because there can only be at most 3 and they are always the same. -*/ -class TiXmlDeclaration : public TiXmlNode -{ -public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); -#endif - - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() {} - - /// Version. Will return an empty string if none was found. - const char *Version() const { return version.c_str (); } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const { return encoding.c_str (); } - /// Is this a standalone document? - const char *Standalone() const { return standalone.c_str (); } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - // Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; - virtual void Print( FILE* cfile, int depth ) const { - Print( cfile, depth, 0 ); - } - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; -}; - - -/** Any tag that tinyXml doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into TiXmlUnknowns. -*/ -class TiXmlUnknown : public TiXmlNode -{ -public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} - virtual ~TiXmlUnknown() {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } - TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - // Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected: - void CopyTo( TiXmlUnknown* target ) const; - - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - -}; - - -/** Always the top level node. A document binds together all the - XML pieces. It can be saved, loaded, and printed to the screen. - The 'value' of a document node is the xml file name. -*/ -class TiXmlDocument : public TiXmlNode -{ -public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); - #endif - - TiXmlDocument( const TiXmlDocument& copy ); - TiXmlDocument& operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - /** Load a file using the given FILE*. Returns true if successful. Note that this method - doesn't stream - the entire object pointed at by the FILE* - will be interpreted as an XML file. TinyXML doesn't stream in XML from the current - file location. Streaming may be added in the future. - */ - bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given FILE*. Returns true if successful. - bool SaveFile( FILE* ) const; - - #ifdef TIXML_USE_STL - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { - return LoadFile( filename.c_str(), encoding ); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { - return SaveFile( filename.c_str() ); - } - #endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - const TiXmlElement* RootElement() const { return FirstChildElement(); } - TiXmlElement* RootElement() { return FirstChildElement(); } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const { return error; } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const { return errorDesc.c_str (); } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - int ErrorId() const { return errorId; } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() const { return errorLocation.row+1; } - int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() - - /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) - to report the correct values for row and column. It does not change the output - or input in any way. - - By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) { tabsize = _tabsize; } - - int TabSize() const { return tabsize; } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Write the document to standard out using formatted printing ("pretty print"). */ - void Print() const { Print( stdout, 0 ); } - - /* Write the document to a string using formatted printing ("pretty print"). This - will allocate a character array (new char[]) and return it as a pointer. The - calling code pust call delete[] on the return char* to avoid a memory leak. - */ - //char* PrintToMemory() const; - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - - virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected : - // [internal use] - virtual TiXmlNode* Clone() const; - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - void CopyTo( TiXmlDocument* target ) const; - - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; - bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. -}; - - -/** - A TiXmlHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - TiXmlElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - TiXmlHandle docHandle( &document ); - TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - TiXmlHandle handleCopy = handle; - @endverbatim - - What they should not be used for is iteration: - - @verbatim - int i=0; - while ( true ) - { - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); - if ( !child ) - break; - // do something - ++i; - } - @endverbatim - - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs - to. Instead, prefer: - - @verbatim - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); - - for( child; child; child=child->NextSiblingElement() ) - { - // do something - } - @endverbatim -*/ -class TiXmlHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - - #ifdef TIXML_USE_STL - TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } - TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } - - TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } - TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } - #endif - - /** Return the handle as a TiXmlNode. This may return null. - */ - TiXmlNode* ToNode() const { return node; } - /** Return the handle as a TiXmlElement. This may return null. - */ - TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } - /** Return the handle as a TiXmlText. This may return null. - */ - TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } - /** Return the handle as a TiXmlUnknown. This may return null. - */ - TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - - /** @deprecated use ToNode. - Return the handle as a TiXmlNode. This may return null. - */ - TiXmlNode* Node() const { return ToNode(); } - /** @deprecated use ToElement. - Return the handle as a TiXmlElement. This may return null. - */ - TiXmlElement* Element() const { return ToElement(); } - /** @deprecated use ToText() - Return the handle as a TiXmlText. This may return null. - */ - TiXmlText* Text() const { return ToText(); } - /** @deprecated use ToUnknown() - Return the handle as a TiXmlUnknown. This may return null. - */ - TiXmlUnknown* Unknown() const { return ToUnknown(); } - -private: - TiXmlNode* node; -}; - - -/** Print to memory functionality. The TiXmlPrinter is useful when you need to: - - -# Print to memory (especially in non-STL mode) - -# Control formatting (line endings, etc.) - - When constructed, the TiXmlPrinter is in its default "pretty printing" mode. - Before calling Accept() you can call methods to control the printing - of the XML document. After TiXmlNode::Accept() is called, the printed document can - be accessed via the CStr(), Str(), and Size() methods. - - TiXmlPrinter uses the Visitor API. - @verbatim - TiXmlPrinter printer; - printer.SetIndent( "\t" ); - - doc.Accept( &printer ); - fprintf( stdout, "%s", printer.CStr() ); - @endverbatim -*/ -class TiXmlPrinter : public TiXmlVisitor -{ -public: - TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), - buffer(), indent( " " ), lineBreak( "\n" ) {} - - virtual bool VisitEnter( const TiXmlDocument& doc ); - virtual bool VisitExit( const TiXmlDocument& doc ); - - virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); - virtual bool VisitExit( const TiXmlElement& element ); - - virtual bool Visit( const TiXmlDeclaration& declaration ); - virtual bool Visit( const TiXmlText& text ); - virtual bool Visit( const TiXmlComment& comment ); - virtual bool Visit( const TiXmlUnknown& unknown ); - - /** Set the indent characters for printing. By default 4 spaces - but tab (\t) is also useful, or null/empty string for no indentation. - */ - void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } - /// Query the indention string. - const char* Indent() { return indent.c_str(); } - /** Set the line breaking string. By default set to newline (\n). - Some operating systems prefer other characters, or can be - set to the null/empty string for no indenation. - */ - void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } - /// Query the current line breaking string. - const char* LineBreak() { return lineBreak.c_str(); } - - /** Switch over to "stream printing" which is the most dense formatting without - linebreaks. Common when the XML is needed for network transmission. - */ - void SetStreamPrinting() { indent = ""; - lineBreak = ""; - } - /// Return the result. - const char* CStr() { return buffer.c_str(); } - /// Return the length of the result string. - size_t Size() { return buffer.size(); } - - #ifdef TIXML_USE_STL - /// Return the result. - const std::string& Str() { return buffer; } - #endif - -private: - void DoIndent() { - for( int i=0; i +#include +#include +#include +#include + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#ifdef TIXML_USE_STL + #include + #include + #include + #define TIXML_STRING std::string +#else + #include "tinystr.h" + #define TIXML_STRING TiXmlString +#endif + +// Deprecated library function hell. Compilers want to use the +// new safe versions. This probably doesn't fully address the problem, +// but it gets closer. There are too many compilers for me to fully +// test. If you get compilation troubles, undefine TIXML_SAFE +#define TIXML_SAFE + +#ifdef TIXML_SAFE + #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + // Microsoft visual studio, version 2005 and higher. + #define TIXML_SNPRINTF _snprintf_s + #define TIXML_SSCANF sscanf_s + #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) + // Microsoft visual studio, version 6 and higher. + //#pragma message( "Using _sn* functions." ) + #define TIXML_SNPRINTF _snprintf + #define TIXML_SSCANF sscanf + #elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + //#warning( "Using sn* functions." ) + #define TIXML_SNPRINTF snprintf + #define TIXML_SSCANF sscanf + #else + #define TIXML_SNPRINTF snprintf + #define TIXML_SSCANF sscanf + #endif +#endif + +class TiXmlDocument; +class TiXmlElement; +class TiXmlComment; +class TiXmlUnknown; +class TiXmlAttribute; +class TiXmlText; +class TiXmlDeclaration; +class TiXmlParsingData; + +const int TIXML_MAJOR_VERSION = 2; +const int TIXML_MINOR_VERSION = 6; +const int TIXML_PATCH_VERSION = 2; + +/* Internal structure for tracking location of items + in the XML file. +*/ +struct TiXmlCursor +{ + TiXmlCursor() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. +}; + + +/** + Implements the interface to the "Visitor pattern" (see the Accept() method.) + If you call the Accept() method, it requires being passed a TiXmlVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves + are simply called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its sibilings will be Visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. + + You should never change the document from a callback. + + @sa TiXmlNode::Accept() +*/ +class TiXmlVisitor +{ +public: + virtual ~TiXmlVisitor() {} + + /// Visit a document. + virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } + /// Visit a document. + virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } + + /// Visit an element. + virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } + /// Visit an element. + virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } + + /// Visit a declaration + virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } + /// Visit a text node + virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } + /// Visit a comment node + virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } + /// Visit an unknown node + virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } +}; + +// Only used by Attribute::Query functions +enum +{ + TIXML_SUCCESS, + TIXML_NO_ATTRIBUTE, + TIXML_WRONG_TYPE +}; + + +// Used by the parsing routines. +enum TiXmlEncoding +{ + TIXML_ENCODING_UNKNOWN, + TIXML_ENCODING_UTF8, + TIXML_ENCODING_LEGACY +}; + +const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; + +/** TiXmlBase is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + @endverbatim +*/ +class TiXmlBase +{ + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; + +public: + TiXmlBase() : userData(0) {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream + or the string class (TiXmlString in non-STL mode, std::string + in STL mode.) Either or both cfile and str can be null. + + This is a formatted print, and will insert + tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + value is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocument::Load(), + TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. + + @sa TiXmlDocument::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + + void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. + void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. + const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. + + // Table that returs, for a given lead byte, the total number of bytes + // in the UTF-8 sequence. + static const int utf8ByteTable[256]; + + virtual const char* Parse( const char* p, + TiXmlParsingData* data, + TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; + + /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, + or they will be transformed into entities! + */ + static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + TIXML_ERROR_EMBEDDED_NULL, + TIXML_ERROR_PARSING_CDATA, + TIXML_ERROR_DOCUMENT_TOP_ONLY, + + TIXML_ERROR_STRING_COUNT + }; + +protected: + + static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); + + inline static bool IsWhiteSpace( char c ) + { + return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); + } + inline static bool IsWhiteSpace( int c ) + { + if ( c < 256 ) + return IsWhiteSpace( (char) c ); + return false; // Again, only truly correct for English/Latin...but usually works. + } + + #ifdef TIXML_USE_STL + static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); + static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); + #endif + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + TIXML_STRING* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase, // whether to ignore case in the end tag + TiXmlEncoding encoding ); // the current encoding + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); + + // Get a character, while interpreting entities. + // The length can be from 0 to 4 bytes. + inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) + { + assert( p ); + if ( encoding == TIXML_ENCODING_UTF8 ) + { + *length = utf8ByteTable[ *((const unsigned char*)p) ]; + assert( *length >= 0 && *length < 5 ); + } + else + { + *length = 1; + } + + if ( *length == 1 ) + { + if ( *p == '&' ) + return GetEntity( p, _value, length, encoding ); + *_value = *p; + return p+1; + } + else if ( *length ) + { + //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), + // and the null terminator isn't needed + for( int i=0; p[i] && i<*length; ++i ) { + _value[i] = p[i]; + } + return p + (*length); + } + else + { + // Not valid text. + return 0; + } + } + + // Return true if the next characters in the stream are any of the endTag sequences. + // Ignore case only works for english, and should only be relied on when comparing + // to English words: StringEqual( p, "version", true ) is fine. + static bool StringEqual( const char* p, + const char* endTag, + bool ignoreCase, + TiXmlEncoding encoding ); + + static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor location; + + /// Field containing a generic user pointer + void* userData; + + // None of these methods are reliable for any language except English. + // Good for approximation, not great for accuracy. + static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); + static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); + inline static int ToLower( int v, TiXmlEncoding encoding ) + { + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( v < 128 ) return tolower( v ); + return v; + } + else + { + return tolower( v ); + } + } + static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); + +private: + TiXmlBase( const TiXmlBase& ); // not implemented. + void operator=( const TiXmlBase& base ); // not allowed. + + struct Entity + { + const char* str; + unsigned int strLength; + char chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes). + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNode + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNode : public TiXmlBase +{ + friend class TiXmlDocument; + friend class TiXmlElement; + +public: + #ifdef TIXML_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator >> (std::istream& in, TiXmlNode& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::string& out, const TiXmlNode& base ); + + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + TINYXML_DOCUMENT, + TINYXML_ELEMENT, + TINYXML_COMMENT, + TINYXML_UNKNOWN, + TINYXML_TEXT, + TINYXML_DECLARATION, + TINYXML_TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + + The subclasses will wrap this function. + */ + const char *Value() const { return value.c_str (); } + + #ifdef TIXML_USE_STL + /** Return Value() as a std::string. If you only use STL, + this is more efficient than calling Value(). + Only available in STL mode. + */ + const std::string& ValueStr() const { return value; } + #endif + + const TIXML_STRING& ValueTStr() const { return value; } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + void SetValue(const char * _value) { value = _value;} + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() { return parent; } + const TiXmlNode* Parent() const { return parent; } + + const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild() { return firstChild; } + const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + /// The first child of this node with the matching 'value'. Will be null if none found. + TiXmlNode* FirstChild( const char * _value ) { + // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) + // call the method, cast the return back to non-const. + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); + } + const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild() { return lastChild; } + + const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + TiXmlNode* LastChild( const char * _value ) { + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); + } + + /// This flavor of IterateChildren searches for children with a particular 'value' + const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + @sa InsertEndChild + */ + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling() const { return prev; } + TiXmlNode* PreviousSibling() { return prev; } + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling( const char * ) const; + TiXmlNode* PreviousSibling( const char *_prev ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Navigate to a sibling node. + const TiXmlNode* NextSibling() const { return next; } + TiXmlNode* NextSibling() { return next; } + + /// Navigate to a sibling node with the given 'value'. + const TiXmlNode* NextSibling( const char * ) const; + TiXmlNode* NextSibling( const char* _next ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement() const; + TiXmlElement* NextSiblingElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement( const char * ) const; + TiXmlElement* NextSiblingElement( const char *_next ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement() const; + TiXmlElement* FirstChildElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); + } + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement( const char * _value ) const; + TiXmlElement* FirstChildElement( const char * _value ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, + TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. + */ + int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + const TiXmlDocument* GetDocument() const; + TiXmlDocument* GetDocument() { + return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); + } + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + /** Create an exact duplicate of this node and return it. The memory must be deleted + by the caller. + */ + virtual TiXmlNode* Clone() const = 0; + + /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the TiXmlVisitor interface. + + This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + TiXmlPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept( TiXmlVisitor* visitor ) const = 0; + +protected: + TiXmlNode( NodeType _type ); + + // Copy to the allocated object. Shared functionality between Clone, Copy constructor, + // and the assignment operator. + void CopyTo( TiXmlNode* target ) const; + + #ifdef TIXML_USE_STL + // The real work of the input operator. + virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; + #endif + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); + + TiXmlNode* parent; + NodeType type; + + TiXmlNode* firstChild; + TiXmlNode* lastChild; + + TIXML_STRING value; + + TiXmlNode* prev; + TiXmlNode* next; + +private: + TiXmlNode( const TiXmlNode& ); // not implemented. + void operator=( const TiXmlNode& base ); // not allowed. +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. +*/ +class TiXmlAttribute : public TiXmlBase +{ + friend class TiXmlAttributeSet; + +public: + /// Construct an empty attribute. + TiXmlAttribute() : TiXmlBase() + { + document = 0; + prev = next = 0; + } + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlAttribute( const std::string& _name, const std::string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif + + /// Construct an attribute with a name and value. + TiXmlAttribute( const char * _name, const char * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + + const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. + const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. + #ifdef TIXML_USE_STL + const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. + #endif + int IntValue() const; ///< Return the value of this attribute, converted to an integer. + double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + // Get the tinyxml string representation + const TIXML_STRING& NameTStr() const { return name; } + + /** QueryIntValue examines the value string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* _value ) const; + /// QueryDoubleValue examines the value string. See QueryIntValue(). + int QueryDoubleValue( double* _value ) const; + + void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const char* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int _value ); ///< Set the value from an integer. + void SetDoubleValue( double _value ); ///< Set the value from a double. + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetName( const std::string& _name ) { name = _name; } + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + const TiXmlAttribute* Next() const; + TiXmlAttribute* Next() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); + } + + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + const TiXmlAttribute* Previous() const; + TiXmlAttribute* Previous() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); + } + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* Attribute parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + // Prints this Attribute to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } + +private: + TiXmlAttribute( const TiXmlAttribute& ); // not implemented. + void operator=( const TiXmlAttribute& base ); // not allowed. + + TiXmlDocument* document; // A pointer back to a document, for error reporting. + TIXML_STRING name; + TIXML_STRING value; + TiXmlAttribute* prev; + TiXmlAttribute* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSet +{ +public: + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + + TiXmlAttribute* Find( const char* _name ) const; + TiXmlAttribute* FindOrCreate( const char* _name ); + +# ifdef TIXML_USE_STL + TiXmlAttribute* Find( const std::string& _name ) const; + TiXmlAttribute* FindOrCreate( const std::string& _name ); +# endif + + +private: + //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), + //*ME: this class must be also use a hidden/disabled copy-constructor !!! + TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed + void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) + + TiXmlAttribute sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElement : public TiXmlNode +{ +public: + /// Construct an element. + TiXmlElement (const char * in_value); + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlElement( const std::string& _value ); + #endif + + TiXmlElement( const TiXmlElement& ); + + TiXmlElement& operator=( const TiXmlElement& base ); + + virtual ~TiXmlElement(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const char* Attribute( const char* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const char* Attribute( const char* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const char* Attribute( const char* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. If the attribute + does not exist, then TIXML_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const char* name, int* _value ) const; + /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). + int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; + /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). + Note that '1', 'true', or 'yes' are considered true, while '0', 'false' + and 'no' are considered false. + */ + int QueryBoolAttribute( const char* name, bool* _value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const char* name, double* _value ) const; + /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). + int QueryFloatAttribute( const char* name, float* _value ) const { + double d; + int result = QueryDoubleAttribute( name, &d ); + if ( result == TIXML_SUCCESS ) { + *_value = (float)d; + } + return result; + } + + #ifdef TIXML_USE_STL + /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). + int QueryStringAttribute( const char* name, std::string* _value ) const { + const char* cstr = Attribute( name ); + if ( cstr ) { + *_value = std::string( cstr ); + return TIXML_SUCCESS; + } + return TIXML_NO_ATTRIBUTE; + } + + /** Template form of the attribute query which will try to read the + attribute into the specified type. Very easy, very powerful, but + be careful to make sure to call this with the correct type. + + NOTE: This method doesn't work correctly for 'string' types that contain spaces. + + @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE + */ + template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + std::stringstream sstream( node->ValueStr() ); + sstream >> *outValue; + if ( !sstream.fail() ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; + } + + int QueryValueAttribute( const std::string& name, std::string* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + *outValue = node->ValueStr(); + return TIXML_SUCCESS; + } + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char* name, const char * _value ); + + #ifdef TIXML_USE_STL + const std::string* Attribute( const std::string& name ) const; + const std::string* Attribute( const std::string& name, int* i ) const; + const std::string* Attribute( const std::string& name, double* d ) const; + int QueryIntAttribute( const std::string& name, int* _value ) const; + int QueryDoubleAttribute( const std::string& name, double* _value ) const; + + /// STL std::string form. + void SetAttribute( const std::string& name, const std::string& _value ); + ///< STL std::string form. + void SetAttribute( const std::string& name, int _value ); + ///< STL std::string form. + void SetDoubleAttribute( const std::string& name, double value ); + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char * name, int value ); + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetDoubleAttribute( const char * name, double value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const char * name ); + #ifdef TIXML_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. + #endif + + const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } + const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the TiXmlText child + and accessing it directly. + + If the first child of 'this' is a TiXmlText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + + WARNING: GetText() accesses a child node - don't become confused with the + similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are + safe type casts on the referenced node. + */ + const char* GetText() const; + + /// Creates a new Element and returns it - the returned element is a copy. + virtual TiXmlNode* Clone() const; + // Print the Element to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + + void CopyTo( TiXmlElement* target ) const; + void ClearThis(); // like clear, but initializes 'this' object as well + + // Used to be public [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + +private: + TiXmlAttributeSet attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlComment : public TiXmlNode +{ +public: + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} + /// Construct a comment from text. + TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { + SetValue( _value ); + } + TiXmlComment( const TiXmlComment& ); + TiXmlComment& operator=( const TiXmlComment& base ); + + virtual ~TiXmlComment() {} + + /// Returns a copy of this Comment. + virtual TiXmlNode* Clone() const; + // Write this Comment to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlComment* target ) const; + + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif +// virtual void StreamOut( TIXML_OSTREAM * out ) const; + +private: + +}; + + +/** XML text. A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCDATA() and query it with CDATA(). +*/ +class TiXmlText : public TiXmlNode +{ + friend class TiXmlElement; +public: + /** Constructor for text element. By default, it is treated as + normal, encoded text. If you want it be output as a CDATA text + element, set the parameter _cdata to 'true' + */ + TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) + { + SetValue( initValue ); + cdata = false; + } + virtual ~TiXmlText() {} + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) + { + SetValue( initValue ); + cdata = false; + } + #endif + + TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } + TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } + + // Write this text object to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /// Queries whether this represents text using a CDATA section. + bool CDATA() const { return cdata; } + /// Turns on or off a CDATA representation of text. + void SetCDATA( bool _cdata ) { cdata = _cdata; } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + /// [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + void CopyTo( TiXmlText* target ) const; + + bool Blank() const; // returns true if all white space and new lines + // [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + bool cdata; // true if this should be input and output as a CDATA style text element +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclaration : public TiXmlNode +{ +public: + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} + +#ifdef TIXML_USE_STL + /// Constructor. + TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ); +#endif + + /// Construct. + TiXmlDeclaration( const char* _version, + const char* _encoding, + const char* _standalone ); + + TiXmlDeclaration( const TiXmlDeclaration& copy ); + TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); + + virtual ~TiXmlDeclaration() {} + + /// Version. Will return an empty string if none was found. + const char *Version() const { return version.c_str (); } + /// Encoding. Will return an empty string if none was found. + const char *Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const char *Standalone() const { return standalone.c_str (); } + + /// Creates a copy of this Declaration and returns it. + virtual TiXmlNode* Clone() const; + // Print this declaration to a FILE stream. + virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlDeclaration* target ) const; + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + + TIXML_STRING version; + TIXML_STRING encoding; + TIXML_STRING standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into TiXmlUnknowns. +*/ +class TiXmlUnknown : public TiXmlNode +{ +public: + TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} + virtual ~TiXmlUnknown() {} + + TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } + TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } + + /// Creates a copy of this Unknown and returns it. + virtual TiXmlNode* Clone() const; + // Print this Unknown to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected: + void CopyTo( TiXmlUnknown* target ) const; + + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocument : public TiXmlNode +{ +public: + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const char * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::string& documentName ); + #endif + + TiXmlDocument( const TiXmlDocument& copy ); + TiXmlDocument& operator=( const TiXmlDocument& copy ); + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + /** Load a file using the given FILE*. Returns true if successful. Note that this method + doesn't stream - the entire object pointed at by the FILE* + will be interpreted as an XML file. TinyXML doesn't stream in XML from the current + file location. Streaming may be added in the future. + */ + bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given FILE*. Returns true if successful. + bool SaveFile( FILE* ) const; + + #ifdef TIXML_USE_STL + bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. + { + return LoadFile( filename.c_str(), encoding ); + } + bool SaveFile( const std::string& filename ) const ///< STL std::string version. + { + return SaveFile( filename.c_str() ); + } + #endif + + /** Parse the given null terminated block of xml data. Passing in an encoding to this + method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml + to use that encoding, regardless of what TinyXml might otherwise try to detect. + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + const TiXmlElement* RootElement() const { return FirstChildElement(); } + TiXmlElement* RootElement() { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const char * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + @sa SetTabSize, Row, Column + */ + int ErrorRow() const { return errorLocation.row+1; } + int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) + to report the correct values for row and column. It does not change the output + or input in any way. + + By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + @verbatim + TiXmlDocument doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + @endverbatim + + @sa Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Write the document to standard out using formatted printing ("pretty print"). */ + void Print() const { Print( stdout, 0 ); } + + /* Write the document to a string using formatted printing ("pretty print"). This + will allocate a character array (new char[]) and return it as a pointer. The + calling code pust call delete[] on the return char* to avoid a memory leak. + */ + //char* PrintToMemory() const; + + /// Print this Document to a FILE stream. + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + + virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + // [internal use] + virtual TiXmlNode* Clone() const; + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + void CopyTo( TiXmlDocument* target ) const; + + bool error; + int errorId; + TIXML_STRING errorDesc; + int tabsize; + TiXmlCursor errorLocation; + bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. +}; + + +/** + A TiXmlHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + TiXmlElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + TiXmlElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + TiXmlElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + TiXmlElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity + of such code. A TiXmlHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + TiXmlHandle docHandle( &document ); + TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + TiXmlHandle handleCopy = handle; + @endverbatim + + What they should not be used for is iteration: + + @verbatim + int i=0; + while ( true ) + { + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); + if ( !child ) + break; + // do something + ++i; + } + @endverbatim + + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs + to. Instead, prefer: + + @verbatim + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); + + for( child; child; child=child->NextSiblingElement() ) + { + // do something + } + @endverbatim +*/ +class TiXmlHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } + /// Copy constructor + TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } + TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } + + /// Return a handle to the first child node. + TiXmlHandle FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandle FirstChild( const char * value ) const; + /// Return a handle to the first child element. + TiXmlHandle FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandle FirstChildElement( const char * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( const char* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( const char* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /** Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* ToNode() const { return node; } + /** Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /** Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + /** Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } + + /** @deprecated use ToNode. + Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* Node() const { return ToNode(); } + /** @deprecated use ToElement. + Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* Element() const { return ToElement(); } + /** @deprecated use ToText() + Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* Text() const { return ToText(); } + /** @deprecated use ToUnknown() + Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* Unknown() const { return ToUnknown(); } + +private: + TiXmlNode* node; +}; + + +/** Print to memory functionality. The TiXmlPrinter is useful when you need to: + + -# Print to memory (especially in non-STL mode) + -# Control formatting (line endings, etc.) + + When constructed, the TiXmlPrinter is in its default "pretty printing" mode. + Before calling Accept() you can call methods to control the printing + of the XML document. After TiXmlNode::Accept() is called, the printed document can + be accessed via the CStr(), Str(), and Size() methods. + + TiXmlPrinter uses the Visitor API. + @verbatim + TiXmlPrinter printer; + printer.SetIndent( "\t" ); + + doc.Accept( &printer ); + fprintf( stdout, "%s", printer.CStr() ); + @endverbatim +*/ +class TiXmlPrinter : public TiXmlVisitor +{ +public: + TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), + buffer(), indent( " " ), lineBreak( "\n" ) {} + + virtual bool VisitEnter( const TiXmlDocument& doc ); + virtual bool VisitExit( const TiXmlDocument& doc ); + + virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); + virtual bool VisitExit( const TiXmlElement& element ); + + virtual bool Visit( const TiXmlDeclaration& declaration ); + virtual bool Visit( const TiXmlText& text ); + virtual bool Visit( const TiXmlComment& comment ); + virtual bool Visit( const TiXmlUnknown& unknown ); + + /** Set the indent characters for printing. By default 4 spaces + but tab (\t) is also useful, or null/empty string for no indentation. + */ + void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } + /// Query the indention string. + const char* Indent() { return indent.c_str(); } + /** Set the line breaking string. By default set to newline (\n). + Some operating systems prefer other characters, or can be + set to the null/empty string for no indenation. + */ + void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } + /// Query the current line breaking string. + const char* LineBreak() { return lineBreak.c_str(); } + + /** Switch over to "stream printing" which is the most dense formatting without + linebreaks. Common when the XML is needed for network transmission. + */ + void SetStreamPrinting() { indent = ""; + lineBreak = ""; + } + /// Return the result. + const char* CStr() { return buffer.c_str(); } + /// Return the length of the result string. + size_t Size() { return buffer.size(); } + + #ifdef TIXML_USE_STL + /// Return the result. + const std::string& Str() { return buffer; } + #endif + +private: + void DoIndent() { + for( int i=0; i -#include -#include -#include "control/CtrlComponents.h" -#include "trajectory/SCurve.h" - - -class JointSpaceTraj : public Trajectory{ -public: - JointSpaceTraj(CtrlComponents *ctrlComp); - ~JointSpaceTraj(){} - - bool getJointCmd(Vec6 &q, Vec6 &qd); - bool getJointCmd(Vec6 &q, Vec6 &qd, double &gripperQ, double &gripperQd); - - void setGripper(double startQ, double endQ, double speed = M_PI); - void setJointTraj(Vec6 startQ, Vec6 endQ, double speed); - bool setJointTraj(Vec6 startQ, std::string endName, double speed); - bool setJointTraj(std::string startName, std::string endName, double speed); -private: - void _generateA345(double pathTime); - - SCurve _jointCurve; - const double ddQMax = 15.0; - const double dddQMax = 30.0; - - double _a3, _a4, _a5, _s, _sDot; -}; - +#ifndef JOINTSPACETRAJ_H +#define JOINTSPACETRAJ_H + +#include +#include +#include +#include "control/CtrlComponents.h" +#include "trajectory/SCurve.h" + + +class JointSpaceTraj : public Trajectory{ +public: + JointSpaceTraj(CtrlComponents *ctrlComp); + ~JointSpaceTraj(){} + + bool getJointCmd(Vec6 &q, Vec6 &qd); + bool getJointCmd(Vec6 &q, Vec6 &qd, double &gripperQ, double &gripperQd); + + void setGripper(double startQ, double endQ, double speed = M_PI); + void setJointTraj(Vec6 startQ, Vec6 endQ, double speed); + bool setJointTraj(Vec6 startQ, std::string endName, double speed); + bool setJointTraj(std::string startName, std::string endName, double speed); +private: + void _generateA345(double pathTime); + + SCurve _jointCurve; + const double ddQMax = 15.0; + const double dddQMax = 30.0; + + double _a3, _a4, _a5, _s, _sDot; +}; + #endif // JOINTSPACETRAJ_H \ No newline at end of file diff --git a/include/trajectory/SCurve.h b/include/trajectory/SCurve.h index cad0d30..9330785 100755 --- a/include/trajectory/SCurve.h +++ b/include/trajectory/SCurve.h @@ -1,49 +1,49 @@ -#ifndef SCURVE_H -#define SCURVE_H - -/* 归一化后的s曲线 */ - -#include - -class SCurve{ -public: - SCurve(){} - ~SCurve(){} - void setSCurve(double deltaQ, double dQMax, double ddQMax, double dddQMax); - void restart(); -/* -考虑到归一化,在实际使用时,物理量为: -加速度 = deltaQ * getDDs(); -*/ - double getDDs(); - double getDDs(double t); -/* -考虑到归一化,在实际使用时,物理量为: -速度 = deltaQ * getDs(); -*/ - double getDs(); - double getDs(double t); -/* -考虑到归一化,在实际使用时,物理量为: -位置 = deltaQ * gets(); -*/ - double gets(); - double gets(double t); - - double getT(); -private: - int _getSegment(double t); - void _setFunc(); - double _runTime(); - - bool _started = false; - double _startTime; - - double _J, _aMax, _vMax; - double _T[7]; // period - double _t[7]; // moment - double _v0, _v1; // ds at _t[0], _t[1] - double _s0, _s1, _s2, _s3, _s4, _s5, _s6; // s at _t[0], _t[1] -}; - +#ifndef SCURVE_H +#define SCURVE_H + +/* 归一化后的s曲线 */ + +#include + +class SCurve{ +public: + SCurve(){} + ~SCurve(){} + void setSCurve(double deltaQ, double dQMax, double ddQMax, double dddQMax); + void restart(); +/* +考虑到归一化,在实际使用时,物理量为: +加速度 = deltaQ * getDDs(); +*/ + double getDDs(); + double getDDs(double t); +/* +考虑到归一化,在实际使用时,物理量为: +速度 = deltaQ * getDs(); +*/ + double getDs(); + double getDs(double t); +/* +考虑到归一化,在实际使用时,物理量为: +位置 = deltaQ * gets(); +*/ + double gets(); + double gets(double t); + + double getT(); +private: + int _getSegment(double t); + void _setFunc(); + double _runTime(); + + bool _started = false; + double _startTime; + + double _J, _aMax, _vMax; + double _T[7]; // period + double _t[7]; // moment + double _v0, _v1; // ds at _t[0], _t[1] + double _s0, _s1, _s2, _s3, _s4, _s5, _s6; // s at _t[0], _t[1] +}; + #endif // SCURVE_H \ No newline at end of file diff --git a/include/trajectory/StopForTime.h b/include/trajectory/StopForTime.h index 0e435ce..7d02c99 100755 --- a/include/trajectory/StopForTime.h +++ b/include/trajectory/StopForTime.h @@ -1,17 +1,17 @@ -#ifndef STOPFORTIME_H -#define STOPFORTIME_H - -#include "trajectory/Trajectory.h" - -class StopForTime : public Trajectory{ -public: - StopForTime(CtrlComponents *ctrlComp); - ~StopForTime(){} - - bool getJointCmd(Vec6 &q, Vec6 &qd); - bool getJointCmd(Vec6 &q, Vec6 &qd, double &gripperQ, double &gripperQd); - void setStop(Vec6 stopQ, double stopTime); -private: -}; - +#ifndef STOPFORTIME_H +#define STOPFORTIME_H + +#include "trajectory/Trajectory.h" + +class StopForTime : public Trajectory{ +public: + StopForTime(CtrlComponents *ctrlComp); + ~StopForTime(){} + + bool getJointCmd(Vec6 &q, Vec6 &qd); + bool getJointCmd(Vec6 &q, Vec6 &qd, double &gripperQ, double &gripperQd); + void setStop(Vec6 stopQ, double stopTime); +private: +}; + #endif // STOPFORTIME_H \ No newline at end of file diff --git a/include/trajectory/TrajectoryManager.h b/include/trajectory/TrajectoryManager.h index 7bc364a..a4afb86 100755 --- a/include/trajectory/TrajectoryManager.h +++ b/include/trajectory/TrajectoryManager.h @@ -1,38 +1,38 @@ -#ifndef TRAJECTORY_MANAGER_H -#define TRAJECTORY_MANAGER_H - -#include -#include "control/CtrlComponents.h" -#include "trajectory/JointSpaceTraj.h" -#include "trajectory/EndLineTraj.h" -#include "trajectory/EndCircleTraj.h" -#include "trajectory/StopForTime.h" - -class TrajectoryManager{ -public: - TrajectoryManager(CtrlComponents *ctrlComp); - ~TrajectoryManager(){} - bool getJointCmd(Vec6 &q, Vec6 &qd); - bool getJointCmd(Vec6 &q, Vec6 &qd, double &gripperQ, double &gripperQd); - void addTrajectory(Trajectory* traj); - void setLoop(double backSpeed = 0.7); - void restartTraj(); - void emptyTraj(); - Vec6 getStartQ(); - Vec6 getEndQ(); - Vec6 getEndPosture(); - double getStartGripperQ(); - double getEndGripperQ(); - HomoMat getEndHomo(); - size_t size() {return _trajVec.size();} ; -private: - CtrlComponents *_ctrlComp; - JointSpaceTraj *_trajBack; - std::vector _trajVec; - int _trajID = 0; - double _jointErr = 0.05; - bool _trajCorrect = true; - bool _loop = false; -}; - +#ifndef TRAJECTORY_MANAGER_H +#define TRAJECTORY_MANAGER_H + +#include +#include "control/CtrlComponents.h" +#include "trajectory/JointSpaceTraj.h" +#include "trajectory/EndLineTraj.h" +#include "trajectory/EndCircleTraj.h" +#include "trajectory/StopForTime.h" + +class TrajectoryManager{ +public: + TrajectoryManager(CtrlComponents *ctrlComp); + ~TrajectoryManager(){} + bool getJointCmd(Vec6 &q, Vec6 &qd); + bool getJointCmd(Vec6 &q, Vec6 &qd, double &gripperQ, double &gripperQd); + void addTrajectory(Trajectory* traj); + void setLoop(double backSpeed = 0.7); + void restartTraj(); + void emptyTraj(); + Vec6 getStartQ(); + Vec6 getEndQ(); + Vec6 getEndPosture(); + double getStartGripperQ(); + double getEndGripperQ(); + HomoMat getEndHomo(); + size_t size() {return _trajVec.size();} ; +private: + CtrlComponents *_ctrlComp; + JointSpaceTraj *_trajBack; + std::vector _trajVec; + int _trajID = 0; + double _jointErr = 0.05; + bool _trajCorrect = true; + bool _loop = false; +}; + #endif // TRAJECTORY_MANAGER_H \ No newline at end of file diff --git a/lib/libZ1_ROS_Linux64.so b/lib/libZ1_ROS_x86_64.so old mode 100644 new mode 100755 similarity index 90% rename from lib/libZ1_ROS_Linux64.so rename to lib/libZ1_ROS_x86_64.so index fc463edb3a9e287b44fbb3bf997107ad09b83faa..5c494806d49b5c5a6f655681bb3689fb27a3c1c2 GIT binary patch delta 30863 zcmZ^s33yZ0*09eB6gng&C9SkTA!RJc(4uHjkW@tr;w30vi{d3!l)^V@Afxv%%vbIyAz z;L$eh*Ef&U^ERwL=SG|E-;h=KW;?xj!|wA9n;zV-`@*ooqH$qcR(^~qI_Ywot}Sl-=k2!Wl^bSW{$r|Mx_IJsL-o21 z^RDZu+oEGPtepOUO}}RGfSE(}@(q(`?$LG6;t{i+*Zqt4&gw$l)>)6(Vq-VVzaBGf zLt0tS_C%O}3!(WJH{L#!kaEfiw`{|rJ07&*H|wtcDSGkZ!pi5VysvVqUbJ{@)tkC| zL(=??9WhH=L=*lEjgL~vv$$l*P~Ev<(UQ>#dSt`SWgV4j_Y;>Vg8XLzb3Io42>$oD@w<*QQ9xI9pGBn#==fWfhjitzBm%Xm>Ut2ovQ%GfT3L9@MK(sZtL&X%>yqUjY0WS9s?*I_2+Vx- zl{7EvfpN9xFY0_LRO+&ER_)TisOQLRrLKsp%m1QYEGv|HOkgMX2Cy2uKq<}dPol0T8wM#a^&e^F185~aQ|uHOC^bx;;5_5E>m{a@7e;Vlzw zw*NSnj_IU%ixv)F;pwCmEgY3CpQg4uL*F3Do!a%(7t26}OJ$tGr!vzL&Ih)pPvnJ8 z?Rw~^$$OT~&k9s@g41N6g6qL?&UU=phsQY+Cic>wd2so#1l}EZcjTSOJ1M+;Sn`eu zdX8LoPjZjZxf?rbo6cZn!zlOT9O2s<(&V zz9;$3_WIS~dml`$(e?LaP*rjdy)=ALRdQpy#QGOatDEKgg~=QAYr`!IldrMqx6713 z^6i-kFLc!MKdIVXRCS=?uA5to`y#iN&~TId5=ai{v%+&1B|m8E_RI5F?bxIiKvC76 zhH+)4;b$1`k{*vGZ`57k`p1&L)b)Ph4UZ>J(DkpRU3Kz!eT{gllb_HJ%Kqx)ZhEsM zE=|5ve@dn-O*T{j%aS+gy`{?&$;b8mlD<57m!2KozdU(*J3SJf6imK9Nq<|uT%9~u ze?Tr@lRTYO@aCH2b^0T6;|s~FY=1lw?y@#HCn0fKwVA9Z!=ClY!*tuvi{+M=lb7iq zOQ#K#Ys2SmNbb|FQ}ZIzYUsmeHs;B#uO)w~zanG9$)ax#?+qu{*@nDeDu;hxW!hXj zpR{kL&kc)DH%H|mOZ~2;zAe0GQ!;z?9}hjgIr$^~qwvR@laIC2FOl~nWdAhzSs`7L zwj}qk9lk$2Kv7>JMQBA zKS^$Ju9eqYsw`ZweeMdRK3^G^QR-ss^JaZ@B_z^U(eECkaIIqesjHZW=HM1PPt!n zdhnlYf!B2!lKpb{yi-!nYNy{GzB?;rg|2@n?rtgf=|$n^x~25!Xxle1{BEz5qIUXp zN$r=Cjh{jNQr_0bNKBQsOKSg=P5SAwqkl@aE!I~W`loE{*{u&*EFg>HtBi(k>y8*z z->Re2x0xZGB9UC`bd@^?;9*2~>421urzGE(+EKg3PQ)8z&FGYX{#N*GPs+h|dX@}1 zKc$CW8NT@Zl&f_8lJE;-QqIubXC=}^mf6IShNoUWVvMi)aeUR0hNc>`jp1Sa!juGE ze>mK+D5ZNx_h;=%=e_$A7i4U>e1KN8V0Z|OU+BnBR%v!z5k7B1%DgnaNZ$3Otchg0uL*_NhPgui$=<=eDQ4dD)IVP~yV7791H(m^Y% zy^gN1JvnyD>Ce*7CGzOADgU%667zo3N15%vt#c^%B;H z?^~7fj-K{PsDozYA-J^0tg%)m*Q9){ZwsHXI%S=n*ySZtni>9eO^QSB|J}14R2Gh{ zHKoU&QQmKkd+&?`%l9P7S)0=J>KzytF1Wn?*af#IQt4%@(uR{NJx6Kg%~rJ?9DDO4 z4OJI1B=^4K-uGRL!IVsBL~f47W$lX=+^Sqnw_KHmpIn>rnci!`8Z(@SR-BNSgu5xt zyw38xGQ9Yu6n}@p9Zx6=Hv#82H;f!lGYcN;<7CS!T6kv>={o$B(s#G?-Q)T^OJ9n9 zc6idODfedU!=?U{lz#ddVdIk&-QIJ`?PmLT-J)vWt!f(!E+N+25>=*GNzXkg_jX!# zt1=q?_KgaoMu*q$NpU51sx^zlS4=mh+2K!rN@;DU=gEh^Fo)B^`+rHfs0(YSpq;&k zzBPP#JNxw=Mpw@_J#AcQQ=WbXo9>{|2LBJu>b$V~0aJbT0#p42*mQ$Zmsskvq+PQ8 zRA=h_rd4>7*>G%b3|1~|m1vZr^Pr>iahL)P$9)8Co zrg{U|w3W-IhIy9yXt`PYQmgiTf7ZU*QeSEHVx(33)gP(7Q`J7tQqNt`A>2E~UeiwB z68<37p4^`9@9Jz{pTvG#)twlJhikgqx7zenxv{7HnN#lhq=R;_le6!9ShR3TA0LIm z_e-wZ-d!)2F>d?RDNa;l7u>J4)0Aa)jaRC?PrXbSx3p=u^eJZJ_OP3Y>?WZI=EKP<3^CJ5x`ukGf-+t5N`R|)v5>~^-Z`mr3ma z`?Tbi9aeKKJEY%0ySvA?Ryo^ZnkVyrW7zkT9rDmw_8xN2K>OvBudxg>?t~}C>9{&B zXp3{ySS46k>1I-?+z*TE+v1#cQk;WN3lBS$IFpBLHv=2>#x^zI(&g6?_D&KQX>Tt# z4ziC-+Of@4XY7zy2HA7^uCt26!zRIF+Tc(EKEWWV{WGvmbx@WjCTo)H(c z1)hNevYYjJ?#v1-s-aMT(d>f&} z*YKSj{@-hOh86Gdi85t4Yk1$AR=m2Za6+C2H=t00wkWbcR)YVn;o3K?HN5dnYYms4 z!5W_OhBZJ_Hd|}B>`d0M@w(N-PnZ3Sspe>@o0VVj~3Z4_!w~gIjR`4C+w+qz78@0*wKlu91f3A!P8P3gCqxBox zQs}t&Qpq1^&*=M`6@K6Aj06_oNlSY0ca|>u6IpN;YvYD^aTQ)p3_as|6elJ#VUiO3 zxu{2tl7h2Y8)t+sKU;;EZ-tn!d*h!Wnv2(y^eh*CYCC#Xc8|2@=qu&eNPD-W$7xUP z4G&1qQTCh9?iDYd^_MUP=fnkV8O%;pfr=_rsa`alFiYl*w&x`+e$6z=SRk85+pD`gY8Cq~gMTjAC9hcvwp8x- z*r#6QMt8!3%~z%;OvH@LxS%cQ1Vc67wqSoYWBLD_bANp`Tv*82-S*SV){32TE-Q9W z$ck~0>^PSddl47QDtVWhJZZ%iS*pQ#;y8~L`|EnsvhOz=P7ZPKXK_JWh#4D{AiiRs z-e9fR;09~OCZ5lVeMTC}G?-e@$jS4VL=8j>-uC}5Wz6G9`sKGUH zL0c5rk0`^GJajBR&a*CRk{?hhG$yhgnLx269#kCjJTjJ#=%}C_}>~H5!e5J z*6>;3{}!=8l7@57p;D3|Eo1G|GHO?w#RNrb19S{N&s@DdR=sGdvMrvpdiySW(K;c& zHO_wd6{lK;8Rx+hLv{>|3)(^+m8JxLuHE5B)tv@?Yzz4>C*)&m!#7{VT1q~JTM%L% z_0$U|FY5NPZoGYDM%DAC+N9No?58{u8N?1WH9i~`Pd+GWZBQ zu@`;6jSJd(k@2n){JHcUFRd|WslG1U;U6l)ovoB+Z<1~k?9-C2dd`e)@KsVdfwS`{ ztC(A)J@+av7TbI4AIMH6{7_=W z_I~;W(q*#!H2o8~XtMp1PR30tn&CwW3Zv%9+R64_`bYBdWP71LOVX~e_jZ=fF-_LD zH%)$SFXvxj-=x10Hml_C9sKY5aY*dE=4MgIk9c>{Ja+ z^P7!MJ!!+ST5g$UAFq#;Ez=0*K(^fJ^asW?a_962RU;F#c#sC z8TPj_^)IFOJ@$|EPs0cAv0rbas_%ZP{!1$Ex4*gULw2ka%Cri?Lzdu~^P>g=~N;X%9TU&v1n+CQePaHZX+j|pd1*?V`e?Y&Y) zJ;F7|O1bh88o5U9c!b<7mlcoLd)rzj$ks>fqj{##Az<$@x_+|hcI**dxxG4xK8IAF z-BZnbu@RSBgW>X(X<7Xu7MR9%(K9ZpdkH|khw-2#J|0{QYZqIh>f0*r!t5O(sFW5A# zJ?*W|GF@CPuVby>EI+HdJc9eeei=hJ^$R*|G)To4_DUYAB<@0aoAlqsxD1tl?6SM{ zA#$TCJs5s`m;I8CdU|-@xAqwc`uy;v-`i7c`Z?jLKicOd*$yR!zdK+*Th}Y3N2C2b z{fY3^jrKKs;1PBlvR|s}bEV`kzMmBTVZ6O2&#Tfd*?QQ1yUkcGqnqvbxVv3%c45|Y zW)_As^qa2ddb{D?mc!~szq{;hrqX{NKVtvEcI0~b>4<%mzD^!)K^O?X*kYfo>;IIF zN6pxW97S3t7c1>G6Vf;-Ic$3Jd{ zzwr;kA8Rht-^}o5Et&1;pfq;h$0+_o@A0mebK+uL?irbR0?2XUIcc9r+B@8(kesNo{dA zM=z$uoeI0;scw$T_5RXK$+rKSaM$jRR9){b1F{|c^jE{)Y)87y*78;Ox}J_t+NtjL zb`;va+ZCSM+p&bcd|~zFUuIwK0-LT^eL3wtvoH2=eqYDpL_IV7?qJ6m?Q}hSJkOEU zfyZd4oaq>ps#nQ*V;q}oMp%q7j+Ocovho7QkNRe*y3lclUKnm)L@)G>;vVNn7tdJ7 z9^2km!a3s{*YiM99=XWzp6!>H<;wAn5qe0LjCZW(VW1RU?08J?68`35N48BLC&wl@ zp5j^SGOuH|zB_!&L`PM&&3HwO8ywlXC!BqwV_1rQy?F0%^wtN2Z@I%UH_5g?7(RHf z<4!&G#yJUE!~7c$8=S!$Gv&_v9Ru~J!>jIhj7ryc%lAvEbE_mSBk^ZQ|7DbJl8cr( zrs)?;NC|nWz0A>)uJ;XZU+0*Vp!+5JRmVTwNqA+uIJ#3kUK{25UW@NoJ4cu)OP0m2 zIwtaL=7(1ugFDT?#Weo3roA$@OU`SKEZcXt%E;GA~=;zd4>u z*6)%lTOE`1Q4(r(5*>9N5z?uF8Wc&m3l<3I_l`lTEF+G zW2a4D5x(qq$CwWKz2PU?rCyw(XUo3S)QiUM96&ms`T7uRbkw`*SghlX>Ue>5{GvLp zu#Q)#TI}ROfCv;Hqujj@VU>M>8V9ToS2c?nU9O5 z+bO97^xW{6Q&O3MwQ_xz)b6&Qb7Vo6R5xS4woB^e`s8r?%+x`)jP^Zgl80wjlecui z>!BVprfX^+9?H+`n%YHA8_^?ykBWG>`pFNf`@@IIquo*;(0fW&_tZOV$Ggjt?y3Fs zKC-!c>I?b;Da|INSLMO%)Ian|@<5N&aV)%@JyI{Qecv^l)iZUv&L;))+^M(ey`;sR zI@s2dDgAR&mvdr&Cnt5KzEr07O1(qx5&o`MYMP!^=puR3K0ajZd*fHb7{6e+HnX3a zf~&>eC-p@>Fxk{6)uSiNu|BCc=-p&yUrH~_3w={Zv)%pDH#MTOX{_y^I)~3L`sJn; z>YJoAH+7)?T6l48>Q5c8y>lo5zc0&%rsn9gW%JO~v#HTCH1#)ihR;iVlkNZc{M4=) z`bF~A1*ug@h0W%CaukLqU6}fSgN5_eB+_;M37rSN z=I!inzqm|K4ErZ_u3R&*blg#+oOdPfV%{O%^}Jhne|^zW<2di`g;a1oJe}vBMn%3bH9Ke3i122GepHm+e?V&#O!BsHuBk@8%9n(Ig zet%8NgWA9fO$%@k9Y}<5`yfq=!OGL<*=Glg2p`jXVPFJ3f<~tkpN&|69GUkA8SToH5qZ%A24EUUlPFX14i*z z1ORitAplsBM~VU*6znAcnD_$$z;aUN{t|fu0YHBv0enTKm@5J3?1f{P3(LNtCs6yA z%t1Gd!o2So8d4tnFM&}{`<@IzCv1W4?+;WMH5mF3XEL+>duqhJ8~(_%&ddWXl1I#oV1X5^xG!@OJqDTo=B&^IDx zM4|tzm{G(W3qT(X!VvUToEVq@1=NG?h4{md4+df2Vf4!HBh(+N*8ih4 zlt;zq={YQ0PvkK6YRu5`8RIu`44v=d0D9kx88KC^qaJ|;zlj;8FtUe?s6eCChn`=t zXBm58E%d`W#ozGDvW~&r(^>z{1M~=i=OAOI6iq}1-G^uh1`fvz_i%b}lmKDbG3?Kv zUWY~_2(`pUBk@e^VFCL@S=UCR2D`d$jYbRf_GmP6(dYGSG)k47yV0nHzMMwGUBL(I z?*5HNISk}B8d2yRh65bAVFY?$Jq(>jLua8M-e`EBc4nhd4c)NxY+=ozK0u)23Q6) zc0NDMgdvy*>!23~9%(fE(D@wxpd03nratt*D6E8e>l-VK0uO?h=@|m=26_S`upYW! z#S!{ESPgwJ2K{f~sF1Obpoh`78;y{%dxws|0E{X<12FFo<^T-9?Me@$P%~&iIfj|g4f9|C zdSMWj!VvT;>IaQl7=dmAse=LNvmG?H!-^;eF%Dudu?PnV2MrI*>wqB)C1ME6oCl3e z?hqqs2aN*gbR9H`p)dWQQ4T#B2aRf&cM1(ccb9`kJ#=OsG+LmRMg4K~80NtsEE>o9 zk8$8b;OTmhiy8vSKF9?Mj{D&N22Z5{C5PHYI2epQ3=KJGL||+vJyUigaC|Whopq3l z9_qs~7=Z!kJ{$kgdCoy2s>&Yx{i6cILVElU9GrX5@WbeNIELC73}G46CXhPlhItoY z56fUNjKDIeT}a^23xhBKYhe`D!AKFAhQYB14JYUS=r}T2!GZ5$B7`AW3+rG#%$q>U zCNkS$9&}$y128a&A%S(5Bfo?Uz#`}@CXh>MXfl3a4Aw#471&L}&y<5kDJ;8+jAHMH z6#)(c9Mr%NjKB!2hjlOpwSO@;aFhq#Fa$l&JC&Z`Fam2~6xPESj6tuD4qS#kEP(E- z=>YUxLtrpC?O=uBdNZ3jUz~RWkQ4hUhgq2!pU1Mk+W6aZt9A zim(pGp#OCuor(eUz$h$+b#Krh^u3KkAAxK`5A$FE*6m=ZO3=SgfH3j_4Z*;N_=mBN z@UP?_Q~zq#zk4T>hl3a_hoR4j9BN;XVpz9}9$!P`yRn0zudq}6hM|CwZwY7`0Yn*7 z#UBX#I{f{7&}dNnh4OSd^eaOFy}#kFlrpR%MO?JQd91x*wVh9}N81WN6G* zX9JNd?rSm9s?KpE35q zAavRe8QWDEmQJSuSPApmA2K2^0;4e0;gFHX90+tgRAG2I@Fn30YAIA;4g_FC&4tuM zMvG$FAtQGts{neT+jYn&hkh7S1&U@*C*UP@bs3NFMc| zH=mBEGOU4lXV4MoJQI5+aR^pIt>WxMMvMdRNK(gaj*U8GB+e#)3l15@(0d_0h0dZw zMm4M(f5>Qnp^M4LO$>$ikl};crDOocN)8#$n`!WBQVavP5-{}MK|RGg>F6zV2o}JK zP=H7{@GT(_7<-CT-Ad1%Cbh6Gh+~+yl1xD7GdQ>n2hamU&k_I(JV!&&Q-i%K!#Y^D zhJbFz{$=c-^A+r1UYHKw&iW745*dP6gos$bfi3i0t>bs-F?7F+1J<*DJ1K^-4;e#M z{)m8}n@3989XR})dNBAUfh&GRAkfS6x;m)s!R}5v`W-_ALrsT_+B?V7a4~hMlU&R)G1zyUU3SKQ2o^R9X6^J zOAZ?m=)U%_q0J*B*Bv$rVD#UIjX(tldDmkA{WlTFJv3BKAkbYwAc_wjHX2~w!o!B= zUNW>8$I!nLIjno;u#tHm4p$#GN})S^*r-)}gMeV*&BI3S{VKzU4KIwmMc^>+ox?^& zNC|cvHWDAeU?&Yg&zFada_If~uu%hpdvOG{{~k7C?0k8@V#m%GJ4g?p{}2trx@H=h zPdz>YDTYzK*{FeK$<2ngfRuM`HVR-cz1b**vA)d}My)y++-xL1guze@ps#?6s_bbt zG8f|b+-AcAwK2$HVR^Gr4ZU|Y8!_m40DHFJ;DgP^b{JWNp8x?p zLBlYz0zc5bsscwGIA7v(r$sdI8jfJ}^=6|Uy0Y)4UX2ZQ0 z`|k(O1er;p+9*Ji^D^A0u}K^RLqV#J`^am1)z0#83;)Wb+c;Sobyiov-@ z3^#P2cf{~OFZ98@F-HtPbY5`8sD&C|zfD}GdVa(xgVBp{1S1oU7`ac7YVQ%F9QrRg zVr+-8N!TyP-{nUPFANnE0E|sOVq`w4&i_-67^NK4`Dg%oOO6-~FmMeOp2E>|B7dAR zOcYWI-7o|TU<7($9V~@W=!Y>_4YkrEMhH6LcIbvtmngx=e+gCSV=9Ck1Uo#kY1 z745+y7=xu19C+r?Ll}Vdunxwc`wk+1o(j+dL$DmiV6~FpNdqtlW6(Jl`x*j(Ud6kP z7y%f9A?UxG%qV#U{#N7Pf5fQpbKv732(@_x07KBZ2Hs19FnS*;gE1I|b@!uxfd(I7 z4nQ~b!XPYH@&}I?HP8d=U;t`ssSop@yOIn*Z{?8+!^eStJ^{ec0vdqY!#IACNdmpl z2TP&$2t9`(xEz({tkmce=$fr;yB5avRsU=MxJ4@0mPMk_d| z=OC||3NPaj7QhfJhVG?QfO*TP0DZ6?MquIw8hnDD!XWg)DD=a;<=DdrY=E98nS8Hc z4~t+OEQb{_4gwtHJ;fw}K3E5XFb1PA@m1tcQxQg>A9{ie8T*45)g znoPn>7=(E+1dCt<`krR}*KtseAPNI825X?Ug0X^5SP$JW2J>KIkN}_?dSL zfc45AR+M4rOKmay7zSZAjKUCfcWN=VLm!MPJ#0~W==={oakdz-Hz}vJ7^M-7|M}Ts z)I#qmEk^Jy*oAt~53Ap%VRwsB_bzg8i;=mNp`P4QVU*&~c}0tni$gE;!ZKJ2qc8wt zum-xXqz5n$)1s1JiMj|_ySQie_+fo;JKdSTf$G^}_NaxxOE;J@q@ zaZq+QJ%OQlME(vH@1+6gdk{y^Q$-*ub&Fe!au`@fk4T~S2|57%E2$5o&rp9G8GDhQ zZ^!RT*ux+Uz-WlfLFc<-8*rl_z4ldN6)^X=kHUFGAE#i|MwI6 zfWQutp$}=;)@pcRuyd z5YMOZ6M6$6LF_`!T^_mDA zx|_)u^c-t7D!jX>_&ce9F&m#Jqo_+fY9!W^fuy5`8~T&^>{yjk`0N?_?0o(V>m1na z#-WqXm7y1wt8&^=qXy=|h?1utH5ya=p!UL1V>`@)QCJ2w)iBJ2QCI+dYw-swq8udBfNvd&A8-u4Fa}GZ7NP+d zfZLTGYCqDz%h^Y-Vn|>J24Nknh2Fyi@-y-yWD5FPsISVcq#C-9Go-%|*dNHD z*LKW^LLY2_p~Pc`cR%ajn{>=5-A|99AG+-OzKfOQ}O?9~vrjU|6b=YNW^~M8+jbhs?or8yXJKs8B zB)18nl0VD49QzR`$WP~ZGw+}@PIaAWOMG1h`e>+3Ci+}G!EB$a*D1G-$r3dyToh&MuuE2Xgs+&WdhwSEYc1-4>@87YZIP~5yLx1`@HGZkn+;TE9}rVa zCSL72lmEP2b+v0W?sr`6nrh4ZN(Nrz`X}F^ns<%sa=k@%U*npPRl4KQ_@5g4W>ZEZR{V0;8Yw1Uk3{WVSvDeZ%RaGfZR$NPS4brL* zl8M)Wa#;;hoWCA0R&?htQ9QOormk`IlEKqmrxNev=`>v~OQ*YrX63FvU`$m3l0w^r z)I>FMYZI9ovUfU77bv(AzDANKX{D|%!*cn;LI+hL{!$g}N&J%*GX}N^A?<2?kY}dJ z6{W5oL^!9E_G)VW-qnXNi^&$e^M9asm%4gp6+L^va4Tm;sZIse$k$kfBy9#(+hxEE zQs9x28KfX2^OP`GmMURDcFr*KKVYWHf4|sC`B#pnq^RZ=&153fp#Ix@MjezbsP%f; zJ(FlkSDqY=nv-8+6_vDqGbamVvO+*s{M#ImE&nEra%oki8p)dF;?J?j*jWf;GEbF! zvVImL;FHE#L|QFlucwjPt71l9CRf`_?dcX4)T6Ig~Ewmbu{97^c z$-G<970A9@u?$M#ZIo(c^=+n4{dU$@?XtfIHZqfqQfA*y&x>1PM)qIgn`Nq3+)hM6 z*?BwJ+Ac}uxb#U$IWdqGO18{C@?|-zJ|y{bFhw~B8#<=Iin#;#nddbAZIao$sU=p3 zx@*fQK2SfQb+y}#MD09BZn}fbu~e4cL4&2T@eZOO@gS?_+{TmU^&~27?y43@;hl82 z{_($ecrG)F{qIg9D)l!0Z4IwQ?UTKz)!e<47MV|TT|;e&6J^|7*FW>M|HJ2fq%D&# zdz`q2)WltmyiRt`#S1fbuB(eJ^Eyesi{3;f|1P9nnRpjt7nK!vxu#;H-)$y3|86xA zZ#mhaTC;r{g}>|9(Bqj?H<>Jd~MOmo>jlk@69r)Z9Hju zDqr?qYW^&`2VXU^;~rY94>z84vQoqF0kxx|-%BrIlB3|3!h7j?CNAe<(DqWs`*G=) z*~%&+i?CvQS*=Pfs*WpREfX^)dzFH-4T`LSjenm;$Fa(j{QJy-8han{vFWK&i!8m5 z4Y_(#qtULdS*X%CmpXN#-%l#oOYf&nKo;Ha>YvqsvHb*N)${RvRiAb$t71ud0C=VF z0UD^5$*L5UMGuf#uk3w**!`kE2ttyhz!swrloEw9nWx~96(GmS7j3>%ZJp1Fa6xiv zVj(*`FEt8lb5)yrAEcE`Nvl*RL?m8y*d?p-<3{6rWqFr%t}=&bfV!9}tRx;TLMn-e zJ-U*a-XH_2OjIdsmwi=iR&2oYG4aca`D|-6G@ph_rFA~haRONY8f1h*u1r=al{pJo zFS)Xsk}dO~ytlx0jxDoEk{?n$B;!mTmiZ64de}0XWeud(j)zQ-`#@GhbE9#F3j4neA2!bzg%8uo?K1gcgiMi#F<}Xz%X0F~qjOcW@t2w+x2SNW^aXOVUJIJy{ zu5+05yBE>@Txngz)u%I2hCS*!V`9U+ll!68==jt4C*`1#rMwlUI`6ez&SkIlQlWGo z#y{vgg7!DPXewA-+I`e(k&Ta%>pa=}D2d|T|}KYL_dwvH??r-QO$j}-FEELzS~s+Wz+apIN6lA`wuIv{ddb{YLE0@lKm_7064QS8a_O|kb&Bj%He4k>YxXMtIZB*go+AuWPbsT@d6TjCgi8}O@DE*Ju196e z{_vc+P+L{0K(bcR*LoSdiXLzeu!fnOHAL@QjiyhK5vyeHV9zLyiDE;bAMGQIkl>aPp+snm*AXQ zjLKzcE#t-ns-=@G`i->AQr^g&Sz?uZxzY6xlmj+#-C6m>A>-{6X8k1cWWPe4a~5qf zM`|BPalUoXSgjUb!-G;0a=GQ-ue%15y``^XQznfH#JL%8*|^#4%a+Xq-yp4<&5Vrw zj~b&-W!Znso1HBb+0N7603_iJ=3J3fy`gSZzL)pjFnh1Ri95#RO}fGweG}7C*==D! z#4OE;&_$gyk4NH~EB>yeI8R#ui>6R^TnbW%QE!wS?thXs~ z!ci!fId9{It?6xC*GSSkAR>kDpbN_EckmLFE$>jTMfSa8wpaKrCM_~Y!7b|*IE^Uy zBxkEixl8WY$^~fR6|!k7sVCBH_$ijj+wc>SdE3-_>cMGBx7O49+gMLQY1~Gm?2g+p z&Xd{OX^m^u?KtKtWe2)E$=_k><|(j_ln~u}n6$_Ug^_5&6h9KqdGi({I|xfQz1wU87U9fz8G_Ttc=#w_HYdWApy-V>WLlh_YcL ztpm&`1yWnbI91Dlon~o{Lb2>nsFkcw0C$QCoVz}u&*b|PLJvyLr_}RHi2^h6Q%sni zpVFUP8T%PP_?dZmwDU8r$(G-$_ID1|6__dc00|lV97(AqIgZ39`ASl3Ne11fZgNVL zq{xy?LBfd#NmfB!v(cVK)b>)>3=g4ZdsG#2W%uVq%01E-tP=bx_+{c3=*ne=DpgC> z7mQJztXINX*`b8o5-HS6(k{U5l0uD)-DNtPw~LPQ6lfR2$YxgWn%+TM-)!t`Cm-G5 z>LUNCcb&%2H`be0g}XsW7VRcS%$eQnQ7w}7rR%~D&dtrn2;CaU2fuVpCWgIVn#TEG zv3#9x%ROJQ>9NIrMMInezgBmy`jL~KbEpoFzf0{P^S&njN(G)WBk{|6B`LQgYmt=6 zUL`5DBwr)pT=NZ*VoPGbTV=XXNs1I)2_unsWVVtND7X@4A<2^!N|I|ymLqY?P9@2- zBp)DgT8H0rm}ngy=TI{bv(qcM5zvmDG;-=BItaN(O1@=|aklyvkCh6pgojWBWQ&qi zTawL4ShJQSX^-p7ZcZGYc+aFR)cW{oUOOUJ?r{xgNETto*zVY)cE0x{IZArDJBl*? zG#f=(t1vW4T_rD{r+T_G%7Eoc)?V`rTC$f>^vR071j3Tt%V@EEPu*$*L^VRc$w4d?7TK}1_>t%+*c3J&1+gL>OU)XHwqs<1-Cd^x)Yq%9qu^eBZ z5|#gp*<6W2R2C`YhP@{TuG)F%A(fsjsA*ugGG@cy&qclVoebMgZ}OysBJ-_kzZvny z{UpsT`mYF!Wx%fpd03%J+(@YsXTV?87;zf^mB)fbd>>QI-L{t+_OBmS!=CmVscn(5 z3LcsF8)*;7ir;X-$yb#k(r6*=04AIv6u62x;OZ%L2VA*Hs<+Dn=2|~MHIL{qs(B?R zMmUUQ4Er*fr-Xi45wkoiVXh=KBIG(vp;*Q?T9%ENufv(IUH%(zDiPI`5I3Bd!axYO+s$R5G5(##ftL^AQ{eWv4=!=wFStH5rHgvF^Oxw5f^>RcGN(gp5MTFp{bD?MRqQ_3pt_IIDhmzj(Hs5#|I zj^cCB6Er1@)ZzIY=30kSIP|K+F67%(K7@peFCP~UF zS$pR(#=t9$SaHGvu7v%jBIh{u3aHoN&sx?aw(d`=J$)i-GC1!z6~-fBJtzrhK_!`s zgik1xgzLZKOu2GAop@$Z@qb`i>A$P&q@DbvNU4vb=5oVSQ+w`T;u!RlilYQIV>jn_ zy1`wjLV;}jodM-O{&#bc8^w+tN0?hI_#pq zVM!iBvQ@Sy$w!uCGm9n!nl5`UB{I;3CFL2KaK zfax+sUG{G4kUoHpHFhANav9K(fVfNTNTuzv6pYC2*kT+zA?M2V@*1v65?hSq_7vI; zYM1Jq^ygDcrQeL6O;C9WNm`5bs=B3iK zPj*_!>4cETJEf1#%It9R)^R$4j9+J70Ch4)J;|Bg)0S!Dmjcq&!}PIEq?{d`jAL$l zzGmgePrn4T(WOh1{$7D-7 zX>5?J3|3NNKbe`4{*SC0?e9HU{+eojXNKACzKryqT?>Y_S|9ePMtP~x-;b5^H0gB; z>#;`WoPuvEfvnmyT8)0Do%N48AKPnHj|;nyP~z!=Yi`}Us4YO&cOhoR+CrlOR{@#y zvtV@V-?n4>Mm5%jsBM{N$rYLD=cvsg6TjRMWm1JztjDfe~4Be!EmGW; zmFgs?E0$b*byaRIlPkKW^SRGua!1$n+p;vW%f}~weoID$|Jm#6>M^NX`cU;u<*aV$ z|6qMob;B1oZr$)zB(2?8N%bvp8bsXNwa0q*0Z)!^;6> zlAlBBs%1_N(bvh&9BaUOQL2?W3S0;FqOD54-uc&)^#^aO%Rap~>S97U>wl4$A6y+r z&5eap7f?I<1htCv>$lXou%tIZMPyNLqKV0RjG5m%dYjvb-iPqZq_7VjQum)ceB<%3 zp9VrQyALt*u){)HUt%tm8GX&2cC{)+Mem1)Ouojc_V~7!TF1w?svhL`GaH}SFMUFe zbIeiWYGuM|zt?8FtnFMd646Mky|SeryO)+Mw*Kj7FzzGzrw{F&m~u4!Q%R~S`!;Xo z+lidV4qE#K!=>k!JOE$Op9x#UFG>&>*T}i%Fip%gv%Vr1A&+7dxEdM2;x0XfFJvl* z@t2yMBX_90ZBgpt?njMBmC80HP9;+@(FcL36b_AO@^dD$kU~x#^s&q?lXDP^G2Rfb{m>LSl=EVJ2ZW$N1VQNcewnStV*Au>vkDilYStp?bo;n@6T5|{;RN4CaxycBf~RRr|%itHFyDO<8@lx zDB%h9V^XPF^a8oMDgA=1;8;tq(x6@qaXk~EiMj17vedbjR{Q62tGXtQN*%n=QcsMl zcgEE|$vK2ti#xv{t}c4gsvVSxO6`u87BLQs|}cw~oyTUssQfEG%cOtw(fLOs9et&E0SvRc!JX89ho8aWb=;p`Wz zMj}#zRhDP5rS1`r;pMfK+9Qilj}0!c)K9gus-O3grHi?{_sxfv)Q3oHl)RW@sOufoy(r$5{0&y^pv+Th z|5ui}L%eqHSK6GfSL)~;mYSW+eD%N5a?a{E)s2>#Ckf{3lCGB8BWcH!^EWMZa@=_a zyP^usCxxckZ>f!V?cOsiwO?i{wcBT@uZycszrs=nx&0%{+CEGDLtH)OE=wK#$&%aS zjgEcQ>QQ8;CFe(`c}=rJtW?vF`F&5 zM{<5wZP%TwF8q(B=7L(Oeeoe|OXHXSYE#ccZHs;@%YIKElI8xz^74H=#KxDcbb4g3 z@)Fr&sqc-)u$t?5)dL>P{DE5g*;1#()swiSR%*W#Ds}L`mim*p`rMtCnp-DRy~|R! zg}Ct%ORdQYrS|Q$)OqpRzp}2B^Puch>ge5;dVXBp^rqE8O>{%4ms{#h@#LQSmZjzz zNvZuSEp^-Kx}T5Xtf47U>d5Do`m1U)t$vq6y`E*xnjKq`lR;$9TH1uT_Tuz5?L@Thmo06pRaNUeJ)V>$ z^DB> zBq;T@mO3fknEyRX?U6#I_S|ZzzmKa+`I5ToC4;ZjzA{VQ){*A8nx}AP?KzgZEerqp zsLlCKrH;&sJCBd$&^7G^J z{#;O4nc1sa^CVj8bK>gxT`V<|wj*l(W{TPOwn_U~rln@bQfhy;rS2E6{Z*Ew_Q-6d z_QdnoHl|O-Pkc;T)LeIL?3iIbpij&gnjei%fVQo*ZGybh*J>l)gw{6Sf>M&0p)O^1 zQ#;Fdnq}2CDM{-;I+~JdnN*(EMsUMCvvKO;>&XqcNx}|Pg z5ue6SqCr`2Iv--G*_X^$+qpC-dzIRgZ>fjG)&DzZrX{0x53xfUw`}5O9CYrOMg5Lq;0Oor z-FwH~ySul%ACq;v!0>;9UyurmJR@3QD5@c-MIk)ag})>O*4Be)g<@wYmn2Z?3h!mf zCe@&W7}qnnt`S-$cbC+S1kzF;mgb)nU8TBefRK+cKBp_;FQO2e^dYnvAAZ zh(<$RQdGkOUyO_Ap=0B=zvU0|M*20aTta&3-8!Tle=<9AV$JpdoL_T5dC;tGK CsXD%374ARnVd!se%?oDT)F{ms$9WtA^=MrLKNp^7g^6KXdg}-~4v|w)S)1d%XVU z?OXQi+lT7~Th^a{i%kz~$;jK$Mlad2ca&k%LtFM<98_3&Nzj&2VstcJCY%3i+EvB6 zmZ>FcWm^g_8{EdGUAyJsf_827#aq@)m}t}8s~WDp!=_EyGIQe3$$HtU@iz|Eqgxi; z*h9Bzmuz`@`eK`Y@2dVY2kYfqCeQp%*S)KT&3Zu(tg4&UiMlPb9-MZ!^UvAz7edi}>TB>%P6kcNMq0f{>Am#Q_%i^}qGZHi{PMay4 z5trT*6PMI%qLNcv87mhyi%ruyXivt<^G&@&dns04QraJVqP8to{&dq#ahjH(RmaM6 z%=+=#r?K+9{tw4%T3hXV%Ic+S?X_KZ>oV?ATT0;{F{9KOGaMQt-4ZK5vhvY(nr7G9 z_^jB|O?{G<94ouba(gX3R<`=qMw{8%Xol*mO}jm~^HLi_+f(Ys**axp4Ywwk`}rYe zECgo021-f+>N8_%&)?L;Bu}aRmsqun{-$0dbCmk2n7ZU|>MgQPsrSUxWq(uuEH$Xd zw7JxBUj8?Ax0pQeH~HY0yy9>2izH_}tz8>aSN%;rPYRX#p_sb*Z|ab&RO;tq>e|1l zn}a*Y+iY(-w~p?h738lNy3^A^%U>~Kw0xS}=4|~_N$k+3hrUHlSC}i8C>)fTmT)Ps zxjvN_JGAMpUnzSmn_m^E=mb~F=?Z5(aEY@G@3z59oN?oO>hC1f)9OwcwIXqgK0DaFBJp~g zUMf@kiFc$sUTm-Be6nP3{*nXrcg<}!?hD;kNW;hEH-DmEpBG%XGVuXhmxC{0wR@Xd z0QpP4tG}e!H2e(1@1*-9iCgt9!P-X>ztZ(V!7Yy_j??uYq)mC^Sp5|#C{KJ`KPvmn z6T9dqBz{femHP8CWlf@?0(dNOn|`5mdOY#Cen?W+CVr{+3GQE;IK7Qt9h?wIygvay zU#(AENR^2j5~s5Yc5F!8q>J40V&e0*cK%?ejft6Y@%NRR$$Bp6*_?Q$ZcBVb=Dm{m znEs`7*g`oJykJXW?=~Gyd)TxZ{GgeQ^>W+miJ$79$(UfG=-&kEf{9_xqW zHnW$K_U-h!e$^0jR5n`b|5)m~gWqjSWV7zR;?eDiAL)MtKi-~rtc`xFydNU_SIVyn zLnL8mVs~5G;$VM8{WZydC-E#jEx7QV#2?%0&jkys6FaxD=?jB*y`Ok(d;L23`V*>M zC`Ug@YsT zx32FBj@+L(q=ReW745aLOHM4=Q{Us4Bh0Fy@#BMwk0rj5p}#K|q$T~~`th9h+KnBu zzUc74)og(`b{N#{li-D?C7s(wm*CwQN$Yg|cX4+~x=$|(KG!9wdwW~L8NvVbOv-Pg zKOo6{le*z&K;NWy^cy6qO7)W5FKL@TL3Z~`>SlBHmHK{3TYH?>n=Iy%#j#6_`ftNW zj3wWyqap8^A)PIuEb5#qclO7_+WmfX(GdH;z<3IuN*PPF8O)vk|Xs8E6g^o3hEap z#p(LX!S?w{UE8~lwrI)eWWzqNb&q&kLgMEar!`spG|QSs%g1SiZ*@+as8 z^3y`}cACQwuw9lfsAv!FK{lH|Vy$uLMtjI_a3+;mE7) zw7jYt=?dGEqeX^1OF!R~ho4Ql$<}^j(0DfKdcEhiS5#%kJL{G0EXy|THA*vQ^9}<0n3#?_{7Gf&-9)zZZJK+x=wkH zB_{59N;7Y?JnspvdO6A0F0bKnW#J~^oTmEWV`*mDBfXt$S@|pO%qLylo>Ka*mcDCD zpKa-j(60$jcrEGPZu+%S`$+SI>(;rEX z?~?BAuyNOB*J}hrcn0bAtPSOS-fZ zYbUpjy}SN%aAF(#>~g@MmWmfPM{FOku1`_w7fsKzY2Uu&Z&%Wiqf^1V^Li|CRPq-DhfT#=iCxDHCN zWR&S^#L*hdyu{L`%CRc4_M}}$j`@# z(H_(2jRQIxfp?@S#^|s$K=*Ev&wo86iZQaBnLFd2cF)s{>BFl;* zZZaCxmpmEX$6k8g-Vd!}13V>)+L)jNeJc}L?3DID+T@RBT`3N!lCVNw6%seMAr4QpO!e#(xeUiKty{*tl1y^J7T?zSNKOqSiQ zC)~Ej>ho<<)!#lXG2JT0rSFlxr`z4#PwY0;-7Kbf(*HY#eHwSm@^kIo<(|{+6DQwm z8KylBPma@ZPfXAn=ZG0fu%gV(q*A%RBBpPRbJi(w4!kmW<{8A9czLxM$cS&>Q}ZoV zejjGVxxO{NsM{~Pv*_buJPEpl{#eeSsv zW5rwG$$|H|IwoihJZ*#$tSBq80(bP47Y4E@`vrFmQ~_S`A1hOxcgZ({?AIr}X_W`Q zDfxr#{SuzAig7PV$zc1n`Z)PwuzgCW@82~m_4yV4wS<3qSNgl{UGyrsA)7T^jE?YI z*YF}`dh!}BiV0fdj2ou}t!wz)n6@>&r>x--L3fT?#Qol}7V+dWS;VtKRw`%7`ZHO? z&%A9GhrVd?ltmn{R0GT8_cK|<1Fd485%A;)2M&n|S|dzzDM4%z8#}E`+nswTNqX zSc`b?4r>t?oy{U%_?9(53%6T~xcD3vagXg*N`ATOuSGmTcCu&_FSE?kE_+LM_Oqwy zedWkG_PLYyylGa5`yQSg(}>+ML2FC{E0y5Ci+D{;-#U7KTf~nA-^o>T@7isq|A8yE z|Ft;ArDa=D#x-wkO`_wnD<$W2ds?4lOV#H_BaStA%Bmh{vvl1WW!bqbj|bl{U3c4s zmy<(JTY*9eT0@VUrv!hk>k-#V?s+VatAi8IQz4GGLX2zK`d5hN`t>Bd8?;(@SN0CK zXXA2;xXrw(mVaw~LN!p9DZKS=t(<@f7 z&o=nil6~!UYsr?${T}<&Ydz>rTC(Gn=}A*DEjK1;4LYue60|Pa#F(~q&`(*ij@N^E zd7R*F?YCHKcK!vd*|C*YjALc@1+3YdxL#Jtn``ovHCtq<1{R3pLe{L~71OfMpIc51 zap0ktpf$v_Pn96HW_N6{)@*2twPxc-v1Z?r??$m^uf}6+&HjtS|Gj3%Sj`U2k%gmK zv%5E2@z%kU6E(0pCTNYK+a@LW@0u;&Y>n=k&DNSNyNESA+)75DDI2Xd>%Z7OVu+F|5~%D*qIkIDMjkiBz95YaKv)ys8nnCH0hMj3SPR&tRD9?JUPMK?Ru*@MJt((fft%xyR+g`HH$Zua_pLorsmSNiU@Z^vkm&63EA&|`zLGBE?9&qNdd`e) z;9XKS&fYKaTB{hhqC)0#eh!{iV4te%rNP_B+t;_#{}lHm_OiER3bvi*tp8OjdixE%E?sIG|JcpE??~&; zox?hIsrrLUn~V-UXv48v=1sGY)u+hLX$1AAL=?^!W14-So-G4!;7;d(;MF(SBW*Y- zoil^tpF!^o``hU}hU#^X{UiNgu<;)IY#UX*_fz$5DZStRvVMyUT1;QhkSiA3&#?74 zCZ&t%$uW6)v3a%;Qc`G*gDpPHXGgERNuMvMueJ;NBLzry0Tm zV71}tVurA{+En+n)c^WRooT5Tyl<)xW|$H7?o5P*sslDleV$zR8N=|fEc?uUk^B7& zvpdsXGMicrtP!5u*=%aRG<-(FJ{0HY;13zBut_fe+&;*r{U~>TZtv#KJYlvsbBV%; zXTY{;ZE0_PhUwxSc>`;GmHeve@&xV+`&A6#)Gz38k9|`5g}sdDaPeQFd{p{<$+(P@ z%fGa{^~>cJReB-#=$G~@+UrAt`@Xf$h|@O&ul&)TWaE**)SvB(5^Sjn!S4^)&(rm% zquaU(Fuvau-(kFcAup)X5!rRveuu5c6Ed>NevkXS z*=84JJ!fWNC_}$(HkaG=_ck9^_xZ!6u8B(j_vjJ(Pqt1s%P&Xl&+8w{gUtvlgD*AP zC+qs{(*CF!`=Fyp{c@Q?gUnL6LY5t6Hoq*JDA_vPDjy$Z&16c~V<@i+o_EZCmu_nt zk!{EAckB1bus;#sAd?jO${l~&$Lp`k?mz91+PZxsg(sNDC#3WQN+bB>3Huh^{o(>M z{IQRk;cq=b_+!jv`iB|*^3`)3-Sye8`5mL%=>39Uv~jf6Sqfjbbv&w{5xh0d(WvXS zazlH^NL%{k;PdSrneFw@r8=2PO~GH19rvmIV3yO-PhTH=#OXMapf8c-ogFz0)LWe$ zYe?;+E{>i|i#rvL$dg?h6ZMOwiIUC!ZLo7!N3yODm;T)xef7_S1>GE}He32P!5e!x zK53)6+slz>v(*L{_HwMIFJD-F`M24ZyTG>DsxN2lG5f+3zCMms@p^9XKLZ_Sx6w0$ z$Fm(7?RbiI+BuE^$@+S^aI|Batw)s@qa9D{Z^+XZIeyl^ktG*97U+e+w)ynJw)Zv3 zyu{%W<ydJOmC>n9T!8dFWEd9$V5D`PW#-Fg+}*$2vCKy1yd%mpLBM&k6qDWsYt( zJ_b8B&haGAS|2NL?A2R>^Ts=tbhGt%O^llz-E?oT+bxbWlk^o*u)xtv9}}Fnz_BpF zW?vUKgVM{}w^I#|8QF(FP5NVnG%`wnu6dnyrpf%*9b@$` zgS%dLOi5wR^s08;V6&wb$gLvlg@cWK)SlWBuC#`dXjqf|&?#Uzm z*Zy!km#9A>|7vke;0a!3izBQ5@H}a_o$=Brtb`1^`~QWJN=p9<86{JOVUTkzU1Uf$29aOozHx8h($W$Cv_~=@m_Vj z%sT#19hX|iJJs=A>-aTwJl#58AH1tW^0&JFqfALj&SL2APe~3iW&3ta?w;Z97pHCI zi98o=yAD3z;l5mU2HH#R7reG(@|m`jAA84XzfDr7!)2qhQ0$dJYI1k|SJ{!8oKM8@ zX~`Y=yjZ%NmfT;@4~{-9xu05ZvpXeswI%kHWu21UjQz$=$rJVY!M5qi18ix%d(b2g z&#Wfrb;4_E4;kG#xi=5xXLe5Rq^C^o9>+&TJY4FgRC`z6ok zvx~l2$$9!$Qk0c^y8cCQRaWvZ?XbObFaiH2j}1=F)K|*(!O7=Qqj_-hALd9j0q^YsMMHSN)>a4=PRUX}cnULO4Os^r6o zw$9%K4|$U}CFuPhcy?wo?+(13!DnZtB!OGFL-=h$0==t-U%JcHjK}|TppN3)jWia;Iu;86mAfvp4p{o4ot7Vv>*2$qwPD2%ejyKBkZX9NJN z$b=6@za#*d{}lniNnaDdUNZN81OQ93Nl`Hexpf2p<9{LmSVGFQuaMUh0Q5Bwz}IAo zxl#<6BvPIQ2Q1;==`3cA?4v82#k6WSPi4F8EQWsC^afD^!$h;3=3en zntV{}O;2Gu^!!ARp%<3H=+6YumjL$DFbu;g=>C(2lpk1(T`>&7f)n`bLwzl3cwrV!z$#b_BglQQ8J1RZ;Aee1uR;JL z&^HLfiS%eN4yHtn`ZEdS9vmsVdkF*<+)qZJA7*18fd$aNl!jpTGU`EX1^)2kfdN?j zAbREZA?goS>;GXI%BJEA^c)s!CUO{lEox{vjPVW}!|1y>fZ2PZMpTtQrXGR${x512 z!N7N9Lj zhth+i1PBX`VShID;u?$qjI?hs;?Kc8zQM?4pD5_uU{qjN*`>i~hS}X4j4brd9t}p3 zvU4{WRnU{!V7N=wNACR^j1pL!)nG(mGzSMb(#~u!LeLFsq5muzIv4$r2Ezj*XEzw- zP&)_5=fQIuj3~^WNCU{7QyUB?<;V@#LGOYF!^;L%4E--Dng6u8y1o8zpqZVqf;RwAGmO~GWLhoBR%46(9=waxc2BT8hy-P=6F^niZ zY=)IE>jE+Xi=b~88GxSm=%JH?;`bVid{_x0ty$pr#zdbf_5w3X5R@^uZ$NhdxEU(Wrs}=q8X#=!YI#qfre@LmWgo2*db% z9KzspNu9zDJs2NyINJ{Y|p_%1Ou=bMqnAtzPQl{z+zYhLof^j`D7aU#xxpE&i|oH z$Yd!8p38_3`e7BUgtgE)j+BjOw!>_wT}cD5cmhKLD<>kqf(*cX7=^`G($Hl5z%UF$ z&o$Uhz|WLMqX-sUOGdHx!csp6#T-;XKMcVDtc8^@3L`KcN6vqf0qBPwm_3!A;4lEI zU*xS_O#ra?9#XE#kJ6(lH25N^gn^CpNbw~agvBpor??5f*W&k8{6X() zWbWS#5u5~lud`ZUpp=734hptX5mv$|^u9r)Q!#)Z7=n{vs$56n)w*)ke03wX3;!gyABmRDEH0l+9qdc7s{mxLp>_6~VL>Y#QXg?Yy z;u$pXCk-ej9yI*3XdwBZkw2Sq$Ad;CEOs3i|Wihd##Gqa88=FsdIis#V!`$S9gl1F#G_+a5APFaRUa-|mo+ z%^WChf2hM7nyN9WNYm-E#67b)jEEM9z*RvIAA?{t4T2of5;fB@<#*&H6Au;3vl>3^`P%70$2Q+ zKwvgc^1?9kEp~U((eD`|=s$SKsJc_F|G2}3Q*9KfhYc@uryn*dVKn2g;kz5X`>;_9 zD`B%L^YApAdVx#O!_XCnjj-aC=oP2%aMefssfUenMekuF1hpFu8`>f=a^qnm7lv*+ zZ1_t#aL&d6dT%9=duXVHK%iDiAc_whHtL~s#bLv9FBw{eW9WSvIjnr}QVDh+HsTj!P(uUI{ncTk1ZID8 z*rA+?AZCjjr0I|578j3Y@(s1)Z^2UNid{085OV~vB}Vuk@AjB zMlSTFHW@`Q+^4D3s8R<5n~eD77!1Y$dUC0#%AO`8eFcs$Xfix7G732iT-;zVfI~3MijaiW6u`sd!WgvhJls%@e|PFGz_F|;)pTyVs2L+!#Nh6iRtFLaJRV)$SbR>8BrowHZf@0QA5R48VFAg5?1Mo{3{v03)y% zHbXyjuEQV9f+6UEo|~{&a;QDcdiBgg@iYdo92U<$VuYdlW_tXLrfIhzhweF~8fL>N ztei`|X9;v3J%-`i2@q!AfgSY2@N?L~D2zh)^R!n&M`0Kim2%*oPY+=+tc8^@3bh49 z{sI-C2l`pZtLWV@~t|NvY`e7yX-c4qdycB=y@$Wlgl=?XE za1ekISPT7&NZkf_FAc)beWVPAVFXs*kN!m(gt<^#OoPw|OOzZ|K=%U#2#cY%k@_$j zYGq^qW|ti)HM|^nml6QcO@Bvo`*?A?j|PH!z?%GSw+fVF|2}7SP!*F=s_hFVK%IU`Kr8{ zv4;^@1q&V}gD?Q&H`5@@f>D?cJ%T;-!zvgm<)D@WXE_yK!6D3remDtgYp4L7k5K`7 zU@Z*5_$@T}I6Z|v=!GHZgU+?s!vL&@?kAXhuVN4LVI?eqrC|>I95|n3l0Xj(Lm!O7 z5R88f`BPMc0qBG707J(9kPWM#2Zmt*tXKO6)Se=fFdh0}HuS@M7=YfVSpStAlpqK} zKMcbP7=a-eg|$#yM?laC;{yZ$-7p*GLJur}1+WNup$`_r64tv9`e76nv%I}eWB*Jk z2G1~QSf75F1w$|&WfV9D$L65OlvzPoAeisJ*}>gFaXbofYVV=wT7` zZ6s6B$^U$DR^fLG87SpI+l~VI-eSzRGB*1eQ_4~3r0n^f)ImRt--iAV>|pi*>LJ$} z$P8tl-fVc@pxma}2*KjSW<%RfL-uB)0=*Z8U@@#!_OP@VLr-$E;lt1e%V7vsLajry zQ4KvXqV%v?>7nyYdg5$0qB|(3G#f=BhRoG$RKe`invKBQuoLy57nZ+6!|rAy{2$~6 z%|`kzhI(>ysZoT(=;UT23y0a)G#dr502aXz^usW$fZD(40d&Gz=!Q|44ddUUA(#b= zp$GclBwCGT@&|8Af6JPVBsN3>I8Z!-}^eCnLU6{xe@b2L*T26X;(=A#i)Xn zU0V$2M+Dfd#mI%Bel3O{M$Tw4>Y@MA79%T+{E8OC8)p4SZ=xcCz|Aejq#7D}ti`B= zkvAcMgx{h9fkbw+82M1!* z^OElfYzl$G>}!u2QN{U3jr<7uduR|A+=o4kF6UGB?1@igGsgyJV0!vYwFMKA)(VR0pnl^$w8)4(g(L;p603V8tfUSA;%@}_3+uliN`v(b0W5>rjZ}c{gEX*@0AMlnAEF|x zgjF#6FoFDv{0NzXo@VN+ato=3+Hr>THv&6>9A?{&84>7#&Cnlz%qZB;`p-@{W)$tG z$Iu5g`!OR7-7pHB$r%1lfX-t^K=CvjKxg_fBli!Oam?@^fL)FmSq)@rApYn;7}i41 zpkqb}c3$XLJoA`Quj&myW_Y?%F*Jh6p!@t|MtYP~jXY*}p(b%tU1!*$i{#9yuD*Oz zWX@EVD{cx3r#kF3rex~@!$z_7mCC_#-qD>0jKo$URPtwePr`oKN%A2aZ|CiknyIdH zZ1vkD(Mv-GlH+yt0OP%`o~KIh@wCpcFLF(;wvVqUhJj9 z+K9SXb{49zLUOdw)jgw@uP?Y-ZJ;vyfSAIPbDirPy+USO=NgIo_1C$k+M2(T#OqyG z>uxE$-ZhbLRc*cAH7+B6*8wB#Bp1Uuw#P9fk~xjKPAQz`nwU}j;y?Sb9ji*InMOad zWZyLUktGQ?fJxH-23n`8Dmi7*4K!CRdlmeWb0e4}OF&YTFDb0+%HODXWVejm;OZ%k z>8>+~ci42Ao+R_9y9Q^(uRmZ+RRNMh+qmR-HF6u{nHsWlI!&i5xZ=J+;*H$6IeCKPj3}M+SPg^Z+6PLMXv5dIJt=S$}0ZZ)#aFlWnB^N#mm+rSC5RW zXAc-| zn+Ri)>{X>QX}QTYSdG~%gkdS1Mad&8XE6dEshLHjCDMO3jg(&-HTp2QT3;%EW0Tb! zC`66%qS>x-c&JfuO6JY@E0@VPQ>vEr3X`NoAz#Ma0&-=|EtrI)<`#3Jr4-Y$CV9p5 zD_tfRqsx|+#jdAtoim4Alx+QHF2;6Li=q%UJ()kp?8*8$u6}&ovt|xa1*BmP-kEl{ zy3WbTed?cMJBtMreJg5Yw)P7S;C&zRcv*8RF7svgt>hsjnR6)xWc*yhuatEPnl#Ks zN1x`orqlb)^JrC*nt8Mukd)gn@krrq=+b5PZCLsw^L9#QvgCHtXC25Wf9#)u4NqsI zl<{}a^W5gB(d}>X%`(-C?jRzcY`%kRRmi?OaOsh}5@H}LC9a9K=3cU`gjMgCl=+yV zoR1A1Q((o+$9?mNhJQ>ldl$9DG8ecyb*@Ey@@AxVyWyy#Bjkz&Y>xRde*q2V%bEp5 zLE=G1*#!-!%)gmQyr>hI-rM|dwHnI=j6NbkSp^Q$i&?^N|$|i zyGGiY@0Qa`T^Dikm{W?UvU~pNX}Q~6(Mp|lf5Sg^sqLn^rWDt1X;3JZ6rZb~t^Qs) z*XJ6PQTFhuX;8`TN~N$Y@{#N^+3RBg*FVr;tT<@_55ej<)7~p7ix{{f8MBC}D`d?g z>J&%=rJRWWRL`p4qk6G2sv1t2k;<37r~pGAEA#JT4=&l(V6wH^tqx@>}pq##3l@H0x<*x3w=EJfSQfvKk)8lS1rkbw;ovp&Y z<-aG<{R7!pke}Qg)&I6!Mr9poFwRl-#s9VMio8H_R;ZQrKh$GUS4tsjTm2DPu!0zv z;46rsNVcxvJmHhN73K*d^FexCA;TU-$n=y ziY4bEbF-iG5Q!|2hKJPPuwnYtVW*7Rd;htF>^W-QX8KWACpH?6R@YE?$OUH*@XOFL5bZS4;`W$-}*Hwg&p}gfKJMXnku-&yY48C~Nb)K!VK~*S zBG-%^$f)KESX_ku^-?V!A7XB3k1&|IlJ^KhF<_`ViEyYUv?-Z_gxy$4CRvi@NW8L6 zNs27Vb|l48gCwJ5{;5}2(`aTtYPPS{=9zqk0++(8&FcGB)17=tc$9TfpDL$6O8(1a z3`G(2kF2ZI;ko8?K+VQ5M;OSEtP>)u&uBEr zBo6_t1);LF9b>1|2-(V#jB>#BM>(D&T~GC_jPK*#r(D)3E5Fn!q)Y!bfZcWtvH4`D z0;ikDXxu3|ATwIP7iUzfqqri!Ix#u^A}%#~scAIjJZ>*#&SS2T?IL_>GhS)-^IG!q>Lc^lE*nfgLr1|Jj86 zd39cIv(Bb^+?&HG$bB+rEmNsV)~v-zw$!X8Ig|Kq*J-UDpt`8rkFi(uCuq?vIZt4m zFEgGXs1jN7gsXq2)8e_ai{048?hvTOl^Zr0_7od@Xfc%(tzu1 z^0G5vR%}pkO6EGHd`K=?$KH?_NhVoZFwK#K=9(sB(SsG(x{@ zewtBb{yt;sG8GCW&qASsUlu92W!*Eb!ATLm^Ytbxt?l<~Wn}l%p7Q52+@}>u|7Wo& zmod*0KmDeZ6uGz2Fvv;Up=;&9x31GjWb+(hka|iPRcj9#bthex zsDWR8k+~j~G5f=F=0e@8O6k(_9DS{l{?F3`F8QBlhl)HPuRPDb6_AGKX{A7NUcfzf zzrYrKMxK7bHHals^8#TONsEF{GAr;}EyF7CTE?H30;Hz`=e4rFg8JD~rw}h0>uHLm zyI!5>UX`Wm$vJD6Vn)Sl2d(XQnzaDc9Q)uBwOZ@eBF9t32k5@PZqVP#9oMi7u3&@Re%rlz-*n^(K~$ekNq zeMrzcr4Gx^jr1s2_HN{)q)E<8uIaY=J@VK~%%8B-ykuU<^naOY;FUQq(+XECFB4Wk z^i9;SluQMt!6tq!|^g0#jEWsZk)#?SMu0nCze{ ztkE5q=F3(K2_dsIIYb*ySsB8TM_meG$=hlAUb&NcY*?yPASrJH&OmRIN=??iZBFZ& zw`sRTT2zS>&O2a|OnwJ1Y)$Xrx=i*d1SIoabUqpXE?#`H?p^BD%Iv2Nv%v) z&}5|orx68@=(|+PJIXb?xC*VGERXFX^+dW0Ke;mOJ^Tcu@IAGjx^bG)t@ZTcd#op) z)VxQd?2gqKJ7s(|t#RR6jbpA-s?j+mWw)s-RA3$LMu=`VCbg2W2l!m3<#@qf7nHADZ)R&WA`j zA1jd7k2u3dolVB%w({>vSEk(Yk*mK-@JFWK1_ds9K6Z^viu7+X&gT-c?FA*$qYIn& zOCPg&GeJJahK)1~m{AI(Hq1DcNJ5QSnyip3>lMnSMS;7-PfXpKPv|rG{)EtdqJK&~ zujDB(6FG>)BiI@JL0fe8Kmq(jFB;|8+ zQ!{M_+^+6;@{}aYvYCQ}6AzM%^l+2WmPOS1Qr8U2QL{a&3h}b_b0X!2>2p>Ie!l=- z$@v1^BpIVhB{Jg+#;8(ODq*>-S3>TO6slyO0{2c|f->p9NIrO+%amk!F)cR5#9($MCK?=Vi{vrjQupsfu zN+p?ONj4%Wkey1BZ%MvE!nsCCaxIDdZk6fG|3i|c;EEfL#4Y2MBwfK3Hw%eV7AZ-* zC0UC^lg&sy55NB@WXN96VYLw+22v z4xHz{CAuO7SKM;c#j;LGN-W8CB&>EzvhQ2hIbEVg(`@XYQ6?zhhvyuZl2p+>#eTS*|cRL0w<3U8HifIl@rKON#<)q>l0T$f7y| zVX@aS&TI=x$WHz}w>9yfG#US*a_dV4G3#D6Xp6q*3_IyW(?1@nY)8$x`g`UkoBQ`X zrl|TKR$cE?S0*_>U=^0}KM--1%vU8YoPS_7bH+uO8LeqD?oo}8Np{XRFYhNM$6uK2 zRB;@~1=o~6(#;Zu!REt>S@)|4dy9UgM^*ooZb!<6hmtm1Qgvx(U#wD+`4i2umVd%g zkt%hGyAMT~k_=Ahjoo&NA*uO^C|M;xk)CoH_A|BE@qacGxenOsKbK#B=Gw1B`u~EG zi_u?jsmUUR6509-3x?+EUE?}O_wtum@Z9=Rb7tNW26wM4t!EU=Wox~;{_E-qxk6f0 ziAN~=NR3Cv@1w*%sY+b^fsFF6n@)LbtXAMROVtC1hJAQov-p*;t7MEqg)I4%eJ~(( zzp`6ZMVbtrbeQ*0*K;qSVmZD{SMl)U{!%;n2|GvYP-Ntz~gN|-ANza!*n$M2N56H_Hlp}(t#qFe|3 z&NIaKY&{b{~+zfvgi+7aQ0TEfYexMP$ryW4gfBL z4sZb#`AP0MKzQsE2dLqeI;6}5JxU}DVieN?DU2fY%A%;{R0-o{pAvG7*8p;*e}iS& zfC*bRC0ld7>}lXKN0SC6Wdmy@J)G_vslf$?LXpe|8D;yL4ArC7m%4XdyUKh(+{nU? z?vutwPTT3y{~%+RD>Dvq;ae`d50b=eNjZdjR`MZq0ad?uJ=DZpsFkfvgv4`}COYpH{fO)0jIwU0K4uw9WMj+C zZT$$2eX?1hK=fwzg6giP8mpNxe2uyVAKy&Z%N5wEk+3|KBwp4uQ=NhkO+Bc*#3T3{yDFmN|G} zBuvS2BwW%V$*AC~xhFqiGuJlYmGqU)?-rvuJ z!`GVUt7CZ2{U7RCsIz5}QmfirV*mA0o77sf_U2=ZPPWuw#c2?@;`W;g{W$f~sn_nW zT2>;uKA|?Z9Mt5t@HiF5B4Lpz3FlTNS%`$sJd}j1%HvGNNqGAEGrkW@t2)(CMarqq zpH#+=qvj&!Po<{z!oS5a;7Jun9%@E)@}G2rds~HcS@S1D&C`KD&E=DFg7GK56IgOG zIKe84JSnf7U?xwJ7Nx9^F^0>~%T|v`rQYf#sr_`%>dhQyuWm?H6FpB)orv)ool?H+ z(@}9Evr%HL0bBDsvd5OH?wK;%U|KHo+oY-w%6C$-HGe9d+ooQ`4pP`QRh}!iDC)BvqPWpo~CoYvK^t`4$st!BpPg;`YNS>EzQR>G-iQ{%cH zb+PE}Qq>tSvt4Q@Tm4URZoAZr+C_fh8-=NotgfYBXqVcbj@7gyph=R@o`AUZZBL~N znGc4=w{JF%os@FrdTj+)H^>v)QfM=vO|o;sUynkSemi z!kw`~Sn3qmI}=jXUD)IVGrQ|msY>=HkYpBbBK5dYQ(%}AG2voefr|~0G3j`-ag&Nu zJ*m4fIer3%$2X{TRhVRs#MUH+Gh6CZ2}kx+ZaMir-^)F?UHJB5`EEO($-ik&Jp<)F zl!TS%041`wIx?dx4$<=boiZ$mJ>VW7j27?O@7xl=fi~RbfkW$9w$NwWR45&H_UsZ## zQq>8`W|vwIT_rJ<^-v(=Q;9q*>rzQ$wX{&O)%TH0(o!$aDAWGggSD@#<~OIA?e0!X z?a?{?%ogK&)nM$UMt?t6(KE$%8tbu4CZC3HDuImhvs;Y5t)@_2k=UzLk25=wP~z!? zYn}&mQagaG>_p6rwS^i5t_(2ANFUkqkKNe5)x79SXTdcOlXKHk&sUp6I)1s$N~bQT z)^vuP8_5i_0~r}~zCvbXFl=N-l`2K=j3pOjot2vja&G5TK3SR|*K|(3JtK1Lk5j&B zqr(5}4RuAiuXE~P^`NG6m(+4rO*@T~(dOj@?uHl8#~B39Lw#bT`*hU3c=3E-5{jipO`T>~W~hDtSsWAY|_ENHWs-^5)-9 z9#c&9991DpcJ@f^688v_d_lrzrX2DNvIqV5Nu6?0kBf!ce_twh$FX9)xEZ2K$#at> zuJPPvopnm+ks4L^3 zs&#yP7yn2~U$gO?zNzCfqoa-**CAA^{a%~xs@8MCa74qg&X#q3*}WnO@_pabvl;h{ zeyM|d)h8Z}{SuR^%D&B8`HmvzS%%hj*-$a|@>G3MKPGIJtnWu$*`jBe!<3U{W_?i> zLZ0s^a52)K#hrf|U+Pp2V=py1hwoN-Tc^~yU5^?ME0t}!iq^{d94oK7P1rT^)8 z&XW13)4?oRb9(Aj7EOy1a(8nE?RaI~8DxsnmO@A}2T-qCh7CYhEGreNW#0fQl*q7w zfQR7&85~V^4ov0h`Ep4d#HPTLm_exz@W|?@F|i}veI}c~6~|-GV}nu$^5Yr(2d579 z1WRs7^=0q}KU>ODpW>HQ)+|Zgq<0LCS(+N`lGii#Lqh6;PVHu`zdNK($}05(V|rCq zSFx=>Jk*Zkp1k?Nq32V3l(zoh(3;p!2etmf(3V)a^(TdXj+I+~L#XvPgIa$h=%U!q z`LzBh(7af=^;dvGv2yFr{xnR9Nl zZC~(YYwgXbZQ4b_J%?B%>h#dW3EV%~isiIeW7h{-%?q1UEHU-XF?HNJOYM`DO6|SM zs@*>J^gZQiOC6A%O{sV25gB%b)fAB#3L#me;FaA99%-?J{hKMdWwM1O&D7)6-@<5k zxTQ)RoZ)-KYUD^PhVx#u8i`0DRvF$^mb!Z^hF3OPYOkzBJtnlwQa{ZspV|3YKLTzQU|`a)a_!md%fD~e6vz(cUo#TG4s{$UzT%^)S2o=OU;7? z^L0gMOU-_NOgZ0SsS{())7TJIXgSaN^N{>7M_S$SNw_K~HY5Ienf47TPeN2x>a zTk85)?Te~f)rCqO_&-bid`z9c)l$2;Q&i4(S?b?o>I8n$N+rTAJI&f}TWWr?!hGHE zhNb58tkjYBEH#f^%-87cmf9gVbwA2w9uhhN;G3Qog?W=#csu!WQY2V3X zf2Iz~@cd?({TMTAc*RPmSL&3P$aj|d-dGIlxrA3e@JPxD)b3v`by7?{fvahy4oIF- zhkmfspTyJ`)L3et%rVtpTI$x3-ujTGcFQ`Y_SISH>{#vJSy#$A_jpRJm0IehG4;V6 zRtMdp8%q6zrQQ}x?gejKY96I3b>L}B-MYH&=VLuiTk7j#>SMcF+ipD&oXDtj;+p2BeG{LZCp%y zS!%0xJX+5ymbS&Js&$+mOUmj+X)KQEmiCNT-4WGRUF`---WaRZyxOXzU2n--7t`99 zeQ0$ZZE4di?V(t$3wB%HB9fvj^^KM~A=a30kEP~{T&cacS?V8S>LR}5u6oJfE48oK zQnz-bDW;CdIQ_2V( zvy4~7`cVf}BwlH-rQMO?Jz=Stedg=AnA$Ci+N5>L3H)iPTW4wK=d4Jyn7p-GQg_Si zf#B{oX+87|cW;;Ju62`aoxW^5ar7V%yJS2omY%1%9Z*3? zp;G&tmU=|2c9z{zv+gjx9=uhhN_OFccNo=#Dz$uH_LS{F-wK}`KQ z_hw41C0X*ZG5Kw2v1)BB`KXw@9~TtL-Y0dcHE+D7K0l^j+R0KgY1^ZAyDfF=qdu5JNdwW{y)-ioDcH(2wqUO3|Yx^|y9R@u$#MBDW&%2Sn5GB^?%Qq zDT$~(11xpxDYdoVmq}hC+40Jf#I!G2n}tbfJGghqv?B}!XV}xebLx@cm~LtO{Hs4W zzI)oZw%jGH>zTHLpR$$fdZoRk2ZEWs)A$|Sl3-@Pw2}N^ZLqL^+C%)vS+HS1+BxmH zP3b>`Br?=>H;3c%%ABKQzo3LFm9OSr;?V1rleZc#0 zw;zfWHDdvq|1(w;c))PN_QZHmb}q&b+cPsokFx+Z8s>>!X9HfkyPd04RE`nY+|(=s zTAZ=Hvkc@OV0)<&$PL(DSSbp;?DoL+lZ~R=S%Gw8yD0D$R$x8Y4NO%Zw(sl~1zvKw zU^{0o$oh)yf_)(C8RE9D>KA@> S+!%de-UNb}?S@Q}>C6B-?8tZk diff --git a/lib/libZ1_UDP_aarch64.so b/lib/libZ1_UDP_aarch64.so new file mode 100644 index 0000000000000000000000000000000000000000..599ef17619df24f72fce7525e2d912806f46ad6f GIT binary patch literal 1553288 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

D=8E_bsn0>>IlSI`X3L1)$|+z-^KlVA1{2>To%_ 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�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 z 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

E>UU7scX;|+t)^0)10JqE9X&fDDh54YWk;EX*O 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°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ξ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

UtXUowE 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 literal 0 HcmV?d00001 diff --git a/lib/libZ1_UDP_Linux64.so b/lib/libZ1_UDP_x86_64.so old mode 100644 new mode 100755 similarity index 90% rename from lib/libZ1_UDP_Linux64.so rename to lib/libZ1_UDP_x86_64.so index 87b0dd04268aeddcf2c6c3901291b9022a05d433..e06d4a00d81be2ebd7ef9e0ebcfc3a7bbd91ccb6 GIT binary patch delta 29534 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 z zO{$bS`lF>zi92tN_mGpZQhPtP)WhQHFJH0}z=SZJH(2V9p)T6ek^JnPs_joK_4V=E zcf8z@-N{O=y=$pE#%Ag(9nP1T>Uv9^5wATY)KPnrQoG-_)c$zKZmhM`yfaX0&+C@D zBl3lH9ktWGLLFXgsr#y5rSd6Dw$kF|6<2zXp5bebcHZA%siR-X^c7?e|p`L zN2@LQ)_9PyH{ww|V#%k*{oMAZCHFmQ%4N_uOkHiAWi%&l^g-A%3d`hg=t4N&h03_^ z0dHAq^%@YhJ80E@H(opaZA;Bgq11s_EVVlSsn0`QEj34PQ(a@J|A>$9=c$(3$J;|y zd%dOpt+Q48S8m{H=-iTTs_QIujiuGbzhl+bc+E(5qh3qBH?CIyzofa)XIt{0;_`Ee zUC9IQS@Jz``7L~b!L+~3lDEX=vABKsI!k_eJTs-U7#NDfY7iQkRF4Lf6t{)%?s%4JBN*&fM^@Ya-=9cUqRP6*y z9f>!xIKI}2Td6gNrJfzH-7!(Pohfy+kEOmkUVCe*)wV}Ap)S;%mU?cywt8)B4!p~f zyW{d_;&NY_CC`t`)zM1X2Y87~Yo1I?ogG(ip=jkeA9bOYVW~S}&B=(jcAO>W(d8R{RDWkoBf|h^6khjZKf=VR_eTss~!? z+v1IO+<=(l0Y(HveSl zvdj$ro|iwgJuBlA8-JZK^!V`^-*w_2ax(z;Tf$uezuRuc#*%h7+Q8p#%Q}93DxmOFgj6v%$XS#UG#=fU17%E>Yshi zpOhh8h=1or8HdBX8^uT=Hr5XH9$Hvgc%QD{VjC$VO49>dV(E6(~{_Lzr?ykBn zgP-pF92cs(uE&c*cnZsZq{r~&j%SkPvgDB-qmzUDo8amblsZ-HcqGY{c2(?nWXq8; zYbn+|U>VnhmaOeD(cE&@;j-i5BrNUguqv2t4HLgOf0W{oKGrW%c}97($5jdc2lR_M A3;+NC delta 29420 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

q`9sJXk>@D; z_{WSFxl@{_nVn0&j+|x5fa_dinA39<8f3$D<{)gpjxd6fKHb&Z7InyJ(_MqqKut%Q zE6b;ol^WSHoe`*!ls5YjAc+X|vH+ zHP<0k@8Z-nGud6$=vU9gxJtInbUmHjF!7&>8_K+l$if?3-Fr05Za!+nPQ~9e)X~}U z`VD5cci!OYZ)>|z?6X|G6i=SzI>**DM`q4)ouP+i)hx!n@RsJIvaP%ta1ww$G+-B{JYfb51Y3(RDr9*?l9qDv^|%T%&AlPs-Sv zFs+g0H=!&Sy&TgDYC>j9=$EQT`}ro63^xIoP;m&Kv@(;TP*i zPFpoSCT6kc$tu)pNaheKjt+$Qgn-jFC6{_*k%t_n#c8XSQtBGi$FA|s zsF~ci(I&I(Hu~?8(%a}w+1P*fW>HVoo2|DIZnEsAPIhh&e&L;n3aY(&n`xCZkKSZS z(L6j?$&7gnZkBAA$L5(U*%i##>tK6&>&{TyC zP-u{%1@z1#a~6;+r>t6lNv>>I;F_Eh&EIR>Ol56!7pLuFdza(_HW@z3;VxS6$dKEy zu9KqMnPFjBcssFcvh{W*QLPNP!!(M+_LT>lyVtz7gl9hr6x?^P<}R> zT`IlHb!K+%tfSTAP-mKLti6l$L`1J7;AF|JBui}0m87mg)>JYGZrQ4IS+ZLR{gUIu zUtPh`8C1>n?XTw59Ml-E@!_^g+I@srC)o?x*P9l|h=s0RD5p?l#OEv2%5sGY*`QD; z+ZD1T{cd$<%~iSNvOBI!Nehy&6evlFOu5?};Oe_+icS1(roCGV?lG}SK@)uun^=v^ zScFNPY*^$Pm0dXU=+IR@H=m-`Z~DD79aT6!sUsVzTP7%pSLP@Lr21YaqgU!xDIz=X zWidn~=ROmq7FOM7>gp8;Nx>`n{U9JY_p256!d_!EEoyiEZ-eTn){#t5>fG9Ys)wTX z%0i{CI!3KxpN2XtYgHRQ*{a}?=KC4A63MQjzgZ)W?k}URZ5yZ--kd6|$bS`eYGs2m zZr~dy=VFlfOypv&8D9EgW(FtH#dMbivY5OwG!K{q0Wy+WIEHY}L6Tj&>7RQ*-ytf+ zbCkLUb+1GVP%WE@rg~LE&8hA1N2wQ~=9Zjre(VOj9(7ps2k8i>)CU=+VwvzDXW6

vFQINwCM=;Y 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 ZO|gcF$Ig`$$MwoETi_XGW%uhl{2%7?N-Y2Y diff --git a/main.cpp b/main.cpp old mode 100755 new mode 100644