DirectionParameter.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.Algebra;
import org.mklab.sdpj.tool.Tools;


/**
 * @author koga
 * @version $Revision$, 2009/04/24
 * @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 DirectionParameter<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 betaStar;

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

  /**
   * @param phase ,
   * @param reduction ,
   * @param param .
   */
  public void MehrotraPredictor(Phase<RS,RM,CS,CM> phase, Switch<RS,RM,CS,CM> reduction, Parameter<RS,RM,CS,CM> param) {
    final RS unit = this.getValue().createUnit();

    if (phase.getValue() == PhaseType.pdFEAS) {
      this.betaStar = unit.createZero();
    } else {
      this.betaStar = param.betaBar;
      if (reduction.getSwitchType() == SwitchType.OFF) {
        this.betaStar = unit.create(2);
      }
    }
  }

  /**
   * @param nDim ,
   * @param phase ,
   * @param alpha ,
   * @param currentPt ,
   * @param newton ,
   * @param mu ,
   * @param param .
   */
  public void MehrotraCorrector(int nDim, Phase<RS,RM,CS,CM> phase, StepLength<RS,RM,CS,CM> alpha, Solution<RS,RM,CS,CM> currentPt, Newton<RS,RM,CS,CM> newton, AverageComplementarity<RS, RM, CS, CM> mu, Parameter<RS,RM,CS,CM> param) {
    final boolean modifiedAlgorithm = false;
    final RS unit = this.getValue().createUnit();

    RS xMatvMat = Algebra.run(currentPt.getXmat(), '.', newton.getDzMat());
    RS uMatzMat = Algebra.run(newton.getDxMat(), '.', currentPt.getZmat());
    RS uMatvMat = Algebra.run(newton.getDxMat(), '.', newton.getDzMat());
    final RS muTarget;

    if (!modifiedAlgorithm) {
      muTarget = mu.getValue().add(((alpha.getPrimal().multiply(uMatzMat)).add(alpha.getDual().multiply(xMatvMat)).add(alpha.getPrimal().multiply(alpha.getDual()).multiply(uMatvMat))).divide(nDim));

      this.betaStar = muTarget.divide(mu.getValue());
      if (this.getValue().isLessThan(1)) {
        this.betaStar = this.getValue().multiply(this.getValue());
      }
      if (phase.getValue() == PhaseType.pdFEAS) {
        if (this.getValue().isLessThan(param.betaStar)) {
          this.betaStar = param.betaStar;
        }
        if (this.getValue().isGreaterThan(1)) {
          this.betaStar = unit.createUnit();
        }
      } else {
        if (this.getValue().isLessThan(param.betaBar)) {
          this.betaStar = param.betaBar;
        }
      }

    } else {
      muTarget = mu.getValue().add(uMatzMat.add(xMatvMat).add(uMatvMat)).divide(nDim);

      this.betaStar = (muTarget.divide(mu.getValue())).power(2);

      if (this.betaStar.isLessThanOrEquals(1)) {
        if (phase.getValue() == PhaseType.pdFEAS) {
          if (this.betaStar.isLessThan(param.betaStar)) {
            this.betaStar = param.betaStar;
          }
        } else {
          if (this.getValue().isLessThan(param.betaBar)) {
            this.betaStar = param.betaBar;
          }
        }
      } else {
        this.betaStar = unit.createUnit();
      }
    }
  }

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

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

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

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