NonlinearConstraints are now implemented using the simple linearization method with quadratic merit function
							parent
							
								
									864b66ea93
								
							
						
					
					
						commit
						a3da89b63a
					
				
							
								
								
									
										329
									
								
								.cproject
								
								
								
								
							
							
						
						
									
										329
									
								
								.cproject
								
								
								
								
							|  | @ -302,7 +302,6 @@ | |||
| 				<buildTargets> | ||||
| 					<target name="all" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -310,7 +309,6 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -318,7 +316,6 @@ | |||
| 					</target> | ||||
| 					<target name="check" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -326,7 +323,6 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianConditional.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianConditional.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -334,7 +330,6 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianFactor.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianFactor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -342,7 +337,6 @@ | |||
| 					</target> | ||||
| 					<target name="timeGaussianFactor.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>timeGaussianFactor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -350,7 +344,6 @@ | |||
| 					</target> | ||||
| 					<target name="timeVectorConfig.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>timeVectorConfig.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -358,7 +351,6 @@ | |||
| 					</target> | ||||
| 					<target name="testVectorBTree.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testVectorBTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -366,7 +358,6 @@ | |||
| 					</target> | ||||
| 					<target name="testVectorMap.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testVectorMap.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -374,7 +365,6 @@ | |||
| 					</target> | ||||
| 					<target name="testNoiseModel.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testNoiseModel.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -382,7 +372,6 @@ | |||
| 					</target> | ||||
| 					<target name="testBayesNetPreconditioner.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testBayesNetPreconditioner.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -390,13 +379,12 @@ | |||
| 					</target> | ||||
| 					<target name="testErrors.run" path="linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testErrors.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 					<target name="check" path="build/base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
|  | @ -404,8 +392,16 @@ | |||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/linear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -413,6 +409,7 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -420,6 +417,7 @@ | |||
| 					</target> | ||||
| 					<target name="testBTree.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testBTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -427,6 +425,7 @@ | |||
| 					</target> | ||||
| 					<target name="testDSF.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testDSF.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -434,6 +433,7 @@ | |||
| 					</target> | ||||
| 					<target name="testDSFVector.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testDSFVector.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -441,6 +441,7 @@ | |||
| 					</target> | ||||
| 					<target name="testMatrix.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testMatrix.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -448,6 +449,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSPQRUtil.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSPQRUtil.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -455,6 +457,7 @@ | |||
| 					</target> | ||||
| 					<target name="testVector.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testVector.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -462,6 +465,7 @@ | |||
| 					</target> | ||||
| 					<target name="timeMatrix.run" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>timeMatrix.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -469,6 +473,7 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="base" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -476,7 +481,6 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -484,7 +488,6 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -500,7 +503,6 @@ | |||
| 					</target> | ||||
| 					<target name="testBayesTree.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testBayesTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -508,7 +510,6 @@ | |||
| 					</target> | ||||
| 					<target name="testBinaryBayesNet.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testBinaryBayesNet.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -516,7 +517,6 @@ | |||
| 					</target> | ||||
| 					<target name="testFactorGraph.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testFactorGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -524,7 +524,6 @@ | |||
| 					</target> | ||||
| 					<target name="testISAM.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testISAM.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -532,7 +531,6 @@ | |||
| 					</target> | ||||
| 					<target name="testJunctionTree.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testJunctionTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -540,7 +538,6 @@ | |||
| 					</target> | ||||
| 					<target name="testKey.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testKey.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -548,7 +545,6 @@ | |||
| 					</target> | ||||
| 					<target name="testOrdering.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testOrdering.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -556,7 +552,6 @@ | |||
| 					</target> | ||||
| 					<target name="testSymbolicBayesNet.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSymbolicBayesNet.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -564,7 +559,6 @@ | |||
| 					</target> | ||||
| 					<target name="testSymbolicFactor.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSymbolicFactor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -572,7 +566,6 @@ | |||
| 					</target> | ||||
| 					<target name="testSymbolicFactorGraph.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSymbolicFactorGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -580,7 +573,6 @@ | |||
| 					</target> | ||||
| 					<target name="timeSymbolMaps.run" path="inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>timeSymbolMaps.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -588,7 +580,6 @@ | |||
| 					</target> | ||||
| 					<target name="check" path="build/inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -596,7 +587,6 @@ | |||
| 					</target> | ||||
| 					<target name="testClusterTree.run" path="build/inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testClusterTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -604,7 +594,6 @@ | |||
| 					</target> | ||||
| 					<target name="testJunctionTree.run" path="build/inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testJunctionTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -612,7 +601,6 @@ | |||
| 					</target> | ||||
| 					<target name="testEliminationTree.run" path="build/inference" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testEliminationTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -620,6 +608,7 @@ | |||
| 					</target> | ||||
| 					<target name="check" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -627,6 +616,7 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianFactorGraph.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianFactorGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -634,6 +624,7 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianISAM.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianISAM.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -641,6 +632,7 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianISAM2.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianISAM2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -648,6 +640,7 @@ | |||
| 					</target> | ||||
| 					<target name="testGraph.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -655,6 +648,7 @@ | |||
| 					</target> | ||||
| 					<target name="testIterative.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testIterative.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -662,6 +656,7 @@ | |||
| 					</target> | ||||
| 					<target name="testNonlinearEquality.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testNonlinearEquality.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -669,6 +664,7 @@ | |||
| 					</target> | ||||
| 					<target name="testNonlinearFactor.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testNonlinearFactor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -676,6 +672,7 @@ | |||
| 					</target> | ||||
| 					<target name="testNonlinearFactorGraph.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testNonlinearFactorGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -683,6 +680,7 @@ | |||
| 					</target> | ||||
| 					<target name="testNonlinearOptimizer.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testNonlinearOptimizer.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -690,6 +688,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSQP.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSQP.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -697,6 +696,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSubgraphPreconditioner.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSubgraphPreconditioner.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -704,6 +704,7 @@ | |||
| 					</target> | ||||
| 					<target name="testTupleConfig.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testTupleConfig.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -711,6 +712,7 @@ | |||
| 					</target> | ||||
| 					<target name="timeGaussianFactorGraph.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>timeGaussianFactorGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -718,6 +720,7 @@ | |||
| 					</target> | ||||
| 					<target name="testBayesNetPreconditioner.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testBayesNetPreconditioner.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -725,6 +728,7 @@ | |||
| 					</target> | ||||
| 					<target name="testConstraintOptimizer.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testConstraintOptimizer.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -732,6 +736,7 @@ | |||
| 					</target> | ||||
| 					<target name="testInference.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testInference.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -739,6 +744,7 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianBayesNet.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianBayesNet.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -746,6 +752,7 @@ | |||
| 					</target> | ||||
| 					<target name="testGaussianFactor.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testGaussianFactor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -753,6 +760,7 @@ | |||
| 					</target> | ||||
| 					<target name="testJunctionTree.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testJunctionTree.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -760,6 +768,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSymbolicBayesNet.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSymbolicBayesNet.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -767,6 +776,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSymbolicFactorGraph.run" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSymbolicFactorGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -774,7 +784,6 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -782,7 +791,6 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="nonlinear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -790,7 +798,6 @@ | |||
| 					</target> | ||||
| 					<target name="testNonlinearConstraint.run" path="nonlinear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testNonlinearConstraint.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -798,7 +805,6 @@ | |||
| 					</target> | ||||
| 					<target name="testLieConfig.run" path="nonlinear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testLieConfig.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -806,7 +812,6 @@ | |||
| 					</target> | ||||
| 					<target name="testConstraintOptimizer.run" path="nonlinear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testConstraintOptimizer.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -814,7 +819,6 @@ | |||
| 					</target> | ||||
| 					<target name="install" path="CCOLAMD" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>install</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -822,7 +826,6 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="CCOLAMD" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -830,6 +833,7 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="colamd" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -837,6 +841,7 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="colamd" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -844,6 +849,7 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="ldl" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -851,6 +857,7 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="ldl" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -858,6 +865,7 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="CppUnitLite" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -865,6 +873,7 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="CppUnitLite" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -872,7 +881,6 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="spqr_mini" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -880,7 +888,6 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="spqr_mini" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -888,6 +895,7 @@ | |||
| 					</target> | ||||
| 					<target name="rebuild" path="spqr_mini" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -895,6 +903,7 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -902,6 +911,7 @@ | |||
| 					</target> | ||||
| 					<target name="check" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -909,6 +919,7 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -916,6 +927,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPlanarSLAM.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPlanarSLAM.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -923,6 +935,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose2Config.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose2Config.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -930,6 +943,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose2Factor.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose2Factor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -937,6 +951,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose2Prior.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose2Prior.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -944,6 +959,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose2SLAM.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose2SLAM.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -951,6 +967,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose3Config.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose3Config.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -958,6 +975,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose3SLAM.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose3SLAM.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -965,6 +983,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSimulated2DOriented.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSimulated2DOriented.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -972,6 +991,7 @@ | |||
| 					</target> | ||||
| 					<target name="testVSLAMConfig.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testVSLAMConfig.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -979,6 +999,7 @@ | |||
| 					</target> | ||||
| 					<target name="testVSLAMFactor.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testVSLAMFactor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -986,6 +1007,7 @@ | |||
| 					</target> | ||||
| 					<target name="testVSLAMGraph.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testVSLAMGraph.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -993,6 +1015,7 @@ | |||
| 					</target> | ||||
| 					<target name="testPose3Factor.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose3Factor.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -1000,6 +1023,7 @@ | |||
| 					</target> | ||||
| 					<target name="testSimulated2D.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSimulated2D.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
|  | @ -1007,11 +1031,36 @@ | |||
| 					</target> | ||||
| 					<target name="testSimulated3D.run" path="slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSimulated3D.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>false</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/slam" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/nonlinear" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="install" path="wrap" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments>-j2</buildArguments> | ||||
|  | @ -1030,96 +1079,11 @@ | |||
| 					</target> | ||||
| 					<target name="clean" path="wrap" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testRot3.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testRot3.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testRot2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testRot2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testPose3.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testPose3.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="timeRot3.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>timeRot3.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testPose2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testPose2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testCal3_S2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testCal3_S2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testSimpleCamera.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testSimpleCamera.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testHomography2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testHomography2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testCalibratedCamera.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testCalibratedCamera.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="clean" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testPoint2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>testPoint2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="install" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments>-j2</buildArguments> | ||||
|  | @ -1146,6 +1110,7 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -1153,12 +1118,85 @@ | |||
| 					</target> | ||||
| 					<target name="dist" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>dist</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 					<target name="testRot3.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testRot3.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testRot2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testRot2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testPose3.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose3.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="timeRot3.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>timeRot3.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testPose2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPose2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testCal3_S2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testCal3_S2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testSimpleCamera.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testSimpleCamera.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testHomography2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testHomography2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="testCalibratedCamera.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testCalibratedCamera.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
|  | @ -1166,15 +1204,7 @@ | |||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="clean" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 					<target name="clean" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
|  | @ -1182,9 +1212,37 @@ | |||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="install" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 					<target name="testPoint2.run" path="geometry" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>testPoint2.run</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build/tests" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="check" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>check</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="clean" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>clean</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
| 						<runAllBuilders>true</runAllBuilders> | ||||
| 					</target> | ||||
| 					<target name="install" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildTarget>install</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  | @ -1192,7 +1250,6 @@ | |||
| 					</target> | ||||
| 					<target name="all" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> | ||||
| 						<buildCommand>make</buildCommand> | ||||
| 						<buildArguments/> | ||||
| 						<buildTarget>all</buildTarget> | ||||
| 						<stopOnError>true</stopOnError> | ||||
| 						<useDefaultCommand>true</useDefaultCommand> | ||||
|  |  | |||
|  | @ -22,18 +22,17 @@ namespace gtsam { | |||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template <class Config> | ||||
| NonlinearConstraint<Config>::NonlinearConstraint(const LagrangeKey& lagrange_key, | ||||
| 					size_t dim_lagrange, | ||||
| 					bool isEquality) : | ||||
| 	NonlinearFactor<Config>(noiseModel::Unit::Create(2*dim_lagrange)), | ||||
| 	lagrange_key_(lagrange_key), p_(dim_lagrange), isEquality_(isEquality) { | ||||
| 	this->keys_.push_back(lagrange_key_); | ||||
| NonlinearConstraint<Config>::NonlinearConstraint(size_t dim, double mu) : | ||||
| 	NonlinearFactor<Config>(noiseModel::Constrained::All(dim)), | ||||
| 	mu_(fabs(mu)) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template <class Config> | ||||
| bool NonlinearConstraint<Config>::active(const Config& config) const { | ||||
| 	return !(!isEquality_ && greaterThanOrEqual(unwhitenedError(config), zero(p_))); | ||||
| double NonlinearConstraint<Config>::error(const Config& c) const { | ||||
| 	const Vector error_vector = unwhitenedError(c); | ||||
| 	return mu_ * inner_prod(error_vector, error_vector); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -45,10 +44,8 @@ NonlinearConstraint1<Config, Key, X>::NonlinearConstraint1( | |||
| 			Vector (*g)(const Config& config), | ||||
| 			const Key& key, | ||||
| 			Matrix (*gradG)(const Config& config), | ||||
| 			size_t dim_constraint, | ||||
| 			const LagrangeKey& lagrange_key, | ||||
| 			bool isEquality) : | ||||
| 				NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | ||||
| 			size_t dim,	double mu) : | ||||
| 				NonlinearConstraint<Config>(dim, mu), | ||||
| 				G_(boost::bind(gradG, _1)), g_(boost::bind(g, _1)), key_(key) | ||||
| { | ||||
| 	this->keys_.push_back(key); | ||||
|  | @ -60,10 +57,8 @@ NonlinearConstraint1<Config, Key, X>::NonlinearConstraint1( | |||
| 		boost::function<Vector(const Config& config)> g, | ||||
| 			const Key& key, | ||||
| 			boost::function<Matrix(const Config& config)> gradG, | ||||
| 			size_t dim_constraint, | ||||
| 			const LagrangeKey& lagrange_key, | ||||
| 			bool isEquality) : | ||||
| 				NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | ||||
| 			size_t dim,	double mu) : | ||||
| 			NonlinearConstraint<Config>(dim, mu), | ||||
| 				G_(gradG), g_(g), key_(key) | ||||
| { | ||||
| 	this->keys_.push_back(key); | ||||
|  | @ -72,13 +67,9 @@ NonlinearConstraint1<Config, Key, X>::NonlinearConstraint1( | |||
| /* ************************************************************************* */ | ||||
| template <class Config, class Key, class X> | ||||
| void NonlinearConstraint1<Config, Key, X>::print(const std::string& s) const { | ||||
| 	std::cout << "NonlinearConstraint1 [" << s << "]: Dim: " << this->p_ << "\n" | ||||
| 			  << "  Key         : " << (std::string) this->key_ << "\n" | ||||
| 			  << "  Lagrange Key: " << (std::string) this->lagrange_key_ << "\n"; | ||||
| 	if (this->isEquality_) | ||||
| 		std::cout << "  Equality Factor" << std::endl; | ||||
| 	else | ||||
| 		std::cout << "  Inequality Factor" << std::endl; | ||||
| 	std::cout << "NonlinearConstraint1 [" << s << "]: Dim: " << this->dim() | ||||
| 			  << " mu: " << this->mu_ << "\n" | ||||
| 			  << "  Key         : " << (std::string) this->key_ << "\n"; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -87,44 +78,18 @@ bool NonlinearConstraint1<Config, Key, X>::equals(const Factor<Config>& f, doubl | |||
| 	const NonlinearConstraint1<Config, Key, X>* p = dynamic_cast<const NonlinearConstraint1<Config, Key, X>*> (&f); | ||||
| 	if (p == NULL) return false; | ||||
| 	if (!(key_ == p->key_)) return false; | ||||
| 	if (!(this->lagrange_key_.equals(p->lagrange_key_))) return false; | ||||
| 	if (this->isEquality_ != p->isEquality_) return false; | ||||
| 	return this->p_ == p->p_; | ||||
| 	if (fabs(this->mu_ - p->mu_ ) > tol) return false; | ||||
| 	return this->dim() == p->dim(); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template <class Config, class Key, class X> | ||||
| GaussianFactor::shared_ptr | ||||
| NonlinearConstraint1<Config, Key, X>::linearize(const Config& config) const { | ||||
| 	const size_t p = this->p_; | ||||
| 
 | ||||
| 	// extract lagrange multiplier
 | ||||
| 	Vector lambda = config[this->lagrange_key_]; | ||||
| 
 | ||||
| 	// find the error
 | ||||
| 	Vector g = g_(config); | ||||
| 
 | ||||
| 	// construct the gradient
 | ||||
| 	Vector g = -1.0 * g_(config); | ||||
| 	Matrix grad = G_(config); | ||||
| 
 | ||||
| 	// construct combined factor
 | ||||
| 	Matrix Ax = zeros(grad.size1()*2, grad.size2()); | ||||
| 	insertSub(Ax, vector_scale(lambda, grad), 0, 0); | ||||
| 	insertSub(Ax, grad, grad.size1(), 0); | ||||
| 
 | ||||
| 	Matrix AL = eye(p*2, p); | ||||
| 
 | ||||
| 	Vector rhs = zero(p*2); | ||||
| 	subInsert(rhs, -1*g, p); | ||||
| 
 | ||||
| 	// construct a mixed constraint model
 | ||||
| 	Vector sigmas = zero(p*2); | ||||
| 	subInsert(sigmas, ones(p), 0); | ||||
| 	SharedDiagonal mixedConstraint = noiseModel::Constrained::MixedSigmas(sigmas); | ||||
| 
 | ||||
| 	GaussianFactor::shared_ptr factor(new | ||||
| 			GaussianFactor(key_, Ax, this->lagrange_key_, AL, rhs, mixedConstraint)); | ||||
| 
 | ||||
| 	SharedDiagonal model = noiseModel::Constrained::All(this->dim()); | ||||
| 	GaussianFactor::shared_ptr factor(new GaussianFactor(this->key_, grad, g, model)); | ||||
| 	return factor; | ||||
| } | ||||
| 
 | ||||
|  | @ -140,12 +105,10 @@ NonlinearConstraint2<Config, Key1, X1, Key2, X2>::NonlinearConstraint2( | |||
| 		Matrix (*G1)(const Config& config), | ||||
| 		const Key2& key2, | ||||
| 		Matrix (*G2)(const Config& config), | ||||
| 		size_t dim_constraint, | ||||
| 		const LagrangeKey& lagrange_key, | ||||
| 		bool isEquality) : | ||||
| 			NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | ||||
| 			G1_(boost::bind(G1, _1)), G2_(boost::bind(G2, _1)), g_(boost::bind(g, _1)), | ||||
| 			key1_(key1), key2_(key2) | ||||
| 		size_t dim,	double mu) | ||||
| 	: NonlinearConstraint<Config>(dim, mu), | ||||
| 	  G1_(boost::bind(G1, _1)), G2_(boost::bind(G2, _1)), g_(boost::bind(g, _1)), | ||||
| 	  key1_(key1), key2_(key2) | ||||
| { | ||||
| 	this->keys_.push_back(key1); | ||||
| 	this->keys_.push_back(key2); | ||||
|  | @ -159,12 +122,10 @@ NonlinearConstraint2<Config, Key1, X1, Key2, X2>::NonlinearConstraint2( | |||
| 		boost::function<Matrix(const Config& config)> G1, | ||||
| 		const Key2& key2, | ||||
| 		boost::function<Matrix(const Config& config)> G2, | ||||
| 		size_t dim_constraint, | ||||
| 		const LagrangeKey& lagrange_key, | ||||
| 		bool isEquality)  : | ||||
| 				NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | ||||
| 				G1_(G1), G2_(G2), g_(g), | ||||
| 				key1_(key1), key2_(key2) | ||||
| 		size_t dim,	double mu) | ||||
| 	: NonlinearConstraint<Config>(dim, mu), | ||||
| 	  G1_(G1), G2_(G2), g_(g), | ||||
| 	  key1_(key1), key2_(key2) | ||||
| { | ||||
| 	this->keys_.push_back(key1); | ||||
| 	this->keys_.push_back(key2); | ||||
|  | @ -173,14 +134,10 @@ NonlinearConstraint2<Config, Key1, X1, Key2, X2>::NonlinearConstraint2( | |||
| /* ************************************************************************* */ | ||||
| template <class Config, class Key1, class X1, class Key2, class X2> | ||||
| void NonlinearConstraint2<Config, Key1, X1, Key2, X2>::print(const std::string& s) const { | ||||
| 	std::cout << "NonlinearConstraint2 [" << s << "]: Dim: " << this->p_ << "\n" | ||||
| 	std::cout << "NonlinearConstraint2 [" << s << "]: Dim: " << this->dim() | ||||
| 			  << " mu: " << this->mu_ << "\n" | ||||
| 			  << "  Key1        : " << (std::string) this->key1_ << "\n" | ||||
| 			  << "  Key2        : " << (std::string) this->key2_ << "\n" | ||||
| 			  << "  Lagrange Key: " << (std::string) this->lagrange_key_ << "\n"; | ||||
| 	if (this->isEquality_) | ||||
| 		std::cout << "  Equality Factor" << std::endl; | ||||
| 	else | ||||
| 		std::cout << "  Inequality Factor" << std::endl; | ||||
| 			  << "  Key2        : " << (std::string) this->key2_ << "\n"; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -190,48 +147,19 @@ bool NonlinearConstraint2<Config, Key1, X1, Key2, X2>::equals(const Factor<Confi | |||
| 	if (p == NULL) return false; | ||||
| 	if (!(key1_ == p->key1_)) return false; | ||||
| 	if (!(key2_ == p->key2_)) return false; | ||||
| 	if (!(this->lagrange_key_.equals(p->lagrange_key_))) return false; | ||||
| 	if (this->isEquality_ != p->isEquality_) return false; | ||||
| 	return this->p_ == p->p_; | ||||
| 	if (fabs(this->mu_ - p->mu_ ) > tol) return false; | ||||
| 	return this->dim() == p->dim(); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| template<class Config, class Key1, class X1, class Key2, class X2> | ||||
| GaussianFactor::shared_ptr | ||||
| NonlinearConstraint2<Config, Key1, X1, Key2, X2>::linearize(const Config& config) const { | ||||
| 	const size_t p = this->p_; | ||||
| 	// extract lagrange multiplier
 | ||||
| 	Vector lambda = config[this->lagrange_key_]; | ||||
| 
 | ||||
| 	// find the error
 | ||||
| 	Vector g = g_(config); | ||||
| 
 | ||||
| 	// construct the gradients
 | ||||
| 	Vector g = -1.0 * g_(config); | ||||
| 	Matrix grad1 = G1_(config); | ||||
| 	Matrix grad2 = G2_(config); | ||||
| 
 | ||||
| 	// create matrices
 | ||||
| 	Matrix Ax1 = zeros(grad1.size1()*2, grad1.size2()), | ||||
| 		   Ax2 = zeros(grad2.size1()*2, grad2.size2()), | ||||
| 		   AL = eye(p*2, p); | ||||
| 
 | ||||
| 	// insert matrix components
 | ||||
| 	insertSub(Ax1, vector_scale(lambda, grad1), 0, 0); | ||||
| 	insertSub(Ax1, grad1, grad1.size1(), 0); | ||||
| 
 | ||||
| 	insertSub(Ax2, vector_scale(lambda, grad2), 0, 0); | ||||
| 	insertSub(Ax2, grad2, grad2.size1(), 0); | ||||
| 
 | ||||
| 	Vector rhs = zero(p*2); | ||||
| 	subInsert(rhs, -1*g, p); | ||||
| 
 | ||||
| 	// construct a mixed constraint model
 | ||||
| 	Vector sigmas = zero(p*2); | ||||
| 	subInsert(sigmas, ones(p), 0); | ||||
| 	SharedDiagonal mixedConstraint = noiseModel::Constrained::MixedSigmas(sigmas); | ||||
| 
 | ||||
| 	GaussianFactor::shared_ptr factor(new | ||||
| 			GaussianFactor(key1_, Ax1, key2_, Ax2, this->lagrange_key_, AL, rhs, mixedConstraint)); | ||||
| 	SharedDiagonal model = noiseModel::Constrained::All(this->dim()); | ||||
| 	GaussianFactor::shared_ptr factor(new GaussianFactor(this->key1_, grad1, this->key2_, grad2, g, model)); | ||||
| 	return factor; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * @file NonlinearConstraint.h | ||||
|  * @brief Implements nonlinear constraints that can be linearized and | ||||
|  * inserted into an existing nonlinear graph and solved via SQP | ||||
|  * @brief Implements nonlinear constraints that can be linearized using | ||||
|  * direct linearization and solving through a quadratic merit function | ||||
|  * @author Alex Cunningham | ||||
|  */ | ||||
| 
 | ||||
|  | @ -13,9 +13,6 @@ | |||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
| /** Typedef for Lagrange key type - must be present in factors and config */ | ||||
| typedef TypedSymbol<Vector, 'L'> LagrangeKey; | ||||
| 
 | ||||
| /**
 | ||||
|  * Base class for nonlinear constraints | ||||
|  * This allows for both equality and inequality constraints, | ||||
|  | @ -23,68 +20,43 @@ typedef TypedSymbol<Vector, 'L'> LagrangeKey; | |||
|  * nonzero constraint functions will still be active - inequality | ||||
|  * constraints should be sure to force to actual zero) | ||||
|  * | ||||
|  * The measurement z in the underlying NonlinearFactor is the | ||||
|  * set of Lagrange multipliers. | ||||
|  * NOTE: inequality constraints removed for now | ||||
|  * | ||||
|  * Note on NoiseModel: | ||||
|  * The nonlinear constraint actually uses a Unit noisemodel so that | ||||
|  * it is possible to have a finite error value when the constraint is | ||||
|  * not fulfilled.  Using a constrained noisemodel will immediately cause | ||||
|  * infinite error and break optimization. | ||||
|  * Nonlinear constraints evaluate their error as a part of a quadratic | ||||
|  * error function: ||h(x)-z||^2 + mu * ||c(x)|| where mu is a gain | ||||
|  * on the constraint function that should be made high enough to be | ||||
|  * significant | ||||
|  */ | ||||
| template <class Config> | ||||
| class NonlinearConstraint : public NonlinearFactor<Config> { | ||||
| 
 | ||||
| protected: | ||||
| 
 | ||||
| 	/** key for the lagrange multipliers */ | ||||
| 	LagrangeKey lagrange_key_; | ||||
| 
 | ||||
| 	/** number of lagrange multipliers */ | ||||
| 	size_t p_; | ||||
| 
 | ||||
| 	/** type of constraint */ | ||||
| 	bool isEquality_; | ||||
| 	double mu_; // gain for quadratic merit function
 | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
| 	/** Constructor - sets the cost function and the lagrange multipliers
 | ||||
| 	 * @param lagrange_key is the label for the associated lagrange multipliers | ||||
| 	 * @param dim_lagrange is the number of associated constraints | ||||
| 	 * @param isEquality is true if the constraint is an equality constraint | ||||
| 	 * @param dim is the dimension of the factor | ||||
| 	 * @param mu is the gain used at error evaluation (forced to be positive) | ||||
| 	 */ | ||||
| 	NonlinearConstraint(const LagrangeKey& lagrange_key, | ||||
| 						size_t dim_lagrange, | ||||
| 						bool isEquality=true); | ||||
| 	NonlinearConstraint(size_t dim, double mu = 1000.0); | ||||
| 
 | ||||
| 	/** returns the key used for the Lagrange multipliers */ | ||||
| 	LagrangeKey lagrangeKey() const { return lagrange_key_; } | ||||
| 
 | ||||
| 	/** returns the number of lagrange multipliers */ | ||||
| 	size_t nrConstraints() const { return p_; } | ||||
| 
 | ||||
| 	/** returns the type of constraint */ | ||||
| 	bool isEquality() const { return isEquality_; } | ||||
| 	/** returns the gain mu */ | ||||
| 	double mu() const { return mu_; } | ||||
| 
 | ||||
| 	/** Print */ | ||||
| 	virtual void print(const std::string& s = "") const =0; | ||||
| 	virtual void print(const std::string& s = "") const=0; | ||||
| 
 | ||||
| 	/** Check if two factors are equal */ | ||||
| 	virtual bool equals(const Factor<Config>& f, double tol=1e-9) const=0; | ||||
| 
 | ||||
| 	/** error function - returns the result of the constraint function */ | ||||
| 	virtual Vector unwhitenedError(const Config& c) const=0; | ||||
| 	/** error function - returns the quadratic merit function */ | ||||
| 	virtual double error(const Config& c) const; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Determines whether the constraint is active given a particular configuration | ||||
| 	 * @param config is the input to the g(x) function | ||||
| 	 * @return true if constraint needs to be linearized | ||||
| 	 */ | ||||
| 	bool active(const Config& config) const; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Real linearize, given a config that includes Lagrange multipliers | ||||
| 	 * @param config is the configuration (with lagrange multipliers) | ||||
| 	 * Linearizes around a given config | ||||
| 	 * @param config is the configuration | ||||
| 	 * @return a combined linear factor containing both the constraint and the constraint factor | ||||
| 	 */ | ||||
| 	virtual boost::shared_ptr<GaussianFactor> linearize(const Config& c) const=0; | ||||
|  | @ -128,34 +100,30 @@ public: | |||
| 	 * @param key is the identifier for the variable constrained | ||||
| 	 * @param G gives the jacobian of the constraint function | ||||
| 	 * @param g is the constraint function | ||||
| 	 * @param dim_constraint is the size of the constraint (p) | ||||
| 	 * @param lagrange_key is the identifier for the lagrange multiplier | ||||
| 	 * @param isEquality is true if the constraint is an equality constraint | ||||
| 	 * @param dim is the size of the constraint (p) | ||||
| 	 * @param mu is the gain for the factor | ||||
| 	 */ | ||||
| 	NonlinearConstraint1( | ||||
| 			Vector (*g)(const Config& config), | ||||
| 			const Key& key, | ||||
| 			Matrix (*G)(const Config& config), | ||||
| 			size_t dim_constraint, | ||||
| 			const LagrangeKey& lagrange_key, | ||||
| 			bool isEquality=true); | ||||
| 			size_t dim, | ||||
| 			double mu = 1000.0); | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Basic constructor with boost function pointers | ||||
| 	 * @param key is the identifier for the variable constrained | ||||
| 	 * @param G gives the jacobian of the constraint function | ||||
| 	 * @param g is the constraint function as a boost function pointer | ||||
| 	 * @param dim_constraint is the size of the constraint (p) | ||||
| 	 * @param lagrange_key is the identifier for the lagrange multiplier | ||||
| 	 * @param isEquality is true if the constraint is an equality constraint | ||||
| 	 * @param dim is the size of the constraint (p) | ||||
| 	 * @param mu is the gain for the factor | ||||
| 	 */ | ||||
| 	NonlinearConstraint1( | ||||
| 			boost::function<Vector(const Config& config)> g, | ||||
| 			const Key& key, | ||||
| 			boost::function<Matrix(const Config& config)> G, | ||||
| 			size_t dim_constraint, | ||||
| 			const LagrangeKey& lagrange_key, | ||||
| 			bool isEquality=true); | ||||
| 			size_t dim, | ||||
| 			double mu = 1000.0); | ||||
| 
 | ||||
| 	/** Print */ | ||||
| 	void print(const std::string& s = "") const; | ||||
|  | @ -166,9 +134,7 @@ public: | |||
| 	/** Error function */ | ||||
| 	virtual inline Vector unwhitenedError(const Config& c) const { return g_(c); } | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Linearize from config - must have Lagrange multipliers | ||||
| 	 */ | ||||
| 	/** Linearize from config */ | ||||
| 	virtual boost::shared_ptr<GaussianFactor> linearize(const Config& c) const; | ||||
| }; | ||||
| 
 | ||||
|  | @ -209,9 +175,8 @@ public: | |||
| 	 * @param key is the identifier for the variable constrained | ||||
| 	 * @param G gives the jacobian of the constraint function | ||||
| 	 * @param g is the constraint function | ||||
| 	 * @param dim_constraint is the size of the constraint (p) | ||||
| 	 * @param lagrange_key is the identifier for the lagrange multiplier | ||||
| 	 * @param isEquality is true if the constraint is an equality constraint | ||||
| 	 * @param dim is the size of the constraint (p) | ||||
| 	 * @param mu is the gain for the factor | ||||
| 	 */ | ||||
| 	NonlinearConstraint2( | ||||
| 			Vector (*g)(const Config& config), | ||||
|  | @ -219,9 +184,8 @@ public: | |||
| 			Matrix (*G1)(const Config& config), | ||||
| 			const Key2& key2, | ||||
| 			Matrix (*G2)(const Config& config), | ||||
| 			size_t dim_constraint, | ||||
| 			const LagrangeKey& lagrange_key, | ||||
| 			bool isEquality=true); | ||||
| 			size_t dim, | ||||
| 			double mu = 1000.0); | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Basic constructor with direct function objects | ||||
|  | @ -229,9 +193,8 @@ public: | |||
| 	 * @param key is the identifier for the variable constrained | ||||
| 	 * @param G gives the jacobian of the constraint function | ||||
| 	 * @param g is the constraint function | ||||
| 	 * @param dim_constraint is the size of the constraint (p) | ||||
| 	 * @param lagrange_key is the identifier for the lagrange multiplier | ||||
| 	 * @param isEquality is true if the constraint is an equality constraint | ||||
| 	 * @param dim is the size of the constraint (p) | ||||
| 	 * @param mu is the gain for the factor | ||||
| 	 */ | ||||
| 	NonlinearConstraint2( | ||||
| 			boost::function<Vector(const Config& config)> g, | ||||
|  | @ -239,9 +202,8 @@ public: | |||
| 			boost::function<Matrix(const Config& config)> G1, | ||||
| 			const Key2& key2, | ||||
| 			boost::function<Matrix(const Config& config)> G2, | ||||
| 			size_t dim_constraint, | ||||
| 			const LagrangeKey& lagrange_key, | ||||
| 			bool isEquality=true); | ||||
| 			size_t dim, | ||||
| 			double mu = 1000.0); | ||||
| 
 | ||||
| 	/** Print */ | ||||
| 	void print(const std::string& s = "") const; | ||||
|  | @ -252,9 +214,7 @@ public: | |||
| 	/** Error function */ | ||||
| 	virtual inline Vector unwhitenedError(const Config& c) const { return g_(c); } | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Linearize from config - must have Lagrange multipliers | ||||
| 	 */ | ||||
| 	/** Linearize from config */ | ||||
| 	virtual boost::shared_ptr<GaussianFactor> linearize(const Config& c) const; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -86,6 +86,11 @@ namespace gtsam { | |||
| 			return keys_; | ||||
| 		} | ||||
| 
 | ||||
| 		/** get the dimension of the factor (number of rows on linearization) */ | ||||
| 		size_t dim() const { | ||||
| 			return noiseModel_->dim(); | ||||
| 		} | ||||
| 
 | ||||
| 		/* return the begin iterator of keys */ | ||||
| 		std::list<Symbol>::const_iterator begin() const { return keys_.begin(); } | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,8 +5,6 @@ | |||
|  * Created on: Jul 17, 2010 | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "NonlinearOptimizer.h" | ||||
| 
 | ||||
| namespace gtsam { | ||||
|  |  | |||
|  | @ -21,8 +21,7 @@ using namespace gtsam; | |||
| using namespace boost::assign; | ||||
| 
 | ||||
| typedef TypedSymbol<Vector, 'x'> Key; | ||||
| typedef TupleConfig2< LieConfig<LagrangeKey, Vector>, | ||||
| 					  LieConfig<Key, Vector> > VecConfig; | ||||
| typedef LieConfig<Key, Vector> VecConfig; | ||||
| typedef NonlinearConstraint1<VecConfig, Key, Vector> NLC1; | ||||
| typedef NonlinearConstraint2<VecConfig, Key, Vector, Key, Vector> NLC2; | ||||
| 
 | ||||
|  | @ -48,15 +47,12 @@ namespace test1 { | |||
| /* ************************************************************************* */ | ||||
| TEST( NonlinearConstraint1, unary_scalar_construction ) { | ||||
| 	// construct a constraint on x
 | ||||
| 	// the lagrange multipliers will be expected on L_x1
 | ||||
| 	// and there is only one multiplier
 | ||||
| 	size_t p = 1; | ||||
| 	Key x1(1); | ||||
| 	list<Key> keys;	keys += x1; | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC1 c1(boost::bind(test1::g, _1, keys), | ||||
| 			x1, boost::bind(test1::G, _1, keys), | ||||
| 			p, L1); | ||||
| 			p, 10.0); | ||||
| 
 | ||||
| 	// get a configuration to use for finding the error
 | ||||
| 	VecConfig config; | ||||
|  | @ -68,7 +64,7 @@ TEST( NonlinearConstraint1, unary_scalar_construction ) { | |||
| 	CHECK(assert_equal(actualVec, expectedVec, 1e-5)); | ||||
| 
 | ||||
| 	double actError = c1.error(config); | ||||
| 	double expError = 8.0; | ||||
| 	double expError = 160.0; | ||||
| 	DOUBLES_EQUAL(expError, actError, 1e-5); | ||||
| } | ||||
| 
 | ||||
|  | @ -77,27 +73,22 @@ TEST( NonlinearConstraint1, unary_scalar_linearize ) { | |||
| 	size_t p = 1; | ||||
| 	Key x1(1); | ||||
| 	list<Key> keys;	keys += x1; | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC1 c1(boost::bind(test1::g, _1, keys), | ||||
| 			x1, boost::bind(test1::G, _1, keys), | ||||
| 			p, L1); | ||||
| 			p); | ||||
| 
 | ||||
| 	// get a configuration to use for linearization (with lagrange multipliers)
 | ||||
| 	// get a configuration to use for linearization
 | ||||
| 	VecConfig realconfig; | ||||
| 	realconfig.insert(x1, Vector_(1, 1.0)); | ||||
| 	realconfig.insert(L1, Vector_(1, 3.0)); | ||||
| 
 | ||||
| 	// linearize the system
 | ||||
| 	GaussianFactor::shared_ptr linfactor = c1.linearize(realconfig); | ||||
| 
 | ||||
| 	// verify - probabilistic component goes on top
 | ||||
| 	Vector sigmas = Vector_(2, 1.0, 0.0); | ||||
| 	SharedDiagonal mixedModel = noiseModel::Constrained::MixedSigmas(sigmas); | ||||
| 	// stack the matrices to combine
 | ||||
| 	Matrix Ax1 = Matrix_(2,1, 6.0, 2.0), | ||||
| 		   AL1 = Matrix_(2,1, 1.0, 0.0); | ||||
| 	Vector rhs = Vector_(2, 0.0, 4.0); | ||||
| 	GaussianFactor expectedFactor(x1, Ax1, L1, AL1, rhs, mixedModel); | ||||
| 	// verify
 | ||||
| 	SharedDiagonal model = noiseModel::Constrained::All(p); | ||||
| 	Matrix Ax1 = Matrix_(p,1, 2.0); | ||||
| 	Vector rhs = Vector_(p, 4.0); | ||||
| 	GaussianFactor expectedFactor(x1, Ax1, rhs, model); | ||||
| 
 | ||||
| 	CHECK(assert_equal(*linfactor, expectedFactor)); | ||||
| } | ||||
|  | @ -106,12 +97,11 @@ TEST( NonlinearConstraint1, unary_scalar_linearize ) { | |||
| TEST( NonlinearConstraint1, unary_scalar_equal ) { | ||||
| 	Key x(0), y(1); | ||||
| 	list<Key> keys1, keys2; keys1 += x; keys2 += y; | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC1 | ||||
| 		c1(boost::bind(test1::g, _1, keys1), x, boost::bind(test1::G, _1, keys1), 1, L1, true), | ||||
| 		c2(boost::bind(test1::g, _1, keys1), x, boost::bind(test1::G, _1, keys1), 1, L1), | ||||
| 		c3(boost::bind(test1::g, _1, keys1), x, boost::bind(test1::G, _1, keys1), 2, L1), | ||||
| 		c4(boost::bind(test1::g, _1, keys2), y, boost::bind(test1::G, _1, keys2), 1, L1); | ||||
| 		c1(boost::bind(test1::g, _1, keys1), x, boost::bind(test1::G, _1, keys1), 1), | ||||
| 		c2(boost::bind(test1::g, _1, keys1), x, boost::bind(test1::G, _1, keys1), 1), | ||||
| 		c3(boost::bind(test1::g, _1, keys1), x, boost::bind(test1::G, _1, keys1), 2), | ||||
| 		c4(boost::bind(test1::g, _1, keys2), y, boost::bind(test1::G, _1, keys2), 1); | ||||
| 
 | ||||
| 	CHECK(assert_equal(c1, c2)); | ||||
| 	CHECK(assert_equal(c2, c1)); | ||||
|  | @ -147,17 +137,14 @@ namespace test2 { | |||
| /* ************************************************************************* */ | ||||
| TEST( NonlinearConstraint2, binary_scalar_construction ) { | ||||
| 	// construct a constraint on x and y
 | ||||
| 	// the lagrange multipliers will be expected on L_xy
 | ||||
| 	// and there is only one multiplier
 | ||||
| 	size_t p = 1; | ||||
| 	Key x0(0), x1(1); | ||||
| 	list<Key> keys; keys += x0, x1; | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC2 c1( | ||||
| 			boost::bind(test2::g, _1, keys), | ||||
| 			x0, boost::bind(test2::G1, _1, keys), | ||||
| 			x1, boost::bind(test2::G1, _1, keys), | ||||
| 			p, L1); | ||||
| 			p); | ||||
| 
 | ||||
| 	// get a configuration to use for finding the error
 | ||||
| 	VecConfig config; | ||||
|  | @ -176,30 +163,26 @@ TEST( NonlinearConstraint2, binary_scalar_linearize ) { | |||
| 	size_t p = 1; | ||||
| 	Key x0(0), x1(1); | ||||
| 	list<Key> keys; keys += x0, x1; | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC2 c1( | ||||
| 			boost::bind(test2::g, _1, keys), | ||||
| 			x0, boost::bind(test2::G1, _1, keys), | ||||
| 			x1, boost::bind(test2::G2, _1, keys), | ||||
| 			p, L1); | ||||
| 			p); | ||||
| 
 | ||||
| 	// get a configuration to use for finding the error
 | ||||
| 	VecConfig realconfig; | ||||
| 	realconfig.insert(x0, Vector_(1, 1.0)); | ||||
| 	realconfig.insert(x1, Vector_(1, 2.0)); | ||||
| 	realconfig.insert(L1, Vector_(1, 3.0)); | ||||
| 
 | ||||
| 	// linearize the system
 | ||||
| 	GaussianFactor::shared_ptr actualFactor = c1.linearize(realconfig); | ||||
| 
 | ||||
| 	// verify - probabilistic component goes on top
 | ||||
| 	Matrix Ax0 = Matrix_(2,1, 6.0, 2.0), | ||||
| 		   Ax1 = Matrix_(2,1,-3.0,-1.0), | ||||
| 		   AL  = Matrix_(2,1, 1.0, 0.0); | ||||
| 	Vector rhs = Vector_(2, 0.0, 6.0), | ||||
| 		   sigmas = Vector_(2, 1.0, 0.0); | ||||
| 	SharedDiagonal expModel = noiseModel::Constrained::MixedSigmas(sigmas); | ||||
| 	GaussianFactor expFactor(x0,Ax0, x1, Ax1,L1, AL, rhs, expModel); | ||||
| 	// verify
 | ||||
| 	Matrix Ax0 = Matrix_(1,1, 2.0), | ||||
| 		   Ax1 = Matrix_(1,1,-1.0); | ||||
| 	Vector rhs = Vector_(1, 6.0); | ||||
| 	SharedDiagonal expModel = noiseModel::Constrained::All(p); | ||||
| 	GaussianFactor expFactor(x0,Ax0, x1, Ax1,rhs, expModel); | ||||
| 	CHECK(assert_equal(expFactor, *actualFactor)); | ||||
| } | ||||
| 
 | ||||
|  | @ -208,12 +191,11 @@ TEST( NonlinearConstraint2, binary_scalar_equal ) { | |||
| 	list<Key> keys1, keys2, keys3; | ||||
| 	Key x0(0), x1(1), x2(2); | ||||
| 	keys1 += x0, x1; keys2 += x1, x0; keys3 += x0; | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC2 | ||||
| 		c1(boost::bind(test2::g, _1, keys1), x0, boost::bind(test2::G1, _1, keys1), x1, boost::bind(test2::G2, _1, keys1), 1, L1), | ||||
| 		c2(boost::bind(test2::g, _1, keys1), x0, boost::bind(test2::G1, _1, keys1), x1, boost::bind(test2::G2, _1, keys1), 1, L1), | ||||
| 		c3(boost::bind(test2::g, _1, keys2), x1, boost::bind(test2::G1, _1, keys2), x0, boost::bind(test2::G2, _1, keys2), 1, L1), | ||||
| 		c4(boost::bind(test2::g, _1, keys3), x0, boost::bind(test2::G1, _1, keys3), x2, boost::bind(test2::G2, _1, keys3), 3, L1); | ||||
| 		c1(boost::bind(test2::g, _1, keys1), x0, boost::bind(test2::G1, _1, keys1), x1, boost::bind(test2::G2, _1, keys1), 1), | ||||
| 		c2(boost::bind(test2::g, _1, keys1), x0, boost::bind(test2::G1, _1, keys1), x1, boost::bind(test2::G2, _1, keys1), 1), | ||||
| 		c3(boost::bind(test2::g, _1, keys2), x1, boost::bind(test2::G1, _1, keys2), x0, boost::bind(test2::G2, _1, keys2), 1), | ||||
| 		c4(boost::bind(test2::g, _1, keys3), x0, boost::bind(test2::G1, _1, keys3), x2, boost::bind(test2::G2, _1, keys3), 3); | ||||
| 
 | ||||
| 	CHECK(assert_equal(c1, c2)); | ||||
| 	CHECK(assert_equal(c2, c1)); | ||||
|  | @ -222,127 +204,120 @@ TEST( NonlinearConstraint2, binary_scalar_equal ) { | |||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| // Inequality tests
 | ||||
| // Inequality tests - DISABLED
 | ||||
| /* ************************************************************************* */ | ||||
| namespace inequality1 { | ||||
| 
 | ||||
| 	/** p = 1, g(x) x^2 - 5 > 0 */ | ||||
| 	Vector g(const VecConfig& config, const Key& key) { | ||||
| 		double x = config[key](0); | ||||
| 		double g = x * x - 5; | ||||
| 		return Vector_(1, g); // return the actual cost
 | ||||
| 	} | ||||
| 
 | ||||
| 	/** p = 1, jacobianG(x) = 2*x */ | ||||
| 	Matrix G(const VecConfig& config, const Key& key) { | ||||
| 		double x = config[key](0); | ||||
| 		return Matrix_(1, 1, 2 * x); | ||||
| 	} | ||||
| 
 | ||||
| } // \namespace inequality1
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| TEST( NonlinearConstraint1, unary_inequality ) { | ||||
| 	size_t p = 1; | ||||
| 	Key x0(0); | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC1 c1(boost::bind(inequality1::g, _1, x0), | ||||
| 			x0, boost::bind(inequality1::G, _1, x0), | ||||
| 			p, L1, | ||||
| 			false); // inequality constraint
 | ||||
| 
 | ||||
| 	// get configurations to use for evaluation
 | ||||
| 	VecConfig config1, config2; | ||||
| 	config1.insert(x0, Vector_(1, 10.0)); // should be inactive
 | ||||
| 	config2.insert(x0, Vector_(1, 1.0)); // should have nonzero error
 | ||||
| 
 | ||||
| 	// check error
 | ||||
| 	CHECK(!c1.active(config1)); | ||||
| 	Vector actualError2 = c1.unwhitenedError(config2); | ||||
| 	CHECK(assert_equal(actualError2, Vector_(1, -4.0, 1e-9))); | ||||
| 	CHECK(c1.active(config2)); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| TEST( NonlinearConstraint1, unary_inequality_linearize ) { | ||||
| 	size_t p = 1; | ||||
| 	Key x0(0); | ||||
| 	LagrangeKey L1(1); | ||||
| 	NLC1 c1(boost::bind(inequality1::g, _1, x0), | ||||
| 			x0, boost::bind(inequality1::G, _1, x0), | ||||
| 			p, L1, | ||||
| 			false); // inequality constraint
 | ||||
| 
 | ||||
| 	// get configurations to use for linearization
 | ||||
| 	VecConfig config1, config2; | ||||
| 	config1.insert(x0, Vector_(1, 10.0)); // should have zero error
 | ||||
| 	config2.insert(x0, Vector_(1, 1.0)); // should have nonzero error
 | ||||
| 	config1.insert(L1, Vector_(1, 3.0)); | ||||
| 	config2.insert(L1, Vector_(1, 3.0)); | ||||
| 
 | ||||
| 	// linearize for inactive constraint
 | ||||
| 	GaussianFactor::shared_ptr actualFactor1 = c1.linearize(config1); | ||||
| 
 | ||||
| 	// check if the factor is active
 | ||||
| 	CHECK(!c1.active(config1)); | ||||
| 
 | ||||
| 	// linearize for active constraint
 | ||||
| 	GaussianFactor::shared_ptr actualFactor2 = c1.linearize(config2); | ||||
| 	CHECK(c1.active(config2)); | ||||
| 
 | ||||
| 	// verify
 | ||||
| 	Vector sigmas = Vector_(2, 1.0, 0.0); | ||||
| 	SharedDiagonal model = noiseModel::Constrained::MixedSigmas(sigmas); | ||||
| 	GaussianFactor expectedFactor(x0, Matrix_(2,1, 6.0, 2.0), | ||||
| 								  L1, Matrix_(2,1, 1.0, 0.0), | ||||
| 								  Vector_(2, 0.0, 4.0), model); | ||||
| 
 | ||||
| 	CHECK(assert_equal(*actualFactor2, expectedFactor)); | ||||
| } | ||||
| //namespace inequality1 {
 | ||||
| //
 | ||||
| //	/** p = 1, g(x) x^2 - 5 > 0 */
 | ||||
| //	Vector g(const VecConfig& config, const Key& key) {
 | ||||
| //		double x = config[key](0);
 | ||||
| //		double g = x * x - 5;
 | ||||
| //		return Vector_(1, g); // return the actual cost
 | ||||
| //	}
 | ||||
| //
 | ||||
| //	/** p = 1, jacobianG(x) = 2*x */
 | ||||
| //	Matrix G(const VecConfig& config, const Key& key) {
 | ||||
| //		double x = config[key](0);
 | ||||
| //		return Matrix_(1, 1, 2 * x);
 | ||||
| //	}
 | ||||
| //
 | ||||
| //} // \namespace inequality1
 | ||||
| //
 | ||||
| ///* ************************************************************************* */
 | ||||
| //TEST( NonlinearConstraint1, unary_inequality ) {
 | ||||
| //	size_t p = 1;
 | ||||
| //	Key x0(0);
 | ||||
| //	NLC1 c1(boost::bind(inequality1::g, _1, x0),
 | ||||
| //			x0, boost::bind(inequality1::G, _1, x0),
 | ||||
| //			p, false); // inequality constraint
 | ||||
| //
 | ||||
| //	// get configurations to use for evaluation
 | ||||
| //	VecConfig config1, config2;
 | ||||
| //	config1.insert(x0, Vector_(1, 10.0)); // should be inactive
 | ||||
| //	config2.insert(x0, Vector_(1, 1.0)); // should have nonzero error
 | ||||
| //
 | ||||
| //	// check error
 | ||||
| //	CHECK(!c1.active(config1));
 | ||||
| //	Vector actualError2 = c1.unwhitenedError(config2);
 | ||||
| //	CHECK(assert_equal(actualError2, Vector_(1, -4.0, 1e-9)));
 | ||||
| //	CHECK(c1.active(config2));
 | ||||
| //}
 | ||||
| //
 | ||||
| ///* ************************************************************************* */
 | ||||
| //TEST( NonlinearConstraint1, unary_inequality_linearize ) {
 | ||||
| //	size_t p = 1;
 | ||||
| //	Key x0(0);
 | ||||
| //	NLC1 c1(boost::bind(inequality1::g, _1, x0),
 | ||||
| //			x0, boost::bind(inequality1::G, _1, x0),
 | ||||
| //			p, false); // inequality constraint
 | ||||
| //
 | ||||
| //	// get configurations to use for linearization
 | ||||
| //	VecConfig config1, config2;
 | ||||
| //	config1.insert(x0, Vector_(1, 10.0)); // should have zero error
 | ||||
| //	config2.insert(x0, Vector_(1, 1.0)); // should have nonzero error
 | ||||
| //
 | ||||
| //	// linearize for inactive constraint
 | ||||
| //	GaussianFactor::shared_ptr actualFactor1 = c1.linearize(config1);
 | ||||
| //
 | ||||
| //	// check if the factor is active
 | ||||
| //	CHECK(!c1.active(config1));
 | ||||
| //
 | ||||
| //	// linearize for active constraint
 | ||||
| //	GaussianFactor::shared_ptr actualFactor2 = c1.linearize(config2);
 | ||||
| //	CHECK(c1.active(config2));
 | ||||
| //
 | ||||
| //	// verify
 | ||||
| //	Vector sigmas = Vector_(2, 1.0, 0.0);
 | ||||
| //	SharedDiagonal model = noiseModel::Constrained::MixedSigmas(sigmas);
 | ||||
| //	GaussianFactor expectedFactor(x0, Matrix_(2,1, 6.0, 2.0),
 | ||||
| //								  L1, Matrix_(2,1, 1.0, 0.0),
 | ||||
| //								  Vector_(2, 0.0, 4.0), model);
 | ||||
| //
 | ||||
| //	CHECK(assert_equal(*actualFactor2, expectedFactor));
 | ||||
| //}
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| // Binding arbitrary functions
 | ||||
| /* ************************************************************************* */ | ||||
| namespace binding1 { | ||||
| 
 | ||||
| 	/** p = 1, g(x) x^2 - r > 0 */ | ||||
| 	Vector g(double r, const VecConfig& config, const Key& key) { | ||||
| 		double x = config[key](0); | ||||
| 		double g = x * x - r; | ||||
| 		return Vector_(1, g); // return the actual cost
 | ||||
| 	} | ||||
| 
 | ||||
| 	/** p = 1, jacobianG(x) = 2*x */ | ||||
| 	Matrix G(double coeff, const VecConfig& config, | ||||
| 			const Key& key) { | ||||
| 		double x = config[key](0); | ||||
| 		return Matrix_(1, 1, coeff * x); | ||||
| 	} | ||||
| 
 | ||||
| } // \namespace binding1
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| TEST( NonlinearConstraint1, unary_binding ) { | ||||
| 	size_t p = 1; | ||||
| 	double coeff = 2; | ||||
| 	double radius = 5; | ||||
| 	Key x0(0); LagrangeKey L1(1); | ||||
| 	NLC1 c1(boost::bind(binding1::g, radius, _1, x0), | ||||
| 			x0, boost::bind(binding1::G, coeff, _1, x0), | ||||
| 			p, L1, | ||||
| 			false); // inequality constraint
 | ||||
| 
 | ||||
| 	// get configurations to use for evaluation
 | ||||
| 	VecConfig config1, config2; | ||||
| 	config1.insert(x0, Vector_(1, 10.0)); // should have zero error
 | ||||
| 	config2.insert(x0, Vector_(1, 1.0)); // should have nonzero error
 | ||||
| 
 | ||||
| 	// check error
 | ||||
| 	CHECK(!c1.active(config1)); | ||||
| 	Vector actualError2 = c1.unwhitenedError(config2); | ||||
| 	CHECK(assert_equal(actualError2, Vector_(1, -4.0, 1e-9))); | ||||
| 	CHECK(c1.active(config2)); | ||||
| } | ||||
| //namespace binding1 {
 | ||||
| //
 | ||||
| //	/** p = 1, g(x) x^2 - r > 0 */
 | ||||
| //	Vector g(double r, const VecConfig& config, const Key& key) {
 | ||||
| //		double x = config[key](0);
 | ||||
| //		double g = x * x - r;
 | ||||
| //		return Vector_(1, g); // return the actual cost
 | ||||
| //	}
 | ||||
| //
 | ||||
| //	/** p = 1, jacobianG(x) = 2*x */
 | ||||
| //	Matrix G(double coeff, const VecConfig& config,
 | ||||
| //			const Key& key) {
 | ||||
| //		double x = config[key](0);
 | ||||
| //		return Matrix_(1, 1, coeff * x);
 | ||||
| //	}
 | ||||
| //
 | ||||
| //} // \namespace binding1
 | ||||
| //
 | ||||
| ///* ************************************************************************* */
 | ||||
| //TEST( NonlinearConstraint1, unary_binding ) {
 | ||||
| //	size_t p = 1;
 | ||||
| //	double coeff = 2;
 | ||||
| //	double radius = 5;
 | ||||
| //	Key x0(0);
 | ||||
| //	NLC1 c1(boost::bind(binding1::g, radius, _1, x0),
 | ||||
| //			x0, boost::bind(binding1::G, coeff, _1, x0),
 | ||||
| //			p, false); // inequality constraint
 | ||||
| //
 | ||||
| //	// get configurations to use for evaluation
 | ||||
| //	VecConfig config1, config2;
 | ||||
| //	config1.insert(x0, Vector_(1, 10.0)); // should have zero error
 | ||||
| //	config2.insert(x0, Vector_(1, 1.0)); // should have nonzero error
 | ||||
| //
 | ||||
| //	// check error
 | ||||
| //	CHECK(!c1.active(config1));
 | ||||
| //	Vector actualError2 = c1.unwhitenedError(config2);
 | ||||
| //	CHECK(assert_equal(actualError2, Vector_(1, -4.0, 1e-9)));
 | ||||
| //	CHECK(c1.active(config2));
 | ||||
| //}
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| namespace binding2 { | ||||
|  | @ -370,17 +345,15 @@ namespace binding2 { | |||
| /* ************************************************************************* */ | ||||
| TEST( NonlinearConstraint2, binary_binding ) { | ||||
| 	// construct a constraint on x and y
 | ||||
| 	// the lagrange multipliers will be expected on L_xy
 | ||||
| 	// and there is only one multiplier
 | ||||
| 	size_t p = 1; | ||||
| 	double a = 2.0; | ||||
| 	double b = 1.0; | ||||
| 	double r = 5.0; | ||||
| 	Key x0(0), x1(1); LagrangeKey L1(1); | ||||
| 	Key x0(0), x1(1); | ||||
| 	NLC2 c1(boost::bind(binding2::g, r, _1, x0, x1), | ||||
| 			x0, boost::bind(binding2::G1, a, _1, x0), | ||||
| 			x1, boost::bind(binding2::G2, b, _1), | ||||
| 			p, L1); | ||||
| 			p); | ||||
| 
 | ||||
| 	// get a configuration to use for finding the error
 | ||||
| 	VecConfig config; | ||||
|  | @ -393,6 +366,8 @@ TEST( NonlinearConstraint2, binary_binding ) { | |||
| 	CHECK(assert_equal(actual, expected, 1e-5)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | ||||
| /* ************************************************************************* */ | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ check_PROGRAMS += testGaussianBayesNet testGaussianFactor testGaussianFactorGrap | |||
| check_PROGRAMS += testGaussianISAM testGraph | ||||
| check_PROGRAMS += testInference testIterative testGaussianJunctionTree  | ||||
| check_PROGRAMS += testNonlinearEquality testNonlinearFactor testNonlinearFactorGraph | ||||
| check_PROGRAMS += testNonlinearOptimizer testSQP testSubgraphPreconditioner | ||||
| check_PROGRAMS += testNonlinearOptimizer testNonlinearConstraint testSubgraphPreconditioner | ||||
| check_PROGRAMS += testSymbolicBayesNet testSymbolicFactorGraph testTupleConfig | ||||
| 
 | ||||
| if USE_LDL | ||||
|  |  | |||
|  | @ -102,6 +102,217 @@ TEST( matrix, unconstrained_fg_ata ) { | |||
| //	CHECK(assert_equal(expected,x, 1e-4));
 | ||||
| //}
 | ||||
| 
 | ||||
| SharedDiagonal probModel1 = sharedSigma(1,1.0); | ||||
| SharedDiagonal probModel2 = sharedSigma(2,1.0); | ||||
| SharedDiagonal constraintModel1 = noiseModel::Constrained::All(1); | ||||
| 
 | ||||
| /* *********************************************************************
 | ||||
|  * This example uses a nonlinear objective function and | ||||
|  * nonlinear equality constraint.  The formulation is actually | ||||
|  * the Cholesky form that creates the full Hessian explicitly, | ||||
|  * which should really be avoided with our QR-based machinery. | ||||
|  * | ||||
|  * Note: the update equation used here has a fixed step size | ||||
|  * and gain that is rather arbitrarily chosen, and as such, | ||||
|  * will take a silly number of iterations. | ||||
|  */ | ||||
| TEST (SQP, problem1_cholesky ) { | ||||
| 	bool verbose = false; | ||||
| 	// use a nonlinear function of f(x) = x^2+y^2
 | ||||
| 	// nonlinear equality constraint: g(x) = x^2-5-y=0
 | ||||
| 	// Lagrangian: f(x) + \lambda*g(x)
 | ||||
| 
 | ||||
| 	// Symbols
 | ||||
| 	Symbol x1("x1"), y1("y1"), L1("L1"); | ||||
| 
 | ||||
| 	// state structure: [x y \lambda]
 | ||||
| 	VectorConfig init, state; | ||||
| 	init.insert(x1, Vector_(1, 1.0)); | ||||
| 	init.insert(y1, Vector_(1, 1.0)); | ||||
| 	init.insert(L1, Vector_(1, 1.0)); | ||||
| 	state = init; | ||||
| 
 | ||||
| 	if (verbose) init.print("Initial State"); | ||||
| 
 | ||||
| 	// loop until convergence
 | ||||
| 	int maxIt = 10; | ||||
| 	for (int i = 0; i<maxIt; ++i) { | ||||
| 		if (verbose) cout << "\n******************************\nIteration: " << i+1 << endl; | ||||
| 
 | ||||
| 		// extract the states
 | ||||
| 		double x, y, lambda; | ||||
| 		x = state[x1](0); | ||||
| 		y = state[y1](0); | ||||
| 		lambda = state[L1](0); | ||||
| 
 | ||||
| 		// calculate the components
 | ||||
| 		Matrix H1, H2, gradG; | ||||
| 		Vector gradL, gx; | ||||
| 
 | ||||
| 		// hessian of lagrangian function, in two columns:
 | ||||
| 		H1 = Matrix_(2,1, | ||||
| 				2.0+2.0*lambda, | ||||
| 				0.0); | ||||
| 		H2 = Matrix_(2,1, | ||||
| 				0.0, | ||||
| 				2.0); | ||||
| 
 | ||||
| 		// deriviative of lagrangian function
 | ||||
| 		gradL = Vector_(2, | ||||
| 				2.0*x*(1+lambda), | ||||
| 				2.0*y-lambda); | ||||
| 
 | ||||
| 		// constraint derivatives
 | ||||
| 		gradG = Matrix_(2,1, | ||||
| 				2.0*x, | ||||
| 				0.0); | ||||
| 
 | ||||
| 		// constraint value
 | ||||
| 		gx = Vector_(1, | ||||
| 				x*x-5-y); | ||||
| 
 | ||||
| 		// create a factor for the states
 | ||||
| 		GaussianFactor::shared_ptr f1(new | ||||
| 				GaussianFactor(x1, H1, y1, H2, L1, gradG, gradL, probModel2)); | ||||
| 
 | ||||
| 		// create a factor for the lagrange multiplier
 | ||||
| 		GaussianFactor::shared_ptr f2(new | ||||
| 				GaussianFactor(x1, -sub(gradG, 0, 1, 0, 1), | ||||
| 							   y1, -sub(gradG, 1, 2, 0, 1), -gx, constraintModel1)); | ||||
| 
 | ||||
| 		// construct graph
 | ||||
| 		GaussianFactorGraph fg; | ||||
| 		fg.push_back(f1); | ||||
| 		fg.push_back(f2); | ||||
| 		if (verbose) fg.print("Graph"); | ||||
| 
 | ||||
| 		// solve
 | ||||
| 		Ordering ord; | ||||
| 		ord += x1, y1, L1; | ||||
| 		VectorConfig delta = fg.optimize(ord).scale(-1.0); | ||||
| 		if (verbose) delta.print("Delta"); | ||||
| 
 | ||||
| 		// update initial estimate
 | ||||
| 		VectorConfig newState = expmap(state, delta); | ||||
| 		state = newState; | ||||
| 
 | ||||
| 		if (verbose) state.print("Updated State"); | ||||
| 	} | ||||
| 
 | ||||
| 	// verify that it converges to the nearest optimal point
 | ||||
| 	VectorConfig expected; | ||||
| 	expected.insert(L1, Vector_(1, -1.0)); | ||||
| 	expected.insert(x1, Vector_(1, 2.12)); | ||||
| 	expected.insert(y1, Vector_(1, -0.5)); | ||||
| 	CHECK(assert_equal(expected,state, 1e-2)); | ||||
| } | ||||
| 
 | ||||
| /* *********************************************************************
 | ||||
|  * This example uses a nonlinear objective function and | ||||
|  * nonlinear equality constraint.  This formulation splits | ||||
|  * the constraint into a factor and a linear constraint. | ||||
|  * | ||||
|  * This example uses the same silly number of iterations as the | ||||
|  * previous example. | ||||
|  */ | ||||
| TEST (SQP, problem1_sqp ) { | ||||
| 	bool verbose = false; | ||||
| 	// use a nonlinear function of f(x) = x^2+y^2
 | ||||
| 	// nonlinear equality constraint: g(x) = x^2-5-y=0
 | ||||
| 	// Lagrangian: f(x) + \lambda*g(x)
 | ||||
| 
 | ||||
| 	// Symbols
 | ||||
| 	Symbol x1("x1"), y1("y1"), L1("L1"); | ||||
| 
 | ||||
| 	// state structure: [x y \lambda]
 | ||||
| 	VectorConfig init, state; | ||||
| 	init.insert(x1, Vector_(1, 1.0)); | ||||
| 	init.insert(y1, Vector_(1, 1.0)); | ||||
| 	init.insert(L1, Vector_(1, 1.0)); | ||||
| 	state = init; | ||||
| 
 | ||||
| 	if (verbose) init.print("Initial State"); | ||||
| 
 | ||||
| 	// loop until convergence
 | ||||
| 	int maxIt = 5; | ||||
| 	for (int i = 0; i<maxIt; ++i) { | ||||
| 		if (verbose) cout << "\n******************************\nIteration: " << i+1 << endl; | ||||
| 
 | ||||
| 		// extract the states
 | ||||
| 		double x, y, lambda; | ||||
| 		x = state[x1](0); | ||||
| 		y = state[y1](0); | ||||
| 		lambda = state[L1](0); | ||||
| 
 | ||||
| 		/** create the linear factor
 | ||||
| 		 * ||h(x)-z||^2 => ||Ax-b||^2 | ||||
| 		 *  where: | ||||
| 		 *		h(x) simply returns the inputs | ||||
| 		 *		z    zeros(2) | ||||
| 		 *		A 	 identity | ||||
| 		 *		b	 linearization point | ||||
| 		 */ | ||||
| 		Matrix A = eye(2); | ||||
| 		Vector b = Vector_(2, x, y); | ||||
| 		GaussianFactor::shared_ptr f1( | ||||
| 						new GaussianFactor(x1, sub(A, 0,2, 0,1), // A(:,1)
 | ||||
| 										   y1, sub(A, 0,2, 1,2), // A(:,2)
 | ||||
| 										   b,                     // rhs of f(x)
 | ||||
| 										   probModel2));          // arbitrary sigma
 | ||||
| 
 | ||||
| 		/** create the constraint-linear factor
 | ||||
| 		 * Provides a mechanism to use variable gain to force the constraint | ||||
| 		 * \lambda*gradG*dx + d\lambda = zero | ||||
| 		 * formulated in matrix form as: | ||||
| 		 * [\lambda*gradG eye(1)] [dx; d\lambda] = zero | ||||
| 		 */ | ||||
| 		Matrix gradG = Matrix_(1, 2,2*x, -1.0); | ||||
| 		GaussianFactor::shared_ptr f2( | ||||
| 				new GaussianFactor(x1, lambda*sub(gradG, 0,1, 0,1), // scaled gradG(:,1)
 | ||||
| 								   y1, lambda*sub(gradG, 0,1, 1,2), // scaled gradG(:,2)
 | ||||
| 								   L1, eye(1),                      // dlambda term
 | ||||
| 								   Vector_(1, 0.0),                  // rhs is zero
 | ||||
| 								   probModel1));                     // arbitrary sigma
 | ||||
| 
 | ||||
| 		// create the actual constraint
 | ||||
| 		// [gradG] [x; y] - g = 0
 | ||||
| 		Vector g = Vector_(1,x*x-y-5); | ||||
| 		GaussianFactor::shared_ptr c1( | ||||
| 				new GaussianFactor(x1, sub(gradG, 0,1, 0,1),   // slice first part of gradG
 | ||||
| 								   y1, sub(gradG, 0,1, 1,2),   // slice second part of gradG
 | ||||
| 								   g,                           // value of constraint function
 | ||||
| 								   constraintModel1));          // force to constraint
 | ||||
| 
 | ||||
| 		// construct graph
 | ||||
| 		GaussianFactorGraph fg; | ||||
| 		fg.push_back(f1); | ||||
| 		fg.push_back(f2); | ||||
| 		fg.push_back(c1); | ||||
| 		if (verbose) fg.print("Graph"); | ||||
| 
 | ||||
| 		// solve
 | ||||
| 		Ordering ord; | ||||
| 		ord += x1, y1, L1; | ||||
| 		VectorConfig delta = fg.optimize(ord); | ||||
| 		if (verbose) delta.print("Delta"); | ||||
| 
 | ||||
| 		// update initial estimate
 | ||||
| 		VectorConfig newState = expmap(state, delta.scale(-1.0)); | ||||
| 
 | ||||
| 		// set the state to the updated state
 | ||||
| 		state = newState; | ||||
| 
 | ||||
| 		if (verbose) state.print("Updated State"); | ||||
| 	} | ||||
| 
 | ||||
| 	// verify that it converges to the nearest optimal point
 | ||||
| 	VectorConfig expected; | ||||
| 	expected.insert(x1, Vector_(1, 2.12)); | ||||
| 	expected.insert(y1, Vector_(1, -0.5)); | ||||
| 	CHECK(assert_equal(state[x1], expected[x1], 1e-2)); | ||||
| 	CHECK(assert_equal(state[y1], expected[y1], 1e-2)); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | ||||
| /* ************************************************************************* */ | ||||
|  |  | |||
|  | @ -41,223 +41,9 @@ SharedDiagonal constraintModel1 = noiseModel::Constrained::All(1); | |||
| // trick from some reading group
 | ||||
| #define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL) | ||||
| 
 | ||||
| /* *********************************************************************
 | ||||
|  * This example uses a nonlinear objective function and | ||||
|  * nonlinear equality constraint.  The formulation is actually | ||||
|  * the Cholesky form that creates the full Hessian explicitly, | ||||
|  * which should really be avoided with our QR-based machinery. | ||||
|  * | ||||
|  * Note: the update equation used here has a fixed step size | ||||
|  * and gain that is rather arbitrarily chosen, and as such, | ||||
|  * will take a silly number of iterations. | ||||
|  */ | ||||
| TEST (SQP, problem1_cholesky ) { | ||||
| 	bool verbose = false; | ||||
| 	// use a nonlinear function of f(x) = x^2+y^2
 | ||||
| 	// nonlinear equality constraint: g(x) = x^2-5-y=0
 | ||||
| 	// Lagrangian: f(x) + \lambda*g(x)
 | ||||
| 
 | ||||
| 	// Symbols
 | ||||
| 	Symbol x1("x1"), y1("y1"), L1("L1"); | ||||
| 
 | ||||
| 	// state structure: [x y \lambda]
 | ||||
| 	VectorConfig init, state; | ||||
| 	init.insert(x1, Vector_(1, 1.0)); | ||||
| 	init.insert(y1, Vector_(1, 1.0)); | ||||
| 	init.insert(L1, Vector_(1, 1.0)); | ||||
| 	state = init; | ||||
| 
 | ||||
| 	if (verbose) init.print("Initial State"); | ||||
| 
 | ||||
| 	// loop until convergence
 | ||||
| 	int maxIt = 10; | ||||
| 	for (int i = 0; i<maxIt; ++i) { | ||||
| 		if (verbose) cout << "\n******************************\nIteration: " << i+1 << endl; | ||||
| 
 | ||||
| 		// extract the states
 | ||||
| 		double x, y, lambda; | ||||
| 		x = state[x1](0); | ||||
| 		y = state[y1](0); | ||||
| 		lambda = state[L1](0); | ||||
| 
 | ||||
| 		// calculate the components
 | ||||
| 		Matrix H1, H2, gradG; | ||||
| 		Vector gradL, gx; | ||||
| 
 | ||||
| 		// hessian of lagrangian function, in two columns:
 | ||||
| 		H1 = Matrix_(2,1, | ||||
| 				2.0+2.0*lambda, | ||||
| 				0.0); | ||||
| 		H2 = Matrix_(2,1, | ||||
| 				0.0, | ||||
| 				2.0); | ||||
| 
 | ||||
| 		// deriviative of lagrangian function
 | ||||
| 		gradL = Vector_(2, | ||||
| 				2.0*x*(1+lambda), | ||||
| 				2.0*y-lambda); | ||||
| 
 | ||||
| 		// constraint derivatives
 | ||||
| 		gradG = Matrix_(2,1, | ||||
| 				2.0*x, | ||||
| 				0.0); | ||||
| 
 | ||||
| 		// constraint value
 | ||||
| 		gx = Vector_(1, | ||||
| 				x*x-5-y); | ||||
| 
 | ||||
| 		// create a factor for the states
 | ||||
| 		GaussianFactor::shared_ptr f1(new | ||||
| 				GaussianFactor(x1, H1, y1, H2, L1, gradG, gradL, probModel2)); | ||||
| 
 | ||||
| 		// create a factor for the lagrange multiplier
 | ||||
| 		GaussianFactor::shared_ptr f2(new | ||||
| 				GaussianFactor(x1, -sub(gradG, 0, 1, 0, 1), | ||||
| 							   y1, -sub(gradG, 1, 2, 0, 1), -gx, constraintModel1)); | ||||
| 
 | ||||
| 		// construct graph
 | ||||
| 		GaussianFactorGraph fg; | ||||
| 		fg.push_back(f1); | ||||
| 		fg.push_back(f2); | ||||
| 		if (verbose) fg.print("Graph"); | ||||
| 
 | ||||
| 		// solve
 | ||||
| 		Ordering ord; | ||||
| 		ord += x1, y1, L1; | ||||
| 		VectorConfig delta = fg.optimize(ord).scale(-1.0); | ||||
| 		if (verbose) delta.print("Delta"); | ||||
| 
 | ||||
| 		// update initial estimate
 | ||||
| 		VectorConfig newState = expmap(state, delta); | ||||
| 		state = newState; | ||||
| 
 | ||||
| 		if (verbose) state.print("Updated State"); | ||||
| 	} | ||||
| 
 | ||||
| 	// verify that it converges to the nearest optimal point
 | ||||
| 	VectorConfig expected; | ||||
| 	expected.insert(L1, Vector_(1, -1.0)); | ||||
| 	expected.insert(x1, Vector_(1, 2.12)); | ||||
| 	expected.insert(y1, Vector_(1, -0.5)); | ||||
| 	CHECK(assert_equal(expected,state, 1e-2)); | ||||
| } | ||||
| 
 | ||||
| /* *********************************************************************
 | ||||
|  * This example uses a nonlinear objective function and | ||||
|  * nonlinear equality constraint.  This formulation splits | ||||
|  * the constraint into a factor and a linear constraint. | ||||
|  * | ||||
|  * This example uses the same silly number of iterations as the | ||||
|  * previous example. | ||||
|  */ | ||||
| TEST (SQP, problem1_sqp ) { | ||||
| 	bool verbose = false; | ||||
| 	// use a nonlinear function of f(x) = x^2+y^2
 | ||||
| 	// nonlinear equality constraint: g(x) = x^2-5-y=0
 | ||||
| 	// Lagrangian: f(x) + \lambda*g(x)
 | ||||
| 
 | ||||
| 	// Symbols
 | ||||
| 	Symbol x1("x1"), y1("y1"), L1("L1"); | ||||
| 
 | ||||
| 	// state structure: [x y \lambda]
 | ||||
| 	VectorConfig init, state; | ||||
| 	init.insert(x1, Vector_(1, 1.0)); | ||||
| 	init.insert(y1, Vector_(1, 1.0)); | ||||
| 	init.insert(L1, Vector_(1, 1.0)); | ||||
| 	state = init; | ||||
| 
 | ||||
| 	if (verbose) init.print("Initial State"); | ||||
| 
 | ||||
| 	// loop until convergence
 | ||||
| 	int maxIt = 5; | ||||
| 	for (int i = 0; i<maxIt; ++i) { | ||||
| 		if (verbose) cout << "\n******************************\nIteration: " << i+1 << endl; | ||||
| 
 | ||||
| 		// extract the states
 | ||||
| 		double x, y, lambda; | ||||
| 		x = state[x1](0); | ||||
| 		y = state[y1](0); | ||||
| 		lambda = state[L1](0); | ||||
| 
 | ||||
| 		/** create the linear factor
 | ||||
| 		 * ||h(x)-z||^2 => ||Ax-b||^2 | ||||
| 		 *  where: | ||||
| 		 *		h(x) simply returns the inputs | ||||
| 		 *		z    zeros(2) | ||||
| 		 *		A 	 identity | ||||
| 		 *		b	 linearization point | ||||
| 		 */ | ||||
| 		Matrix A = eye(2); | ||||
| 		Vector b = Vector_(2, x, y); | ||||
| 		GaussianFactor::shared_ptr f1( | ||||
| 						new GaussianFactor(x1, sub(A, 0,2, 0,1), // A(:,1)
 | ||||
| 										   y1, sub(A, 0,2, 1,2), // A(:,2)
 | ||||
| 										   b,                     // rhs of f(x)
 | ||||
| 										   probModel2));          // arbitrary sigma
 | ||||
| 
 | ||||
| 		/** create the constraint-linear factor
 | ||||
| 		 * Provides a mechanism to use variable gain to force the constraint | ||||
| 		 * \lambda*gradG*dx + d\lambda = zero | ||||
| 		 * formulated in matrix form as: | ||||
| 		 * [\lambda*gradG eye(1)] [dx; d\lambda] = zero | ||||
| 		 */ | ||||
| 		Matrix gradG = Matrix_(1, 2,2*x, -1.0); | ||||
| 		GaussianFactor::shared_ptr f2( | ||||
| 				new GaussianFactor(x1, lambda*sub(gradG, 0,1, 0,1), // scaled gradG(:,1)
 | ||||
| 								   y1, lambda*sub(gradG, 0,1, 1,2), // scaled gradG(:,2)
 | ||||
| 								   L1, eye(1),                      // dlambda term
 | ||||
| 								   Vector_(1, 0.0),                  // rhs is zero
 | ||||
| 								   probModel1));                     // arbitrary sigma
 | ||||
| 
 | ||||
| 		// create the actual constraint
 | ||||
| 		// [gradG] [x; y] - g = 0
 | ||||
| 		Vector g = Vector_(1,x*x-y-5); | ||||
| 		GaussianFactor::shared_ptr c1( | ||||
| 				new GaussianFactor(x1, sub(gradG, 0,1, 0,1),   // slice first part of gradG
 | ||||
| 								   y1, sub(gradG, 0,1, 1,2),   // slice second part of gradG
 | ||||
| 								   g,                           // value of constraint function
 | ||||
| 								   constraintModel1));          // force to constraint
 | ||||
| 
 | ||||
| 		// construct graph
 | ||||
| 		GaussianFactorGraph fg; | ||||
| 		fg.push_back(f1); | ||||
| 		fg.push_back(f2); | ||||
| 		fg.push_back(c1); | ||||
| 		if (verbose) fg.print("Graph"); | ||||
| 
 | ||||
| 		// solve
 | ||||
| 		Ordering ord; | ||||
| 		ord += x1, y1, L1; | ||||
| 		VectorConfig delta = fg.optimize(ord); | ||||
| 		if (verbose) delta.print("Delta"); | ||||
| 
 | ||||
| 		// update initial estimate
 | ||||
| 		VectorConfig newState = expmap(state, delta.scale(-1.0)); | ||||
| 
 | ||||
| 		// set the state to the updated state
 | ||||
| 		state = newState; | ||||
| 
 | ||||
| 		if (verbose) state.print("Updated State"); | ||||
| 	} | ||||
| 
 | ||||
| 	// verify that it converges to the nearest optimal point
 | ||||
| 	VectorConfig expected; | ||||
| 	expected.insert(x1, Vector_(1, 2.12)); | ||||
| 	expected.insert(y1, Vector_(1, -0.5)); | ||||
| 	CHECK(assert_equal(state[x1], expected[x1], 1e-2)); | ||||
| 	CHECK(assert_equal(state[y1], expected[y1], 1e-2)); | ||||
| } | ||||
| 
 | ||||
| /* ********************************************************************* */ | ||||
| 
 | ||||
| // Basic configs
 | ||||
| typedef LieConfig<LagrangeKey, Vector> LagrangeConfig; | ||||
| 
 | ||||
| // full components
 | ||||
| typedef TupleConfig3<LieConfig<simulated2D::PoseKey, Point2>, | ||||
| 					 LieConfig<simulated2D::PointKey, Point2>, | ||||
| 					 LieConfig<LagrangeKey, Vector> > Config2D; | ||||
| //typedef TupleConfig<LagrangeConfig, TupleConfigEnd<simulated2D::Config> > Config2D;
 | ||||
| typedef simulated2D::Config Config2D; | ||||
| typedef NonlinearFactorGraph<Config2D> Graph2D; | ||||
| typedef NonlinearEquality<Config2D, simulated2D::PoseKey, Point2> NLE; | ||||
| typedef boost::shared_ptr<simulated2D::GenericMeasurement<Config2D> > shared; | ||||
|  | @ -268,7 +54,7 @@ typedef NonlinearOptimizer<Graph2D, Config2D> Optimizer; | |||
|  * with two poses seeing one landmark, with each pose | ||||
|  * constrained to a particular value | ||||
|  */ | ||||
| TEST (SQP, two_pose_truth ) { | ||||
| TEST (NonlinearConstraint, two_pose_truth ) { | ||||
| 	bool verbose = false; | ||||
| 
 | ||||
| 	// create a graph
 | ||||
|  | @ -379,7 +165,7 @@ typedef NonlinearConstraint2< | |||
|  *  should be the same. Note that this is a linear system, | ||||
|  *  so it will converge in one step. | ||||
|  */ | ||||
| TEST (SQP, two_pose ) { | ||||
| TEST (NonlinearConstraint, two_pose ) { | ||||
| 	bool verbose = false; | ||||
| 
 | ||||
| 	// create the graph
 | ||||
|  | @ -407,13 +193,12 @@ TEST (SQP, two_pose ) { | |||
| 	graph->push_back(f2); | ||||
| 
 | ||||
| 	// equality constraint between l1 and l2
 | ||||
| 	LagrangeKey L1(1); | ||||
| 	list<simulated2D::PointKey> keys2; keys2 += l1, l2; | ||||
| 	boost::shared_ptr<NLC2 > c2(new NLC2( | ||||
| 					boost::bind(sqp_test1::g, _1, keys2), | ||||
| 					l1, boost::bind(sqp_test1::G1, _1, keys2), | ||||
| 					l2, boost::bind(sqp_test1::G2, _1, keys2), | ||||
| 					2, L1)); | ||||
| 					2)); | ||||
| 	graph->push_back(c2); | ||||
| 
 | ||||
| 	if (verbose) graph->print("Initial nonlinear graph with constraints"); | ||||
|  | @ -424,7 +209,6 @@ TEST (SQP, two_pose ) { | |||
| 	initialEstimate->insert(x2, Point2()); | ||||
| 	initialEstimate->insert(l1, Point2(1.0, 6.0)); // ground truth
 | ||||
| 	initialEstimate->insert(l2, Point2(-4.0, 0.0)); // starting with a separate reference frame
 | ||||
| 	initialEstimate->insert(L1, Vector_(2, 1.0, 1.0)); // connect the landmarks
 | ||||
| 
 | ||||
| 	// create state config variables and initialize them
 | ||||
| 	Config2D state(*initialEstimate); | ||||
|  | @ -436,7 +220,7 @@ TEST (SQP, two_pose ) { | |||
| 
 | ||||
| 	// create an ordering
 | ||||
| 	Ordering ordering; | ||||
| 	ordering += "x1", "x2", "l1", "l2", "L1"; | ||||
| 	ordering += "x1", "x2", "l1", "l2"; | ||||
| 
 | ||||
| 	// optimize linear graph to get full delta config
 | ||||
| 	GaussianBayesNet cbn = fg->eliminate(ordering); | ||||
|  | @ -455,7 +239,6 @@ TEST (SQP, two_pose ) { | |||
| 	expected.insert(l1, Point2(1.0, 6.0)); | ||||
| 	expected.insert(l2, Point2(1.0, 6.0)); | ||||
| 	expected.insert(x2, Point2(5.0, 6.0)); | ||||
| 	expected.insert(L1, Vector_(2, 6.0, 7.0)); | ||||
| 	CHECK(assert_equal(expected, state, 1e-5)); | ||||
| } | ||||
| 
 | ||||
|  | @ -474,9 +257,10 @@ using namespace boost; | |||
| // typedefs for visual SLAM example
 | ||||
| typedef TypedSymbol<Pose3, 'x'> Pose3Key; | ||||
| typedef TypedSymbol<Point3, 'l'> Point3Key; | ||||
| typedef TupleConfig3<LieConfig<LagrangeKey, Vector>, | ||||
| 					 LieConfig<Pose3Key, Pose3>, | ||||
| 					 LieConfig<Point3Key, Point3> > VConfig; | ||||
| //typedef TupleConfig3<LieConfig<LagrangeKey, Vector>,
 | ||||
| //					 LieConfig<Pose3Key, Pose3>,
 | ||||
| //					 LieConfig<Point3Key, Point3> > VConfig;
 | ||||
| typedef visualSLAM::Config VConfig; | ||||
| typedef NonlinearFactorGraph<VConfig> VGraph; | ||||
| typedef boost::shared_ptr<GenericProjectionFactor<VConfig> > shared_vf; | ||||
| typedef NonlinearOptimizer<VGraph,VConfig> VOptimizer; | ||||
|  | @ -487,7 +271,7 @@ typedef NonlinearEquality<VConfig, Pose3Key, Pose3> Pose3Constraint; | |||
| /**
 | ||||
|  * Ground truth for a visual SLAM example with stereo vision | ||||
|  */ | ||||
| TEST (SQP, stereo_truth ) { | ||||
| TEST (NonlinearConstraint, stereo_truth ) { | ||||
| 	bool verbose = false; | ||||
| 
 | ||||
| 	// create initial estimates
 | ||||
|  | @ -555,7 +339,7 @@ TEST (SQP, stereo_truth ) { | |||
|  * Ground truth for a visual SLAM example with stereo vision | ||||
|  * with some noise injected into the initial config | ||||
|  */ | ||||
| TEST (SQP, stereo_truth_noisy ) { | ||||
| TEST (NonlinearConstraint, stereo_truth_noisy ) { | ||||
| 	bool verbose = false; | ||||
| 
 | ||||
| 	// setting to determine how far away the noisy landmark is,
 | ||||
|  | @ -696,12 +480,11 @@ boost::shared_ptr<VGraph> stereoExampleGraph() { | |||
| 	// as the previous examples
 | ||||
| 	visualSLAM::PointKey l1(1), l2(2); | ||||
| 	list<Point3Key> keys; keys += l1, l2; | ||||
| 	LagrangeKey L12(12); | ||||
| 	shared_ptr<VNLC2> c2( | ||||
| 			new VNLC2(boost::bind(sqp_stereo::g, _1, keys), | ||||
| 					 l1, boost::bind(sqp_stereo::G1, _1, keys), | ||||
| 					 l2, boost::bind(sqp_stereo::G2, _1, keys), | ||||
| 					 3, L12)); | ||||
| 					 3)); | ||||
| 	graph->push_back(c2); | ||||
| 
 | ||||
| 	return graph; | ||||
|  | @ -736,7 +519,7 @@ boost::shared_ptr<VConfig> stereoExampleTruthConfig() { | |||
|  * SQP version of the above stereo example, | ||||
|  * with the initial case as the ground truth | ||||
|  */ | ||||
| TEST (SQP, stereo_sqp ) { | ||||
| TEST (NonlinearConstraint, stereo_sqp ) { | ||||
| 	bool verbose = false; | ||||
| 
 | ||||
| 	// get a graph
 | ||||
|  | @ -745,11 +528,10 @@ TEST (SQP, stereo_sqp ) { | |||
| 
 | ||||
| 	// get the truth config
 | ||||
| 	boost::shared_ptr<VConfig> truthConfig = stereoExampleTruthConfig(); | ||||
| 	truthConfig->insert(LagrangeKey(12), Vector_(3, 1.0, 1.0, 1.0)); | ||||
| 
 | ||||
| 	// create ordering
 | ||||
| 	shared_ptr<Ordering> ord(new Ordering()); | ||||
| 	*ord += "x1", "x2", "l1", "l2", "L12"; | ||||
| 	*ord += "x1", "x2", "l1", "l2"; | ||||
| 	VOptimizer::shared_solver solver(new VOptimizer::solver(ord)); | ||||
| 
 | ||||
| 	// create optimizer
 | ||||
|  | @ -766,7 +548,7 @@ TEST (SQP, stereo_sqp ) { | |||
|  * SQP version of the above stereo example, | ||||
|  * with noise in the initial estimate | ||||
|  */ | ||||
| TEST (SQP, stereo_sqp_noisy ) { | ||||
| TEST (NonlinearConstraint, stereo_sqp_noisy ) { | ||||
| 
 | ||||
| 	// get a graph
 | ||||
| 	boost::shared_ptr<VGraph> graph = stereoExampleGraph(); | ||||
|  | @ -787,11 +569,10 @@ TEST (SQP, stereo_sqp_noisy ) { | |||
| 	initConfig->insert(Pose3Key(2), pose2); | ||||
| 	initConfig->insert(Point3Key(1), landmark1); | ||||
| 	initConfig->insert(Point3Key(2), landmark2); // create two landmarks in same place
 | ||||
| 	initConfig->insert(LagrangeKey(12), Vector_(3, 1.0, 1.0, 1.0)); | ||||
| 
 | ||||
| 	// create ordering
 | ||||
| 	shared_ptr<Ordering> ord(new Ordering()); | ||||
| 	*ord += "x1", "x2", "l1", "l2", "L12"; | ||||
| 	*ord += "x1", "x2", "l1", "l2"; | ||||
| 	VOptimizer::shared_solver solver(new VOptimizer::solver(ord)); | ||||
| 
 | ||||
| 	// create optimizer
 | ||||
|  | @ -809,7 +590,6 @@ TEST (SQP, stereo_sqp_noisy ) { | |||
| 
 | ||||
| 	// get the truth config
 | ||||
| 	boost::shared_ptr<VConfig> truthConfig = stereoExampleTruthConfig(); | ||||
| 	truthConfig->insert(LagrangeKey(12), Vector_(3, 0.0, 1.0, 1.0)); | ||||
| 
 | ||||
| 	// check if correct
 | ||||
| 	CHECK(assert_equal(*truthConfig,*actual, 1e-5)); | ||||
|  | @ -817,17 +597,9 @@ TEST (SQP, stereo_sqp_noisy ) { | |||
| 
 | ||||
| static SharedGaussian sigma(noiseModel::Isotropic::Sigma(1,0.1)); | ||||
| 
 | ||||
| // typedefs
 | ||||
| //typedef simulated2D::Config Config2D;
 | ||||
| //typedef boost::shared_ptr<Config2D> shared_config;
 | ||||
| //typedef NonlinearFactorGraph<Config2D> NLGraph;
 | ||||
| //typedef boost::shared_ptr<NonlinearFactor<Config2D> > shared;
 | ||||
| 
 | ||||
| namespace map_warp_example { | ||||
| typedef NonlinearConstraint1< | ||||
| 	Config2D, simulated2D::PoseKey, Point2> NLC1; | ||||
| //typedef NonlinearConstraint2<
 | ||||
| //	Config2D, simulated2D::PointKey, Point2, simulated2D::PointKey, Point2> NLC2;
 | ||||
| } // \namespace map_warp_example
 | ||||
| 
 | ||||
| /* ********************************************************************* */ | ||||
|  | @ -881,10 +653,9 @@ boost::shared_ptr<Graph2D> linearMapWarpGraph() { | |||
| 	simulated2D::PointKey l1(1), l2(2); | ||||
| 
 | ||||
| 	// constant constraint on x1
 | ||||
| 	LagrangeKey L1(1); | ||||
| 	shared_ptr<NLC1> c1(new NLC1(boost::bind(sqp_LinearMapWarp1::g_func, _1, x1), | ||||
| 							x1, boost::bind(sqp_LinearMapWarp1::jac_g, _1), | ||||
| 							2, L1)); | ||||
| 							2)); | ||||
| 
 | ||||
| 	// measurement from x1 to l1
 | ||||
| 	Point2 z1(0.0, 5.0); | ||||
|  | @ -895,12 +666,11 @@ boost::shared_ptr<Graph2D> linearMapWarpGraph() { | |||
| 	shared f2(new simulated2D::GenericMeasurement<Config2D>(z2, sigma, x2,l2)); | ||||
| 
 | ||||
| 	// equality constraint between l1 and l2
 | ||||
| 	LagrangeKey L12(12); | ||||
| 	shared_ptr<NLC2> c2 (new NLC2( | ||||
| 			boost::bind(sqp_LinearMapWarp2::g_func, _1, l1, l2), | ||||
| 			l1, boost::bind(sqp_LinearMapWarp2::jac_g1, _1), | ||||
| 			l2, boost::bind(sqp_LinearMapWarp2::jac_g2, _1), | ||||
| 			2, L12)); | ||||
| 			2)); | ||||
| 
 | ||||
| 	// construct the graph
 | ||||
| 	boost::shared_ptr<Graph2D> graph(new Graph2D()); | ||||
|  | @ -920,7 +690,6 @@ TEST ( SQPOptimizer, map_warp_initLam ) { | |||
| 	// keys
 | ||||
| 	simulated2D::PoseKey x1(1), x2(2); | ||||
| 	simulated2D::PointKey l1(1), l2(2); | ||||
| 	LagrangeKey L1(1), L12(12); | ||||
| 
 | ||||
| 	// create an initial estimate
 | ||||
| 	shared_ptr<Config2D> initialEstimate(new Config2D); | ||||
|  | @ -928,12 +697,10 @@ TEST ( SQPOptimizer, map_warp_initLam ) { | |||
| 	initialEstimate->insert(l1, Point2(1.0, 6.0)); | ||||
| 	initialEstimate->insert(l2, Point2(-4.0, 0.0)); // starting with a separate reference frame
 | ||||
| 	initialEstimate->insert(x2, Point2(0.0, 0.0)); // other pose starts at origin
 | ||||
| 	initialEstimate->insert(L12, Vector_(2, 1.0, 1.0)); | ||||
| 	initialEstimate->insert(L1, Vector_(2, 1.0, 1.0)); | ||||
| 
 | ||||
| 	// create an ordering
 | ||||
| 	shared_ptr<Ordering> ordering(new Ordering()); | ||||
| 	*ordering += "x1", "x2", "l1", "l2", "L12", "L1"; | ||||
| 	*ordering += "x1", "x2", "l1", "l2"; | ||||
| 
 | ||||
| 	// create an optimizer
 | ||||
| 	Optimizer::shared_solver solver(new Optimizer::solver(ordering)); | ||||
|  | @ -949,8 +716,6 @@ TEST ( SQPOptimizer, map_warp_initLam ) { | |||
| 	expected.insert(l1, Point2(1.0, 6.0)); | ||||
| 	expected.insert(l2, Point2(1.0, 6.0)); | ||||
| 	expected.insert(x2, Point2(5.0, 6.0)); | ||||
| 	expected.insert(L1, Vector_(2, 1.0, 1.0)); | ||||
| 	expected.insert(L12, Vector_(2, 6.0, 7.0)); | ||||
| 	CHECK(assert_equal(expected, actual)); | ||||
| } | ||||
| 
 | ||||
|  | @ -1107,6 +872,215 @@ TEST ( SQPOptimizer, map_warp_initLam ) { | |||
| //	CHECK(assert_equal(exp2, *(final.config())));
 | ||||
| //}
 | ||||
| 
 | ||||
| /* *********************************************************************
 | ||||
|  * Example from SQP testing: | ||||
|  * | ||||
|  * This example uses a nonlinear objective function and | ||||
|  * nonlinear equality constraint.  The formulation is actually | ||||
|  * the Cholesky form that creates the full Hessian explicitly, | ||||
|  * which should really be avoided with our QR-based machinery. | ||||
|  * | ||||
|  * Note: the update equation used here has a fixed step size | ||||
|  * and gain that is rather arbitrarily chosen, and as such, | ||||
|  * will take a silly number of iterations. | ||||
|  */ | ||||
| TEST (NonlinearConstraint, problem1_cholesky ) { | ||||
| 	bool verbose = false; | ||||
| 	// use a nonlinear function of f(x) = x^2+y^2
 | ||||
| 	// nonlinear equality constraint: g(x) = x^2-5-y=0
 | ||||
| 	// Lagrangian: f(x) + \lambda*g(x)
 | ||||
| 
 | ||||
| 	// Symbols
 | ||||
| 	Symbol x1("x1"), y1("y1"), L1("L1"); | ||||
| 
 | ||||
| 	// state structure: [x y \lambda]
 | ||||
| 	VectorConfig init, state; | ||||
| 	init.insert(x1, Vector_(1, 1.0)); | ||||
| 	init.insert(y1, Vector_(1, 1.0)); | ||||
| 	init.insert(L1, Vector_(1, 1.0)); | ||||
| 	state = init; | ||||
| 
 | ||||
| 	if (verbose) init.print("Initial State"); | ||||
| 
 | ||||
| 	// loop until convergence
 | ||||
| 	int maxIt = 10; | ||||
| 	for (int i = 0; i<maxIt; ++i) { | ||||
| 		if (verbose) cout << "\n******************************\nIteration: " << i+1 << endl; | ||||
| 
 | ||||
| 		// extract the states
 | ||||
| 		double x, y, lambda; | ||||
| 		x = state[x1](0); | ||||
| 		y = state[y1](0); | ||||
| 		lambda = state[L1](0); | ||||
| 
 | ||||
| 		// calculate the components
 | ||||
| 		Matrix H1, H2, gradG; | ||||
| 		Vector gradL, gx; | ||||
| 
 | ||||
| 		// hessian of lagrangian function, in two columns:
 | ||||
| 		H1 = Matrix_(2,1, | ||||
| 				2.0+2.0*lambda, | ||||
| 				0.0); | ||||
| 		H2 = Matrix_(2,1, | ||||
| 				0.0, | ||||
| 				2.0); | ||||
| 
 | ||||
| 		// deriviative of lagrangian function
 | ||||
| 		gradL = Vector_(2, | ||||
| 				2.0*x*(1+lambda), | ||||
| 				2.0*y-lambda); | ||||
| 
 | ||||
| 		// constraint derivatives
 | ||||
| 		gradG = Matrix_(2,1, | ||||
| 				2.0*x, | ||||
| 				0.0); | ||||
| 
 | ||||
| 		// constraint value
 | ||||
| 		gx = Vector_(1, | ||||
| 				x*x-5-y); | ||||
| 
 | ||||
| 		// create a factor for the states
 | ||||
| 		GaussianFactor::shared_ptr f1(new | ||||
| 				GaussianFactor(x1, H1, y1, H2, L1, gradG, gradL, probModel2)); | ||||
| 
 | ||||
| 		// create a factor for the lagrange multiplier
 | ||||
| 		GaussianFactor::shared_ptr f2(new | ||||
| 				GaussianFactor(x1, -sub(gradG, 0, 1, 0, 1), | ||||
| 							   y1, -sub(gradG, 1, 2, 0, 1), -gx, constraintModel1)); | ||||
| 
 | ||||
| 		// construct graph
 | ||||
| 		GaussianFactorGraph fg; | ||||
| 		fg.push_back(f1); | ||||
| 		fg.push_back(f2); | ||||
| 		if (verbose) fg.print("Graph"); | ||||
| 
 | ||||
| 		// solve
 | ||||
| 		Ordering ord; | ||||
| 		ord += x1, y1, L1; | ||||
| 		VectorConfig delta = fg.optimize(ord).scale(-1.0); | ||||
| 		if (verbose) delta.print("Delta"); | ||||
| 
 | ||||
| 		// update initial estimate
 | ||||
| 		VectorConfig newState = expmap(state, delta); | ||||
| 		state = newState; | ||||
| 
 | ||||
| 		if (verbose) state.print("Updated State"); | ||||
| 	} | ||||
| 
 | ||||
| 	// verify that it converges to the nearest optimal point
 | ||||
| 	VectorConfig expected; | ||||
| 	expected.insert(L1, Vector_(1, -1.0)); | ||||
| 	expected.insert(x1, Vector_(1, 2.12)); | ||||
| 	expected.insert(y1, Vector_(1, -0.5)); | ||||
| 	CHECK(assert_equal(expected,state, 1e-2)); | ||||
| } | ||||
| 
 | ||||
| /* *********************************************************************
 | ||||
|  * This example uses a nonlinear objective function and | ||||
|  * nonlinear equality constraint.  This formulation splits | ||||
|  * the constraint into a factor and a linear constraint. | ||||
|  * | ||||
|  * This example uses the same silly number of iterations as the | ||||
|  * previous example. | ||||
|  */ | ||||
| TEST (NonlinearConstraint, problem1_sqp ) { | ||||
| 	bool verbose = false; | ||||
| 	// use a nonlinear function of f(x) = x^2+y^2
 | ||||
| 	// nonlinear equality constraint: g(x) = x^2-5-y=0
 | ||||
| 	// Lagrangian: f(x) + \lambda*g(x)
 | ||||
| 
 | ||||
| 	// Symbols
 | ||||
| 	Symbol x1("x1"), y1("y1"), L1("L1"); | ||||
| 
 | ||||
| 	// state structure: [x y \lambda]
 | ||||
| 	VectorConfig init, state; | ||||
| 	init.insert(x1, Vector_(1, 1.0)); | ||||
| 	init.insert(y1, Vector_(1, 1.0)); | ||||
| 	init.insert(L1, Vector_(1, 1.0)); | ||||
| 	state = init; | ||||
| 
 | ||||
| 	if (verbose) init.print("Initial State"); | ||||
| 
 | ||||
| 	// loop until convergence
 | ||||
| 	int maxIt = 5; | ||||
| 	for (int i = 0; i<maxIt; ++i) { | ||||
| 		if (verbose) cout << "\n******************************\nIteration: " << i+1 << endl; | ||||
| 
 | ||||
| 		// extract the states
 | ||||
| 		double x, y, lambda; | ||||
| 		x = state[x1](0); | ||||
| 		y = state[y1](0); | ||||
| 		lambda = state[L1](0); | ||||
| 
 | ||||
| 		/** create the linear factor
 | ||||
| 		 * ||h(x)-z||^2 => ||Ax-b||^2 | ||||
| 		 *  where: | ||||
| 		 *		h(x) simply returns the inputs | ||||
| 		 *		z    zeros(2) | ||||
| 		 *		A 	 identity | ||||
| 		 *		b	 linearization point | ||||
| 		 */ | ||||
| 		Matrix A = eye(2); | ||||
| 		Vector b = Vector_(2, x, y); | ||||
| 		GaussianFactor::shared_ptr f1( | ||||
| 						new GaussianFactor(x1, sub(A, 0,2, 0,1), // A(:,1)
 | ||||
| 										   y1, sub(A, 0,2, 1,2), // A(:,2)
 | ||||
| 										   b,                     // rhs of f(x)
 | ||||
| 										   probModel2));          // arbitrary sigma
 | ||||
| 
 | ||||
| 		/** create the constraint-linear factor
 | ||||
| 		 * Provides a mechanism to use variable gain to force the constraint | ||||
| 		 * \lambda*gradG*dx + d\lambda = zero | ||||
| 		 * formulated in matrix form as: | ||||
| 		 * [\lambda*gradG eye(1)] [dx; d\lambda] = zero | ||||
| 		 */ | ||||
| 		Matrix gradG = Matrix_(1, 2,2*x, -1.0); | ||||
| 		GaussianFactor::shared_ptr f2( | ||||
| 				new GaussianFactor(x1, lambda*sub(gradG, 0,1, 0,1), // scaled gradG(:,1)
 | ||||
| 								   y1, lambda*sub(gradG, 0,1, 1,2), // scaled gradG(:,2)
 | ||||
| 								   L1, eye(1),                      // dlambda term
 | ||||
| 								   Vector_(1, 0.0),                  // rhs is zero
 | ||||
| 								   probModel1));                     // arbitrary sigma
 | ||||
| 
 | ||||
| 		// create the actual constraint
 | ||||
| 		// [gradG] [x; y] - g = 0
 | ||||
| 		Vector g = Vector_(1,x*x-y-5); | ||||
| 		GaussianFactor::shared_ptr c1( | ||||
| 				new GaussianFactor(x1, sub(gradG, 0,1, 0,1),   // slice first part of gradG
 | ||||
| 								   y1, sub(gradG, 0,1, 1,2),   // slice second part of gradG
 | ||||
| 								   g,                           // value of constraint function
 | ||||
| 								   constraintModel1));          // force to constraint
 | ||||
| 
 | ||||
| 		// construct graph
 | ||||
| 		GaussianFactorGraph fg; | ||||
| 		fg.push_back(f1); | ||||
| 		fg.push_back(f2); | ||||
| 		fg.push_back(c1); | ||||
| 		if (verbose) fg.print("Graph"); | ||||
| 
 | ||||
| 		// solve
 | ||||
| 		Ordering ord; | ||||
| 		ord += x1, y1, L1; | ||||
| 		VectorConfig delta = fg.optimize(ord); | ||||
| 		if (verbose) delta.print("Delta"); | ||||
| 
 | ||||
| 		// update initial estimate
 | ||||
| 		VectorConfig newState = expmap(state, delta.scale(-1.0)); | ||||
| 
 | ||||
| 		// set the state to the updated state
 | ||||
| 		state = newState; | ||||
| 
 | ||||
| 		if (verbose) state.print("Updated State"); | ||||
| 	} | ||||
| 
 | ||||
| 	// verify that it converges to the nearest optimal point
 | ||||
| 	VectorConfig expected; | ||||
| 	expected.insert(x1, Vector_(1, 2.12)); | ||||
| 	expected.insert(y1, Vector_(1, -0.5)); | ||||
| 	CHECK(assert_equal(state[x1], expected[x1], 1e-2)); | ||||
| 	CHECK(assert_equal(state[y1], expected[y1], 1e-2)); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | ||||
| /* ************************************************************************* */ | ||||
		Loading…
	
		Reference in New Issue