chromium/third_party/coremltools/mlmodel/format/SVM.proto

// Copyright (c) 2017, Apple Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-3-clause license that can be
// found in LICENSE.txt or at https://opensource.org/licenses/BSD-3-Clause

syntax = "proto3";
option optimize_for = LITE_RUNTIME;

import public "DataStructures.proto";

package CoreML.Specification;

// Kernel Definitions
// ------------------

/*
 * A linear kernel.
 *
 * This function has the following formula:
 *
 * .. math::
 *     K(\boldsymbol{x}, \boldsymbol{x'}) = \boldsymbol{x}^T \boldsymbol{x'}
 */
message LinearKernel {}

/*
 * A Gaussian radial basis function (RBF) kernel.
 *
 * This function has the following formula:
 *
 * .. math::
 *     K(\boldsymbol{x}, \boldsymbol{x'}) = \
 *          \exp(-\gamma || \boldsymbol{x} - \boldsymbol{x'} ||^2 )
 *
 */
message RBFKernel {
  double gamma = 1;
}

/*
 * A polynomial kernel.
 *
 * This function has the following formula:
 *
 * .. math::
 *     K(\boldsymbol{x}, \boldsymbol{x'}) = \
 *           (\gamma \boldsymbol{x}^T \boldsymbol{x'} + c)^{degree}
 */
message PolyKernel {
  int32 degree = 1;
  double c = 2;
  double gamma = 3;
}

/*
 * A sigmoid kernel.
 *
 * This function has the following formula:
 *
 * .. math::
 *     K(\boldsymbol{x}, \boldsymbol{x'}) = \
 *           \tanh(\gamma \boldsymbol{x}^T \boldsymbol{x'} + c)
 */
message SigmoidKernel {
  double gamma = 1;
  double c = 2;
}

/*
 * A kernel.
 */
message Kernel {
  oneof kernel {
    LinearKernel linearKernel = 1;
    RBFKernel rbfKernel = 2;
    PolyKernel polyKernel = 3;
    SigmoidKernel sigmoidKernel = 4;
  }
}

// Support Vector Definitions
// --------------------------

/*
 * A sparse node.
 */
message SparseNode {
  int32 index = 1;  // 1-based indexes, like libsvm
  double value = 2;
}

/*
 * A sparse vector.
 */
message SparseVector {
  repeated SparseNode nodes = 1;
}

/*
 * One or more sparse support vectors.
 */
message SparseSupportVectors {
  repeated SparseVector vectors = 1;
}

/*
 * A dense vector.
 */
message DenseVector {
  repeated double values = 1;
}

/*
 * One or more dense support vectors.
 */
message DenseSupportVectors {
  repeated DenseVector vectors = 1;
}

/*
 * One or more coefficients.
 */
message Coefficients {
  repeated double alpha = 1;
}

/*
 * A support vector regressor.
 */
message SupportVectorRegressor {
  Kernel kernel = 1;

  // Support vectors, either sparse or dense format
  oneof supportVectors {
    SparseSupportVectors sparseSupportVectors = 2;
    DenseSupportVectors denseSupportVectors = 3;
  }

  // Coefficients, one for each support vector
  Coefficients coefficients = 4;

  double rho = 5;
}

/*
 * A support vector classifier
 */
message SupportVectorClassifier {
  Kernel kernel = 1;

  /*
   * The number of support vectors for each class.
   */
  repeated int32 numberOfSupportVectorsPerClass = 2;

  /*
   * The support vectors, in either sparse or dense format.
   */
  oneof supportVectors {
    SparseSupportVectors sparseSupportVectors = 3;
    DenseSupportVectors denseSupportVectors = 4;
  }

  /*
   * The coefficients, essentially a two dimensional array of
   * size: (numberOfClasses-1) by (total number of support vectors)
   */
  repeated Coefficients coefficients = 5;

  /*
   * Constants for decision function,
   * with K*(K-1) / 2 elements,
   * where K is the number of classes.
   */
  repeated double rho = 6;

  /*
   * Pairwise probability information for A vs B classifier.
   * Total of K*(K-1)/2 elements where K is the number of classes.
   * These fields are optional,
   * and only required if you want probabilities or multi class predictions.
   */
  repeated double probA = 7;
  repeated double probB = 8;

  /*
   * Class label mapping.
   */
  oneof ClassLabels {
    StringVector stringClassLabels = 100;
    Int64Vector int64ClassLabels = 101;
  }
}