コード例 #1
0
ファイル: SOTA.java プロジェクト: SamGG/mev-tm4
  // Note that leaves are threaded from left to right.
  // This means that if displayed top to bottom, centroids would be reversed
  // Therefore, accumulate in reverse order into AlgorithmData
  private void getResults() {

    SOTACell curr = head;
    int numCells = 0;
    FloatMatrix centroidFM = new FloatMatrix(numberOfClusters, numberOfSamples);
    FloatMatrix varianceFM = new FloatMatrix(numberOfClusters, numberOfSamples);

    int[] clusterSize = new int[numberOfClusters];
    FloatMatrix clusterDiversity = new FloatMatrix(numberOfClusters, 1);
    int numDiv = cycleDiversity.size();
    FloatMatrix cycleDivFM = new FloatMatrix(numDiv, 1);

    int[] clusterOrder = new int[numberOfClusters];

    clusters = new Cluster();
    NodeList nodeList = clusters.getNodeList();
    Node newNode;
    int[] clusterMembership;
    int clusterPop;

    // move to tail
    while (curr.succ != null) curr = curr.succ;

    // now curr is at the tail
    while (numCells <= numberOfClusters && curr != null) {

      for (int i = 0; i < numberOfSamples; i++) {
        centroidFM.set(numCells, i, curr.centroidGene.get(0, i));
        varianceFM.set(numCells, i, curr.getColumnVar(i));
      }
      clusterPop = curr.members.size();
      clusterSize[numCells] = clusterPop;
      clusterDiversity.set(
          numCells,
          0,
          (float) curr.cellDiversity
              * (float) myFactor); // alter poloarity by myFactor based on metric
      clusterOrder[numCells] = numCells;

      // accumulate cluster probe indicies
      clusterMembership = new int[clusterPop];
      for (int i = 0; i < clusterPop; i++) {
        clusterMembership[i] = ((Integer) (curr.members.elementAt(i))).intValue();
      }

      newNode = new Node();
      newNode.setProbesIndexes(clusterMembership);
      nodeList.addNode(newNode);

      numCells++;
      curr = curr.pred;
    }

    // now accumlate cycle divresity information
    if (myFactor == 1) {
      float initDiv = ((Float) (cycleDiversity.elementAt(0))).floatValue();
      for (int i = 0; i < numDiv; i++) {
        cycleDivFM.set(i, 0, (((Float) (cycleDiversity.elementAt(i))).floatValue()) / initDiv);
      }
    } else {
      float lowerLim = numberOfGenes * myFactor;
      float initDiv = ((Float) (cycleDiversity.elementAt(0))).floatValue() + Math.abs(lowerLim);
      for (int i = 0; i < numDiv; i++) {
        cycleDivFM.set(
            i,
            0,
            (((Float) (cycleDiversity.elementAt(i))).floatValue() + Math.abs(lowerLim)) / initDiv);
      }
    }
    // put all important information into AlgorithmData
    inData.addParam("cycles", String.valueOf(numberOfClusters));
    inData.addCluster("cluster", clusters);
    inData.addMatrix("centroid-matrix", centroidFM);
    inData.addMatrix("cluster-variances", varianceFM);
    inData.addMatrix("cluster-diversity", clusterDiversity);
    inData.addMatrix("cycle-diversity", cycleDivFM);
    inData.addIntArray("cluster-population", clusterSize);

    // Additions to AlgorithmData to allow drawing arrays
    float[] nodeHeight = new float[numberOfClusters * 2];
    int[] nodePopulation = new int[numberOfClusters * 2];
    int[] leftChild = new int[nodeHeight.length * 2];
    int[] rightChild = new int[nodeHeight.length * 2];

    initializeReturnValues(nodeHeight, nodePopulation, leftChild, rightChild);
    utilCounter = 0;
    loadReturnValues(root, 0, nodeHeight, nodePopulation, leftChild, rightChild);
    inData.addMatrix("node-heights", new FloatMatrix(nodeHeight, nodeHeight.length));
    inData.addIntArray("left-child", leftChild);
    inData.addIntArray("right-child", rightChild);
    inData.addIntArray("node-population", nodePopulation);

    if (useClusterVariance) inData.addParam("computed-var-cutoff", String.valueOf(endCriteria));
    return;
  }