DlamchWrapper.java
package org.mklab.sdpj.gpack.lapackwrap;
import java.util.HashMap;
import java.util.Map;
import org.mklab.mpf.ap.MPFloat;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.DoubleComplexMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.DoubleComplexNumber;
import org.mklab.nfc.scalar.DoubleNumber;
import org.mklab.nfc.scalar.RealNumericalScalar;
/**
* 多倍長だと時間がかかりすぎるのでとりあえず定数を利用します。 とりあえずはDoubleNumberの値を利用します。
*
* @param <RS> type of real scalar
* @param <RM> type of real matrix
* @param <CS> type of complex scalar
* @param <CM> type of complex Matrix
* @author takafumi
*/
public class DlamchWrapper<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 Map<String, Map<String, RS>> constantsForEachClass = new HashMap<>();
/**
* 定数を返します。
*
* @param constantName 定数の名前
* @param unit RS
* @return 定数の値
*/
public RS execute(String constantName, RS unit) {
//final RS unit = Tools.getUnitNumber();
final String precision = unit instanceof MPFloat ? "" + ((MPFloat)unit).getPrecisionDigits() : ""; //$NON-NLS-1$ //$NON-NLS-2$
final String unitClassName = unit.getClass().getName() + precision;
Map<String, RS> values = this.constantsForEachClass.get(unitClassName);
if (values == null) {
values = new HashMap<>();
this.constantsForEachClass.put(unitClassName, values);
}
RS value = values.get(constantName);
if (value == null) {
//RS target = Tools.getUnitNumber();
//Tools.setUnitNumber(new DoubleNumber(1));
//value = unit.valueOf(new Dlamch<RS,RM,CS,CM>().execute(constantName, unit).toString());
DoubleNumber doubleUnit = new DoubleNumber(1);
DoubleNumber doubleValue = new Dlamch<DoubleNumber,DoubleMatrix,DoubleComplexNumber,DoubleComplexMatrix>().execute(constantName, doubleUnit);
value = unit.valueOf(doubleValue.toString());
//Tools.setUnitNumber(target);
values.put(constantName, value);
}
return value;
}
}