Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

HybridValues

Open In Colab

HybridValues is a container class in GTSAM designed to hold results from hybrid inference. It stores three types of variable assignments simultaneously:

  1. Continuous VectorValues: Stores vector-valued assignments for continuous variables, typically used with Gaussian factors/conditionals (gtsam.GaussianFactor, gtsam.GaussianConditional). Keys are often denoted with V(index).

  2. Discrete DiscreteValues: Stores assignments (unsigned integers) for discrete variables (gtsam.DiscreteKey, gtsam.DiscreteFactor). Keys are often denoted with D(index).

  3. Nonlinear Values: Stores assignments for variables living on manifolds, used with nonlinear factors (gtsam.NonlinearFactor). Keys are often denoted with M(index) (or other symbols like X if more generic).

It provides a unified way to represent the complete state (or solution) in a hybrid system.

Initialization

Empty HybridValues:
HybridValues: 
  Continuous: 0 elements
  Discrete: 
  Nonlinear
Values with 0 values:

HybridValues from VectorValues and DiscreteValues:
HybridValues: 
  Continuous: 2 elements
  v0: 1 2
  v1: 3
  Discrete: (d0, 1)(d1, 0)
  Nonlinear
Values with 0 values:

HybridValues from all three types:
HybridValues: 
  Continuous: 2 elements
  v0: 1 2
  v1: 3
  Discrete: (d0, 1)(d1, 0)
  Nonlinear
Values with 1 values:
Value m5: (gtsam::Pose2)
(1, 2, 0.3)

Accessing Values

Methods are provided to access the underlying containers and check for key existence.


Accessed Continuous Values size: 2
Accessed Continuous Values:: 2 elements
  v0: 1 2
  v1: 3
Accessed Discrete Values size: 2
Accessed Nonlinear Values size: 1
Accessed Nonlinear Values:
Values with 1 values:
Value m5: (gtsam::Pose2)
(1, 2, 0.3)
Accessed Discrete Values:: (d0, 1)

Exists Vector V(0)? True
Exists Discrete D(1)? True
Exists Nonlinear M(5)? True
Exists Vector D(0)? False
Exists V(0) (any type)? True
Exists D(0) (any type)? True
Exists M(5) (any type)? True

Value at V(0): [1. 2.]
Value at D(0) (via atDiscrete): 1
Value at D(0) (via discrete() dict access): 1
Value at M(5): (1, 2, 0.3)

(d1, 0)

Modifying Values (Insert, Update, Retract)

Values can be inserted individually or from other containers. update modifies existing keys if they exist, while insert typically adds new keys (or might error/overwrite for some specific insert methods if key already exists). insert_or_assign will update if the key exists, or insert if it’s new. retract applies a delta primarily to the nonlinearValues_ part.

After individual inserts:
HybridValues: 
  Continuous: 1 elements
  v10: 1 2
  Discrete: (d10, 1)
  Nonlinear
Values with 1 values:
Value m11: (gtsam::Pose2)
(0.1, 0.2, 0.03)


After container inserts:
HybridValues: 
  Continuous: 2 elements
  v10: 1 2
  v12: 5
  Discrete: (d10, 1)(d11, 0)
  Nonlinear
Values with 2 values:
Value m11: (gtsam::Pose2)
(0.1, 0.2, 0.03)

Value m15: (gtsam::Pose2)
(1, 1, 0)


After update:
HybridValues: 
  Continuous: 2 elements
  v10: 99 98
  v12: 5
  Discrete: (d10, 2)(d11, 0)
  Nonlinear
Values with 2 values:
Value m11: (gtsam::Pose2)
(0.5, 0.6, 0.07)

Value m15: (gtsam::Pose2)
(1, 1, 0)


After retract (M(11) should change, V(10) should not):
HybridValues: 
  Continuous: 2 elements
  v10: 99 98
  v12: 5
  Discrete: (d10, 2)(d11, 0)
  Nonlinear
Values with 2 values:
Value m11: (gtsam::Pose2)
(0.553375, 0.55362, 0.08)

Value m15: (gtsam::Pose2)
(1, 1, 0)


After insert_or_assign (for V and D keys):
HybridValues: 
  Continuous: 3 elements
  v10: 100 101
  v12: 5
  v13: 13
  Discrete: (d10, 2)(d11, 0)(d12, 1)
  Nonlinear
Values with 2 values:
Value m11: (gtsam::Pose2)
(0.5, 0.6, 0.07)

Value m15: (gtsam::Pose2)
(1, 1, 0)