<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_branch_node(self, tree_id, node_id, feature_index, feature_value, branch_mode, true_child_id, false_child_id, relative_hit_rate = None, missing_value_tracks_true_child = False):
 """ Add a branch node to the tree ensemble. Parameters tree_id: int ID of the tree to add the node to. node_id: int ID of the node within the tree. feature_index: int Index of the feature in the input being split on. feature_value: double or int The value used in the feature comparison determining the traversal direction from this node. branch_mode: str Branch mode of the node, specifying the condition under which the node referenced by `true_child_id` is called next. Must be one of the following: - `"BranchOnValueLessThanEqual"`. Traverse to node `true_child_id` if `input[feature_index] <= feature_value`, and `false_child_id` otherwise. - `"BranchOnValueLessThan"`. Traverse to node `true_child_id` if `input[feature_index] < feature_value`, and `false_child_id` otherwise. - `"BranchOnValueGreaterThanEqual"`. Traverse to node `true_child_id` if `input[feature_index] >= feature_value`, and `false_child_id` otherwise. - `"BranchOnValueGreaterThan"`. Traverse to node `true_child_id` if `input[feature_index] > feature_value`, and `false_child_id` otherwise. - `"BranchOnValueEqual"`. Traverse to node `true_child_id` if `input[feature_index] == feature_value`, and `false_child_id` otherwise. - `"BranchOnValueNotEqual"`. Traverse to node `true_child_id` if `input[feature_index] != feature_value`, and `false_child_id` otherwise. true_child_id: int ID of the child under the true condition of the split. An error will be raised at model validation if this does not match the `node_id` of a node instantiated by `add_branch_node` or `add_leaf_node` within this `tree_id`. false_child_id: int ID of the child under the false condition of the split. An error will be raised at model validation if this does not match the `node_id` of a node instantiated by `add_branch_node` or `add_leaf_node` within this `tree_id`. relative_hit_rate: float [optional] When the model is converted compiled by CoreML, this gives hints to Core ML about which node is more likely to be hit on evaluation, allowing for additional optimizations. The values can be on any scale, with the values between child nodes being compared relative to each other. missing_value_tracks_true_child: bool [optional] If the training data contains NaN values or missing values, then this flag determines which direction a NaN value traverses. """

        spec_node = self.tree_parameters.nodes.add()
        spec_node.treeId = tree_id
        spec_node.nodeId = node_id
        spec_node.branchFeatureIndex = feature_index
        spec_node.branchFeatureValue = feature_value
        spec_node.trueChildNodeId = true_child_id
        spec_node.falseChildNodeId = false_child_id
        spec_node.nodeBehavior = \
           _TreeEnsemble_pb2.TreeEnsembleParameters.TreeNode.TreeNodeBehavior.Value(branch_mode)

        if relative_hit_rate is not None:
            spec_node.relativeHitRate = relative_hit_rate
        spec_node.missingValueTracksTrueChild = missing_value_tracks_true_child