class_docstr: BatchHardSoftMarginTripletLoss takes a batch with (label, sentence) pairs and computes the loss for all possible, valid
  triplets, i.e., anchor and positive must have the same label, anchor and negative a different label. The labels
  must be integers, with same label indicating sentences from the same class. You train dataset
  must contain at least 2 examples per label class. The margin is computed automatically.
  
  Source: https://github.com/NegatioN/OnlineMiningTripletLoss/blob/master/online_triplet_loss/losses.py
  Paper: In Defense of the Triplet Loss for Person Re-Identification, https://arxiv.org/abs/1703.07737
  Blog post: https://omoindrot.github.io/triplet-loss
  
  :param model: SentenceTransformer model
  :param distance_metric: Function that returns a distance between two emeddings. The class SiameseDistanceMetric contains pre-defined metrices that can be used
  
  
  Example::
  
     from sentence_transformers import SentenceTransformer,  SentencesDataset, LoggingHandler, losses
     from sentence_transformers.readers import InputExample
  
     model = SentenceTransformer('distilbert-base-nli-mean-tokens')
     train_examples = [InputExample(texts=['Sentence from class 0'], label=0), InputExample(texts=['Another sentence from class 0'], label=0),
         InputExample(texts=['Sentence from class 1'], label=1), InputExample(texts=['Sentence from class 2'], label=2)]
     train_dataset = SentencesDataset(train_examples, model)
     train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=train_batch_size)
     train_loss = losses.BatchHardSoftMarginTripletLoss(model=model)
code: def forward(
      self,
      sentence_features: Iterable[Dict[str, Tensor]],
      labels: Tensor,
  ):
      rep = self.sentence_embedder(sentence_features[0])[
          "sentence_embedding"
      ]
      return self.batch_hard_triplet_soft_margin_loss(labels, rep)
  
file_path: sentence-transformers/sentence_transformers/losses/BatchHardSoftMarginTripletLoss.py
imports: import torch
  from torch import Tensor
  from typing import Iterable, Dict
  from .BatchHardTripletLoss import BatchHardTripletLoss, BatchHardTripletLossDistanceFunction
  from sentence_transformers.SentenceTransformer import SentenceTransformer
label_desc: Use image node_id 2 for calling the BatchHardSoftMarginTripletLoss obj's underlying member method code with example usage: obj.forward(sentence_features, labels) and returns: self