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