AverageComplementarity.java

package org.mklab.sdpj.algorithm;

import java.io.PrintStream;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.sdpj.algebra.AlgebraWithEFFloat;
import org.mklab.sdpj.tool.Tools;


/**
 * @author takafumi
   * @param <RS> type of real scalar
   * @param <RM> type of real matrix
   * @param <CS> type of complex scalar
   * @param <CM> type of complex Matrix
 */
public class AverageComplementarity<RS extends RealNumericalScalar<RS, RM, CS, CM>, RM extends RealNumericalMatrix<RS, RM, CS, CM>, CS extends ComplexNumericalScalar<RS, RM, CS, CM>, CM extends ComplexNumericalMatrix<RS, RM, CS, CM>> {

  /** 初期値 */
  private RS initialValue;
  /** 現在の値 */
  private RS value;

  /**
   * 新しく生成された<code>AverageComplementarity</code>オブジェクトを初期化します。
   * 
   * @param lambdaStar .
   */
  public AverageComplementarity(RS lambdaStar) {
    this.initialValue = lambdaStar.multiply(lambdaStar);
    this.value = this.initialValue;
  }

  /**
   * @param nDim ,
   * @param initPt .
   */
  public AverageComplementarity(int nDim, Solution<RS,RM,CS,CM> initPt) {
//    this.initialValue = Algebra.run(initPt.getXmat(), '.', initPt.getZmat());
    this.initialValue = AlgebraWithEFFloat.run(initPt.getXmat(), '.', initPt.getZmat());
    this.initialValue = this.initialValue.divide(nDim);// /= nDim;
    this.value = this.initialValue;
  }

  /**
   * @param nDim ,
   * @param currentPt .
   */
  public void update(int nDim, Solution<RS,RM,CS,CM> currentPt) {
//    RS xy = Algebra.run(currentPt.getXmat(), '.', currentPt.getZmat());
    RS xy = AlgebraWithEFFloat.run(currentPt.getXmat(), '.', currentPt.getZmat());
    RS mu = xy.divide(nDim);
    this.value = mu;// /= nDim;
  }

  /**
   * @param ps .
   */
  public void display(PrintStream ps) {
    ps.println(toString());
  }

  /**
   * 
   */
  public void display() {
    Tools.message(this.toString());
  }

  /**
   * @see java.lang.Object#toString()
   */
  @Override
  public String toString() {
    return "mu0 = " + this.initialValue + "\nmu  = " + this.value + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }

  /**
   * @return initialを返します。
   */
  public RS getInitialValue() {
    return this.initialValue;
  }

  /**
   * @return valueを返します。
   */
  public RS getValue() {
    return this.value;
  }
}