public class com.android.internal.graphics.palette.VariationalKMeansQuantizer implements com.android.internal.graphics.palette.Quantizer
  minor version: 0
  major version: 59
  flags: flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: com.android.internal.graphics.palette.VariationalKMeansQuantizer
  super_class: java.lang.Object
{
  private static final java.lang.String TAG;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "KMeansQuantizer"

  private static final boolean DEBUG;
    descriptor: Z
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 0

  private final float mMinClusterSqDistance;
    descriptor: F
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final int mInitializations;
    descriptor: I
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final com.android.internal.ml.clustering.KMeans mKMeans;
    descriptor: Lcom/android/internal/ml/clustering/KMeans;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private java.util.List<com.android.internal.graphics.palette.Palette$Swatch> mQuantizedColors;
    descriptor: Ljava/util/List;
    flags: (0x0002) ACC_PRIVATE
    Signature: Ljava/util/List<Lcom/android/internal/graphics/palette/Palette$Swatch;>;

  public void <init>();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
        start local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
         0: .line 56
            aload 0 /* this */
            ldc 0.25
            invokespecial com.android.internal.graphics.palette.VariationalKMeansQuantizer.<init>:(F)V
         1: .line 57
            return
        end local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lcom/android/internal/graphics/palette/VariationalKMeansQuantizer;

  public void <init>(float);
    descriptor: (F)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=3, locals=2, args_size=2
        start local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
        start local 1 // float minClusterDistance
         0: .line 60
            aload 0 /* this */
            fload 1 /* minClusterDistance */
            iconst_1
            invokespecial com.android.internal.graphics.palette.VariationalKMeansQuantizer.<init>:(FI)V
         1: .line 61
            return
        end local 1 // float minClusterDistance
        end local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
      LocalVariableTable:
        Start  End  Slot                Name  Signature
            0    2     0                this  Lcom/android/internal/graphics/palette/VariationalKMeansQuantizer;
            0    2     1  minClusterDistance  F
    MethodParameters:
                    Name  Flags
      minClusterDistance  

  public void <init>(float, int);
    descriptor: (FI)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=7, locals=3, args_size=3
        start local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
        start local 1 // float minClusterDistance
        start local 2 // int initializations
         0: .line 63
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
         1: .line 51
            aload 0 /* this */
            new com.android.internal.ml.clustering.KMeans
            dup
            new java.util.Random
            dup
            lconst_0
            invokespecial java.util.Random.<init>:(J)V
            bipush 30
            fconst_0
            invokespecial com.android.internal.ml.clustering.KMeans.<init>:(Ljava/util/Random;IF)V
            putfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mKMeans:Lcom/android/internal/ml/clustering/KMeans;
         2: .line 64
            aload 0 /* this */
            fload 1 /* minClusterDistance */
            fload 1 /* minClusterDistance */
            fmul
            putfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mMinClusterSqDistance:F
         3: .line 65
            aload 0 /* this */
            iload 2 /* initializations */
            putfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mInitializations:I
         4: .line 66
            return
        end local 2 // int initializations
        end local 1 // float minClusterDistance
        end local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
      LocalVariableTable:
        Start  End  Slot                Name  Signature
            0    5     0                this  Lcom/android/internal/graphics/palette/VariationalKMeansQuantizer;
            0    5     1  minClusterDistance  F
            0    5     2     initializations  I
    MethodParameters:
                    Name  Flags
      minClusterDistance  
      initializations     

  public void quantize(int[], int, com.android.internal.graphics.palette.Palette$Filter[]);
    descriptor: ([II[Lcom/android/internal/graphics/palette/Palette$Filter;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=8, locals=15, args_size=4
        start local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
        start local 1 // int[] pixels
        start local 2 // int maxColors
        start local 3 // com.android.internal.graphics.palette.Palette$Filter[] filters
         0: .line 79
            iconst_3
            newarray 6
            dup
            iconst_0
            fconst_0
            fastore
            dup
            iconst_1
            fconst_0
            fastore
            dup
            iconst_2
            fconst_0
            fastore
            astore 4 /* hsl */
        start local 4 // float[] hsl
         1: .line 80
            aload 1 /* pixels */
            arraylength
            iconst_3
            multianewarray [[F 2
            astore 5 /* hslPixels */
        start local 5 // float[][] hslPixels
         2: .line 81
            iconst_0
            istore 6 /* i */
        start local 6 // int i
         3: goto 9
         4: .line 82
      StackMap locals: float[] float[][] int
      StackMap stack:
            aload 1 /* pixels */
            iload 6 /* i */
            iaload
            aload 4 /* hsl */
            invokestatic com.android.internal.graphics.ColorUtils.colorToHSL:(I[F)V
         5: .line 84
            aload 5 /* hslPixels */
            iload 6 /* i */
            aaload
            iconst_0
            aload 4 /* hsl */
            iconst_0
            faload
            ldc 360.0
            fdiv
            fastore
         6: .line 85
            aload 5 /* hslPixels */
            iload 6 /* i */
            aaload
            iconst_1
            aload 4 /* hsl */
            iconst_1
            faload
            fastore
         7: .line 86
            aload 5 /* hslPixels */
            iload 6 /* i */
            aaload
            iconst_2
            aload 4 /* hsl */
            iconst_2
            faload
            fastore
         8: .line 81
            iinc 6 /* i */ 1
      StackMap locals:
      StackMap stack:
         9: iload 6 /* i */
            aload 1 /* pixels */
            arraylength
            if_icmplt 4
        end local 6 // int i
        10: .line 89
            aload 0 /* this */
            iload 2 /* maxColors */
            aload 5 /* hslPixels */
            invokevirtual com.android.internal.graphics.palette.VariationalKMeansQuantizer.getOptimalKMeans:(I[[F)Ljava/util/List;
            astore 6 /* optimalMeans */
        start local 6 // java.util.List optimalMeans
        11: .line 93
            iconst_0
            istore 7 /* i */
        start local 7 // int i
        12: goto 32
        13: .line 94
      StackMap locals: com.android.internal.graphics.palette.VariationalKMeansQuantizer int[] int com.android.internal.graphics.palette.Palette$Filter[] float[] float[][] java.util.List int
      StackMap stack:
            aload 6 /* optimalMeans */
            iload 7 /* i */
            invokeinterface java.util.List.get:(I)Ljava/lang/Object;
            checkcast com.android.internal.ml.clustering.KMeans$Mean
            astore 8 /* current */
        start local 8 // com.android.internal.ml.clustering.KMeans$Mean current
        14: .line 95
            aload 8 /* current */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getCentroid:()[F
            astore 9 /* currentCentroid */
        start local 9 // float[] currentCentroid
        15: .line 96
            iload 7 /* i */
            iconst_1
            iadd
            istore 10 /* j */
        start local 10 // int j
        16: goto 30
        17: .line 97
      StackMap locals: com.android.internal.ml.clustering.KMeans$Mean float[] int
      StackMap stack:
            aload 6 /* optimalMeans */
            iload 10 /* j */
            invokeinterface java.util.List.get:(I)Ljava/lang/Object;
            checkcast com.android.internal.ml.clustering.KMeans$Mean
            astore 11 /* compareTo */
        start local 11 // com.android.internal.ml.clustering.KMeans$Mean compareTo
        18: .line 98
            aload 11 /* compareTo */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getCentroid:()[F
            astore 12 /* compareToCentroid */
        start local 12 // float[] compareToCentroid
        19: .line 99
            aload 9 /* currentCentroid */
            aload 12 /* compareToCentroid */
            invokestatic com.android.internal.ml.clustering.KMeans.sqDistance:([F[F)F
            fstore 13 /* sqDistance */
        start local 13 // float sqDistance
        20: .line 101
            fload 13 /* sqDistance */
            aload 0 /* this */
            getfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mMinClusterSqDistance:F
            fcmpg
            ifge 29
        21: .line 102
            aload 6 /* optimalMeans */
            aload 11 /* compareTo */
            invokeinterface java.util.List.remove:(Ljava/lang/Object;)Z
            pop
        22: .line 103
            aload 8 /* current */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getItems:()Ljava/util/List;
            aload 11 /* compareTo */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getItems:()Ljava/util/List;
            invokeinterface java.util.List.addAll:(Ljava/util/Collection;)Z
            pop
        23: .line 104
            iconst_0
            istore 14 /* k */
        start local 14 // int k
        24: goto 27
        25: .line 105
      StackMap locals: com.android.internal.graphics.palette.VariationalKMeansQuantizer int[] int com.android.internal.graphics.palette.Palette$Filter[] float[] float[][] java.util.List int com.android.internal.ml.clustering.KMeans$Mean float[] int com.android.internal.ml.clustering.KMeans$Mean float[] float int
      StackMap stack:
            aload 9 /* currentCentroid */
            iload 14 /* k */
            dup2
            faload
            f2d
            aload 12 /* compareToCentroid */
            iload 14 /* k */
            faload
            aload 9 /* currentCentroid */
            iload 14 /* k */
            faload
            fsub
            f2d
            ldc 2.0
            ddiv
            dadd
            d2f
            fastore
        26: .line 104
            iinc 14 /* k */ 1
      StackMap locals:
      StackMap stack:
        27: iload 14 /* k */
            aload 9 /* currentCentroid */
            arraylength
            if_icmplt 25
        end local 14 // int k
        28: .line 107
            iinc 10 /* j */ -1
        end local 13 // float sqDistance
        end local 12 // float[] compareToCentroid
        end local 11 // com.android.internal.ml.clustering.KMeans$Mean compareTo
        29: .line 96
      StackMap locals: com.android.internal.graphics.palette.VariationalKMeansQuantizer int[] int com.android.internal.graphics.palette.Palette$Filter[] float[] float[][] java.util.List int com.android.internal.ml.clustering.KMeans$Mean float[] int
      StackMap stack:
            iinc 10 /* j */ 1
      StackMap locals:
      StackMap stack:
        30: iload 10 /* j */
            aload 6 /* optimalMeans */
            invokeinterface java.util.List.size:()I
            if_icmplt 17
        end local 10 // int j
        end local 9 // float[] currentCentroid
        end local 8 // com.android.internal.ml.clustering.KMeans$Mean current
        31: .line 93
            iinc 7 /* i */ 1
      StackMap locals:
      StackMap stack:
        32: iload 7 /* i */
            aload 6 /* optimalMeans */
            invokeinterface java.util.List.size:()I
            if_icmplt 13
        end local 7 // int i
        33: .line 113
            aload 0 /* this */
            new java.util.ArrayList
            dup
            invokespecial java.util.ArrayList.<init>:()V
            putfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mQuantizedColors:Ljava/util/List;
        34: .line 114
            aload 6 /* optimalMeans */
            invokeinterface java.util.List.iterator:()Ljava/util/Iterator;
            astore 8
            goto 45
      StackMap locals: com.android.internal.graphics.palette.VariationalKMeansQuantizer int[] int com.android.internal.graphics.palette.Palette$Filter[] float[] float[][] java.util.List top java.util.Iterator
      StackMap stack:
        35: aload 8
            invokeinterface java.util.Iterator.next:()Ljava/lang/Object;
            checkcast com.android.internal.ml.clustering.KMeans$Mean
            astore 7 /* mean */
        start local 7 // com.android.internal.ml.clustering.KMeans$Mean mean
        36: .line 115
            aload 7 /* mean */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getItems:()Ljava/util/List;
            invokeinterface java.util.List.size:()I
            ifne 38
        37: .line 116
            goto 45
        38: .line 118
      StackMap locals: com.android.internal.graphics.palette.VariationalKMeansQuantizer int[] int com.android.internal.graphics.palette.Palette$Filter[] float[] float[][] java.util.List com.android.internal.ml.clustering.KMeans$Mean java.util.Iterator
      StackMap stack:
            aload 7 /* mean */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getCentroid:()[F
            astore 9 /* centroid */
        start local 9 // float[] centroid
        39: .line 119
            aload 0 /* this */
            getfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mQuantizedColors:Ljava/util/List;
            new com.android.internal.graphics.palette.Palette$Swatch
            dup
            iconst_3
            newarray 6
            dup
            iconst_0
        40: .line 120
            aload 9 /* centroid */
            iconst_0
            faload
            ldc 360.0
            fmul
            fastore
            dup
            iconst_1
        41: .line 121
            aload 9 /* centroid */
            iconst_1
            faload
            fastore
            dup
            iconst_2
        42: .line 122
            aload 9 /* centroid */
            iconst_2
            faload
            fastore
        43: .line 123
            aload 7 /* mean */
            invokevirtual com.android.internal.ml.clustering.KMeans$Mean.getItems:()Ljava/util/List;
            invokeinterface java.util.List.size:()I
            invokespecial com.android.internal.graphics.palette.Palette$Swatch.<init>:([FI)V
        44: .line 119
            invokeinterface java.util.List.add:(Ljava/lang/Object;)Z
            pop
        end local 9 // float[] centroid
        end local 7 // com.android.internal.ml.clustering.KMeans$Mean mean
        45: .line 114
      StackMap locals: com.android.internal.graphics.palette.VariationalKMeansQuantizer int[] int com.android.internal.graphics.palette.Palette$Filter[] float[] float[][] java.util.List top java.util.Iterator
      StackMap stack:
            aload 8
            invokeinterface java.util.Iterator.hasNext:()Z
            ifne 35
        46: .line 125
            return
        end local 6 // java.util.List optimalMeans
        end local 5 // float[][] hslPixels
        end local 4 // float[] hsl
        end local 3 // com.android.internal.graphics.palette.Palette$Filter[] filters
        end local 2 // int maxColors
        end local 1 // int[] pixels
        end local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
      LocalVariableTable:
        Start  End  Slot               Name  Signature
            0   47     0               this  Lcom/android/internal/graphics/palette/VariationalKMeansQuantizer;
            0   47     1             pixels  [I
            0   47     2          maxColors  I
            0   47     3            filters  [Lcom/android/internal/graphics/palette/Palette$Filter;
            1   47     4                hsl  [F
            2   47     5          hslPixels  [[F
            3   10     6                  i  I
           11   47     6       optimalMeans  Ljava/util/List<Lcom/android/internal/ml/clustering/KMeans$Mean;>;
           12   33     7                  i  I
           14   31     8            current  Lcom/android/internal/ml/clustering/KMeans$Mean;
           15   31     9    currentCentroid  [F
           16   31    10                  j  I
           18   29    11          compareTo  Lcom/android/internal/ml/clustering/KMeans$Mean;
           19   29    12  compareToCentroid  [F
           20   29    13         sqDistance  F
           24   28    14                  k  I
           36   45     7               mean  Lcom/android/internal/ml/clustering/KMeans$Mean;
           39   45     9           centroid  [F
    MethodParameters:
           Name  Flags
      pixels     
      maxColors  
      filters    

  private java.util.List<com.android.internal.ml.clustering.KMeans$Mean> getOptimalKMeans(int, float[][]);
    descriptor: (I[[F)Ljava/util/List;
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=4, locals=10, args_size=3
        start local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
        start local 1 // int k
        start local 2 // float[][] inputData
         0: .line 128
            aconst_null
            astore 3 /* optimal */
        start local 3 // java.util.List optimal
         1: .line 129
            ldc -1.7976931348623157E308
            dstore 4 /* optimalScore */
        start local 4 // double optimalScore
         2: .line 130
            aload 0 /* this */
            getfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mInitializations:I
            istore 6 /* runs */
        start local 6 // int runs
         3: .line 131
            goto 10
         4: .line 135
      StackMap locals: java.util.List double int
      StackMap stack:
            aload 0 /* this */
            getfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mKMeans:Lcom/android/internal/ml/clustering/KMeans;
            iload 1 /* k */
            aload 2 /* inputData */
            invokevirtual com.android.internal.ml.clustering.KMeans.predict:(I[[F)Ljava/util/List;
            astore 7 /* means */
        start local 7 // java.util.List means
         5: .line 136
            aload 7 /* means */
            invokestatic com.android.internal.ml.clustering.KMeans.score:(Ljava/util/List;)D
            dstore 8 /* score */
        start local 8 // double score
         6: .line 137
            aload 3 /* optimal */
            ifnull 7
            dload 8 /* score */
            dload 4 /* optimalScore */
            dcmpl
            ifle 9
         7: .line 141
      StackMap locals: java.util.List double
      StackMap stack:
            dload 8 /* score */
            dstore 4 /* optimalScore */
         8: .line 142
            aload 7 /* means */
            astore 3 /* optimal */
         9: .line 144
      StackMap locals:
      StackMap stack:
            iinc 6 /* runs */ -1
        end local 8 // double score
        end local 7 // java.util.List means
        10: .line 131
      StackMap locals:
      StackMap stack:
            iload 6 /* runs */
            ifgt 4
        11: .line 147
            aload 3 /* optimal */
            areturn
        end local 6 // int runs
        end local 4 // double optimalScore
        end local 3 // java.util.List optimal
        end local 2 // float[][] inputData
        end local 1 // int k
        end local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0   12     0          this  Lcom/android/internal/graphics/palette/VariationalKMeansQuantizer;
            0   12     1             k  I
            0   12     2     inputData  [[F
            1   12     3       optimal  Ljava/util/List<Lcom/android/internal/ml/clustering/KMeans$Mean;>;
            2   12     4  optimalScore  D
            3   12     6          runs  I
            5   10     7         means  Ljava/util/List<Lcom/android/internal/ml/clustering/KMeans$Mean;>;
            6   10     8         score  D
    Signature: (I[[F)Ljava/util/List<Lcom/android/internal/ml/clustering/KMeans$Mean;>;
    MethodParameters:
           Name  Flags
      k          
      inputData  

  public java.util.List<com.android.internal.graphics.palette.Palette$Swatch> getQuantizedColors();
    descriptor: ()Ljava/util/List;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
         0: .line 152
            aload 0 /* this */
            getfield com.android.internal.graphics.palette.VariationalKMeansQuantizer.mQuantizedColors:Ljava/util/List;
            areturn
        end local 0 // com.android.internal.graphics.palette.VariationalKMeansQuantizer this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/android/internal/graphics/palette/VariationalKMeansQuantizer;
    Signature: ()Ljava/util/List<Lcom/android/internal/graphics/palette/Palette$Swatch;>;
}
SourceFile: "VariationalKMeansQuantizer.java"
InnerClasses:
  public abstract Filter = com.android.internal.graphics.palette.Palette$Filter of com.android.internal.graphics.palette.Palette
  public final Swatch = com.android.internal.graphics.palette.Palette$Swatch of com.android.internal.graphics.palette.Palette
  public Mean = com.android.internal.ml.clustering.KMeans$Mean of com.android.internal.ml.clustering.KMeans