public String exportOutputs(Engine engine) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < engine.numberOfOutputVariables(); ++i) {
            OutputVariable outputVariable = engine.getOutputVariable(i);
            result.append(String.format("[Output%d]\n", (i + 1)));
            if (!outputVariable.isEnabled()) {
                result.append(String.format("Enabled=%d\n", outputVariable.isEnabled() ? 1 : 0));
            }
            result.append(String.format("Name='%s'\n", outputVariable.getName()));
            result.append(String.format("Range=[%s %s]\n",
                    str(outputVariable.getMinimum()), str(outputVariable.getMaximum())));
            if (!Double.isNaN(outputVariable.getDefaultValue())) {
                result.append(String.format("Default=%s\n", str(outputVariable.getDefaultValue())));
            }
            if (outputVariable.isLockingValidOutput()) {
                result.append(String.format("LockValid=%d\n", outputVariable.isLockingValidOutput() ? 1 : 0));
            }
            if (outputVariable.isLockingOutputRange()) {
                result.append(String.format("LockRange=%d\n", outputVariable.isLockingOutputRange() ? 1 : 0));
            }
            result.append(String.format("NumMFs=%d\n", outputVariable.numberOfTerms()));
            for (int t = 0; t < outputVariable.numberOfTerms(); ++t) {
                Term term = outputVariable.getTerm(t);
                result.append(String.format("MF%d=%s\n",
                        (t + 1), toString(term)));
            }
            result.append("\n");
        }

        return result.toString();
    }