docs: public void learnApplyTransforms(DataSet dataSet)
      {
          learnedTransforms.clear();
          //used to keep track if we can start using in place transforms
          boolean vecSafe = false;
          boolean catSafe = false;
          int iter = 0;
          
          //copy original references so we can check saftey of inplace mutation later
          Vec[] origVecs = new Vec[dataSet.size()];
          int[][] origCats = new int[dataSet.size()][];
          for (int i = 0; i < origVecs.length; i++)
          {
              DataPoint dp = dataSet.getDataPoint(i);
              origVecs[i] = dp.getNumericalValues();
              origCats[i] = dp.getCategoricalValues();
          }
  
          for (DataTransform dtf : transformSource)
          {
              DataTransform transform = dtf.clone();
              transform.fit(dataSet);
              if(transform instanceof InPlaceTransform)
              {
                  InPlaceTransform ipt = (InPlaceTransform) transform;
                  //check if it is safe to apply mutations
                  if(iter > 0 && !vecSafe || (ipt.mutatesNominal() && !catSafe))
                  {
                      boolean vecClear = true, catClear = true;
                      for (int i = 0; i < origVecs.length && (vecClear || catClear); i++)
                      {
                          DataPoint dp = dataSet.getDataPoint(i);
                          vecClear = origVecs[i] != dp.getNumericalValues();
                          catClear = origCats[i] != dp.getCategoricalValues();
                      }
                      
                      vecSafe = vecClear;
                      catSafe = catClear;
                  }
                  
                  //Now we know if we can apply the mutations or not
                  if(vecSafe && (!ipt.mutatesNominal() || catSafe))
                      dataSet.applyTransformMutate(ipt, true);
                  else//go back to normal
                      dataSet.applyTransform(transform);
              }
              else
                  dataSet.applyTransform(transform);
              
              learnedTransforms.add(transform);
              iter++;
          }
          consolidateTransforms();
      }