Нечеткая / приближенная проверка решений по алгоритмам - PullRequest
2 голосов
/ 11 января 2010

У нас есть люди, которые запускают код для моделирования, тестирования и т. Д. На некоторых наших суперкомпьютерах. Было бы неплохо, если бы в рамках процесса сборки мы могли убедиться, что код не только компилируется, но и что выходные данные соответствуют некоторому шаблону, который будет указывать, что мы получаем значимые результаты.

т.е. исследователь может знать, что значение х должно быть в определенных пределах. Если нет, то в коде была допущена логическая ошибка (при условии, что он компилируется, и это не ошибка времени компиляции).

Есть ли какие-либо заранее написанные пакеты для такого рода вещей. Код написан на FORTRAN, C, C ++ и т. Д.

Буду признателен за любые конкретные или общие советы.

Ответы [ 3 ]

1 голос
/ 11 января 2010

Я ожидаю, что большинство фреймворков для юнит-тестирования могли бы сделать это; предоставьте набор тестовых данных для игрушек и убедитесь, что ответ вменяется различными способами.

0 голосов
/ 22 января 2010

Я должен был сделать это для конверсий в этом месяце. Я не знаю, может ли это вам помочь, но мне это показалось довольно простым решением.

Сначала я определил уровень допуска. (Пример кода Java-кода ...)

private static final double TOLERANCE = 0.000000000001D;

Затем я определил новый метод "areEqual", который проверяет, меньше ли разница между обоими значениями, чем уровень допуска.

private static boolean areEqual(double a, double b) {
    return (abs(a - b) < TOLERANCE);
}

Если я где-нибудь получу false, это означает, что проверка, вероятно, не удалась. Я могу настроить допуск, чтобы увидеть, является ли это просто проблемой точности или действительно плохим результатом. Хорошо работает в моей ситуации.

0 голосов
/ 13 января 2010

Хороший способ убедиться, что результирующее значение любого вычисления (конечного или промежуточного) удовлетворяет определенным ограничениям, - это использовать объектно-ориентированный язык программирования, такой как C ++, и определять типы данных, которые внутренне реализуют проверяемые вами условия за. Затем вы можете использовать эти типы данных в качестве возвращаемого значения любого вычисления, чтобы обеспечить выполнение указанных условий для возвращаемого значения.

Давайте посмотрим на простой пример. Предположим, что у вас есть функция-член внутри класса «Самолет» как часть системы управления полетом, которая оценивает массу экземпляра самолета как функцию количества пассажиров и количества топлива, которое самолет имеет в тот момент. Один из способов объявления класса Airplane и функции-члена flightMass () заключается в следующем:

class Airplane {
public:

    ...

    int airplaneMass() const; // note the plain int return type

    ...

private:
    ...
};

Однако, лучший способ реализовать вышеизложенное - это определить тип AirplaneMass , который можно использовать в качестве типа возврата функции вместо int . AirplaneMass может внутренне гарантировать (в своем конструкторе и любых перегруженных операторах), что значение, которое он инкапсулирует, удовлетворяет определенным ограничениям. Примером реализации типа данных AirplaneMass может быть следующий:

class AirplaneMass {
public:

    // AirplaneMass constructor
    AirplaneMass(int m) {
        if (m < MIN || m > MAX) {
            // throw exception or log constraint violation
        }

        // if the value of m meets the constraints,
        // assign it to the internal value.
        mass_ = m;
    }

    ...

    /* range checking should also be done in the implementation
       of overloaded operators. For instance, you may want to
       make sure that the resultant of the ++ operation for
       any instance of AirplaneMass also lies within the
       specified constraints. */

private:
    int mass_;
};

После этого вы можете переопределить класс Airplane и его функцию-член flightMass () следующим образом:

class Airplane {
public:

    ...

    AirplaneMass airplaneMass() const;
    // note the more specific AirplaneMass return type

    ...

private:
    ...
};

Вышеуказанное будет гарантировать, что значение, возвращаемое аэропланом (), находится между МИН и МАКС. В противном случае будет сгенерировано исключение или зарегистрировано состояние ошибки.

...