@Override
  public void setAttributeValue(Attribute attribute, Instance instance, Patient patient) {
    RegaService rs = ruleService.getRegaService();

    PatientAttributeValue pav =
        rs.getPatientAttributeValue(
            patient, ClinicalAttributeFactory.CLINICAL_REGA_ATTRIBUTE_RECENT_BLOOD_HB);

    if (pav == null) return; // The is no recent blood hb for this patient

    String strVal = pav.getValue();
    Double dVal;

    if (strVal.equals("N/A")) {
      return; // There is no value
    } else if (strVal.contains("/")) {
      dVal = Double.parseDouble(strVal.replace('/', '.'));
    } else {
      dVal = Double.parseDouble(strVal);
    }

    logger.info("Recent Blood HB for " + patient.getPatientId() + " is " + dVal);
    instance.setValue(attribute, dVal);
  }
  @Override
  public void setAttributeValue(Attribute attribute, Instance instance, Patient patient) {
    RegaService rs = ruleService.getRegaService();

    // Get a list of viral loads in reverse order
    List<TestResult> VLResults =
        rs.getListOfTestResultsSortedByDate(
            RegaService.VIRAL_LOAD_TEST_ID, patient.getPatientIi(), RegaService.SORT_ORDER_DESC);

    Date sequenceDate = rs.getFirstSequenceDate(patient);

    Date initDate = rs.getARTInitiationDate(patient.getPatientIi());

    if (initDate == null) return; // This patient has never been on any treatment

    boolean foundLowVL = false;

    Date previousDate = null;
    Date mostRecentVL = null;

    for (TestResult vl : VLResults) {

      if (mostRecentVL == null) {
        mostRecentVL = vl.getTestDate();
      }

      Double vlValue = Double.parseDouble(stripPrefix(vl.getValue()));

      if (vlValue < TREATMENT_WORKING_VIRAL_LOAD) {
        if (previousDate == null) {
          // this is the most recent VL
          logger.info("TFR for " + patient.getPatientId() + " is 0");

          instance.setValue(attribute, 0);
          return;
        } else {
          foundLowVL = true;
          Double diff;
          if (sequenceDate == null) {
            diff = new Double(getDiffInDays(previousDate, mostRecentVL));
          } else {
            diff = new Double(getDiffInDays(previousDate, sequenceDate));
          }
          logger.info("TFR for " + patient.getPatientId() + " is " + diff);

          instance.setValue(attribute, diff);
          return;
        }
      }

      previousDate = vl.getTestDate();
    }

    if (!foundLowVL) {
      // Viral load never supressed
      Double diff;

      if (sequenceDate == null) {
        diff = new Double(getDiffInDays(initDate, mostRecentVL));
      } else {
        diff = new Double(getDiffInDays(initDate, sequenceDate));
      }

      logger.info("TFR for " + patient.getPatientId() + " is " + diff);
      instance.setValue(attribute, diff);
    }
  }