public double[][] getTransiton(int segmentId, int sngSerialId, String startTime, String endTime) {
   if (!isSetTrans) {
     setPara();
     ArrayList<Integer> array = getIc(segmentId, sngSerialId, startTime, endTime);
     toTransTensor(array, order);
     Matrix.transpose(transition, stateSpace);
     isSetTrans = true;
   }
   return transition;
 }
  @Override
  public void toTransTensor(ArrayList<Integer> array, int order) {
    // TODO Auto-generated method stub
    transition = new double[stateSpace][stateSpace];
    while (order > 0) {
      double[] sum = new double[stateSpace];
      double[][] transitionN = new double[stateSpace][stateSpace];
      for (int i = 0; i < array.size() - order; i++) {
        if (array.get(i) / mode >= stateSpace && array.get(i + order) / mode >= stateSpace) {

          sum[stateSpace - 1] += 1;
          transitionN[stateSpace - 1][stateSpace - 1] += 1;
        } else if (array.get(i) / mode >= stateSpace) {
          sum[stateSpace - 1] += 1;
          transitionN[stateSpace - 1][array.get(i + order)] += 1;
        } else if (array.get(i + order) / mode >= stateSpace) {
          sum[array.get(i) / mode] += 1;
          transitionN[array.get(i) / mode][stateSpace - 1] += 1;
        } else {
          sum[array.get(i) / mode] += 1;
          transitionN[array.get(i) / mode][array.get(i + order) / mode] += 1;
        }
      }
      for (int i = 0; i < stateSpace; i++) {
        for (int j = 0; j < stateSpace; j++) {
          if (sum[i] > 0) transitionN[i][j] /= sum[i];
          // else transition[i][i] =1;
          else {
            transition[i][i] = 1.0 / stateSpace;
            // transitionN[i][i] = 0.0;
          }
        }
      }
      Matrix.add(transition, transitionN, stateSpace, para[order - 1]);
      order--;
    }
  }