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;
}
}