Esempio n. 1
0
static inline wbImport_t wbImport_open(const char * file, const char * type0) {
    wbImport_t imp;
    wbImportKind_t kind;
    char * type;

    type = wbString_toLower(type0);

    if (wbString_sameQ(type, "cvs")) {
        kind = wbImportKind_csv;
    } else if (wbString_sameQ(type, "tsv")) {
        kind = wbImportKind_tsv;
    } else if (wbString_sameQ(type, "raw") || wbString_sameQ(type, "dat")) {
        kind = wbImportKind_raw;
    } else if (wbString_sameQ(type, "ppm")) {
        kind = wbImportKind_ppm;
    } else {
        wbLog(ERROR, "Invalid import type ", type0);
        wbExit();
    }

    imp = wbImport_open(file, kind);

    wbDelete(type);

    return imp;
}
Esempio n. 2
0
static wbBool wbSolution_correctQ(char *expectedOutputFile,
                                  wbSolution_t sol) {
  if (expectedOutputFile == NULL) {
    _solution_correctQ = "Failed to determined the expected output file.";
    return wbFalse;
  } else if (!wbFile_existsQ(expectedOutputFile)) {
    _solution_correctQ =
        wbString("The file ", expectedOutputFile, " does not exist.");
    return wbFalse;
  } else if (wbString_sameQ(wbSolution_getType(sol), "image")) {
    wbBool res;
    wbImage_t solutionImage = NULL;
    wbImage_t expectedImage = wbImport(expectedOutputFile);
    if (expectedImage == NULL) {
      _solution_correctQ = "Failed to open expected output file.";
      res                = wbFalse;
    } else if (wbImage_getWidth(expectedImage) !=
               wbSolution_getWidth(sol)) {
      _solution_correctQ =
          "The image width of the expected image does not "
          "match that of the solution.";
      res = wbFalse;
    } else if (wbImage_getHeight(expectedImage) !=
               wbSolution_getHeight(sol)) {
      _solution_correctQ =
          "The image height of the expected image does not "
          "match that of the solution.";
      res = wbFalse;
    } else if (wbImage_getChannels(expectedImage) !=
               wbSolution_getChannels(sol)) {
      _solution_correctQ =
          "The image channels of the expected image does not "
          "match that of the solution.";
      res = wbFalse;
    } else {
      solutionImage = (wbImage_t)wbSolution_getData(sol);
      wbAssert(solutionImage != NULL);
      res = wbImage_sameQ(solutionImage, expectedImage,
                          _onUnsameImageFunction);
    }
    if (expectedImage != NULL) {
      wbImage_delete(expectedImage);
    }
    return res;
  } else if (wbString_sameQ(wbSolution_getType(sol), "histogram")) {
    return wbSolution_listCorrectQ<unsigned char>(expectedOutputFile, sol,
                                                  "Integer");
  } else if (wbString_sameQ(wbSolution_getType(sol), "integral_vector")) {
    return wbSolution_listCorrectQ<int>(expectedOutputFile, sol,
                                        "Integer");
  } else if (wbString_sameQ(wbSolution_getType(sol), "vector") ||
             wbString_sameQ(wbSolution_getType(sol), "matrix")) {
    return wbSolution_listCorrectQ<wbReal_t>(expectedOutputFile, sol,
                                             "Real");
  } else {
    wbAssert(wbFalse);
    return wbFalse;
  }
}
Esempio n. 3
0
static wbExportKind_t _parseExportExtension(const char *file) {
  char *extension;
  wbExportKind_t kind;

  extension = wbFile_extension(file);

  if (wbString_sameQ(extension, "csv")) {
    kind = wbExportKind_csv;
  } else if (wbString_sameQ(extension, "tsv")) {
    kind = wbExportKind_tsv;
  } else if (wbString_sameQ(extension, "raw") ||
             wbString_sameQ(extension, "dat")) {
    kind = wbExportKind_raw;
  } else if (wbString_sameQ(extension, "text") ||
             wbString_sameQ(extension, "txt")) {
    kind = wbExportKind_text;
  } else if (wbString_sameQ(extension, "ppm") ||
             wbString_sameQ(extension, "pbm")) {
    kind = wbExportKind_ppm;
  } else {
    kind = wbExportKind_unknown;
    wbLog(ERROR, "File ", file, " does not have a compatible extension.");
  }

  wbDelete(extension);

  return kind;
}
Esempio n. 4
0
static void * wbImport(const char * file, int * resRows, int * resColumns, const char * type) {
    void * data, * res;
    wbImport_t imp;
    size_t sz;
    int columns = 0, rows = 0;
    wbImportKind_t kind;

    if (file == NULL) {
        fprintf(stderr, "Failed to import file.\n");
        wbExit();
    }

    kind = _parseImportExtension(file);

    wbAssert(kind != wbImportKind_unknown);

    imp = wbImport_open(file, kind);
    if (wbString_sameQ(type, "Real")) {
        data = wbImport_readAsReal(imp);
        sz = sizeof(wbReal_t);
    } else {
        data = wbImport_readAsInteger(imp);
        sz = sizeof(int);
    }

    if (kind == wbImportKind_csv || kind == wbImportKind_tsv) {
        rows = wbImportCSV_getRowCount(wbImport_getCSV(imp));
        columns = wbImportCSV_getColumnCount(wbImport_getCSV(imp));
    } else if (kind == wbImportKind_raw) {
        rows = wbImportRaw_getRowCount(wbImport_getRaw(imp));
        columns = wbImportRaw_getColumnCount(wbImport_getRaw(imp));
    }

    if (resRows != NULL) {
        *resRows = rows;
    }

    if (resColumns != NULL) {
        *resColumns = columns;
    }

    res = wbMalloc(sz * rows * columns);
    memcpy(res, data, sz * rows * columns);

    wbImport_close(imp);

    return res;
}
Esempio n. 5
0
wbBool wbSolution(char *expectedOutputFile, char *outputFile, char *type0,
                  void *data, int rows, int columns, int depth) {
  char *type;
  wbBool res;
  wbSolution_t sol;

  if (expectedOutputFile == NULL || data == NULL || type0 == NULL) {
    wbLog(ERROR, "Failed to grade solution");
    return wbFalse;
  }

  type = wbString_toLower(type0);

  if (_solution_correctQ != "") {
    _solution_correctQ = "";
  }

  wbSolution_setOutputFile(sol, outputFile);
  wbSolution_setId(sol, uuid());
  wbSolution_setSessionId(sol, sessionId());
  wbSolution_setType(sol, type);
  wbSolution_setData(sol, data);
  wbSolution_setRows(sol, rows);
  wbSolution_setColumns(sol, columns);
  wbSolution_setDepth(sol, depth);

  res = wbSolution_correctQ(expectedOutputFile, sol);

  if (outputFile != NULL) {
    if (wbString_sameQ(type, "image")) {
      wbImage_t inputImage = (wbImage_t)data;
      wbImage_t img        = wbImage_new(wbImage_getWidth(inputImage),
                                  wbImage_getHeight(inputImage),
                                  wbImage_getChannels(inputImage));
      memcpy(wbImage_getData(img), wbImage_getData(inputImage),
             rows * columns * wbImage_channels * sizeof(wbReal_t));
      wbExport(outputFile, img);
      wbImage_delete(img);
    } else if (wbString_sameQ(type, "integral_vector")) {
      wbExport(outputFile, (int *)data, rows, columns);
    } else if (wbString_sameQ(type, "vector") ||
               wbString_sameQ(type, "matrix")) {
      wbExport(outputFile, (wbReal_t *)data, rows, columns);
    } else if (wbString_sameQ(type, "histogram")) {
      wbExport(outputFile, (unsigned char *)data, rows, columns);
    } else if (wbString_sameQ(type, "text")) {
      wbExport_text(outputFile, (unsigned char *)data, rows * columns);
    }
  }

  wbFree(type);

  return res;
}
Esempio n. 6
0
static wbBool wbSolution_correctQ(char * expectedOutputFile, wbSolution_t sol) {
    wbBool res;

    if (expectedOutputFile == NULL) {
        _solution_correctQ = json_string("Failed to determined the expected output file.");
        return wbFalse;
    } else if (!wbFile_existsQ(expectedOutputFile)) {
        string str = wbString("The file ", expectedOutputFile, " does not exist.");
        _solution_correctQ = json_string(str.c_str());
        return wbFalse;
    } else if (wbString_sameQ(wbSolution_getType(sol), "image")) {
        wbImage_t solutionImage = NULL;
        wbImage_t expectedImage = wbImport(expectedOutputFile);
        if (expectedImage == NULL) {
            _solution_correctQ = json_string("Failed to open expected output file.");
            res = wbFalse;
        } else if (wbImage_getWidth(expectedImage) != wbSolution_getWidth(sol)) {
            _solution_correctQ = json_string("The image width of the expected image does not match that of the solution.");
            res = wbFalse;
        } else if (wbImage_getHeight(expectedImage) != wbSolution_getHeight(sol)) {
            _solution_correctQ = json_string("The image height of the expected image does not match that of the solution.");
            res = wbFalse;
        } else {

            solutionImage = (wbImage_t) wbSolution_getData(sol);
            wbAssert(solutionImage != NULL);

            res = wbImage_sameQ(solutionImage, expectedImage, _onUnsameImageFunction);
        }
        if (expectedImage != NULL) {
            wbImage_delete(expectedImage);
        }
        return res;
    } else if (wbString_sameQ(wbSolution_getType(sol), "vector") ||
               wbString_sameQ(wbSolution_getType(sol), "matrix")) {
        wbReal_t * expectedData;
        int expectedRows, expectedColumns;

        expectedData = (wbReal_t *) wbImport(expectedOutputFile, &expectedRows, &expectedColumns);

        if (expectedData == NULL) {
            _solution_correctQ = json_string("Failed to open expected output file.");
            res = wbFalse;
        } else if (expectedRows != wbSolution_getRows(sol)) {
            wbLog(TRACE, "Number of rows in the solution is ", wbSolution_getRows(sol),
                         ". Expected number of rows is ", expectedRows, ".");
            _solution_correctQ = json_string("The number of rows in the solution did not match that of the expected results.");
            res = wbFalse;
        } else if (expectedColumns != wbSolution_getColumns(sol)) {
            wbLog(TRACE, "Number of columns in the solution is ", wbSolution_getColumns(sol),
                         ". Expected number of columns is ", expectedColumns, ".");
            _solution_correctQ = json_string("The number of columns in the solution did not match that of the expected results.");
            res = wbFalse;
        } else {
            int ii, jj, idx;
            wbReal_t * solutionData;

            solutionData = (wbReal_t *) wbSolution_getData(sol);

            for (ii = 0; ii < expectedRows; ii++) {
                for (jj = 0; jj < expectedColumns; jj++) {
                    idx = ii * expectedColumns + jj;
                    if (wbUnequalQ(expectedData[idx], solutionData[idx])) {
                        string str;
                        if (expectedColumns == 1) {

                            str = wbString("The solution did not match the expected results at row ", ii,
                                            ". Expecting ", expectedData[idx], " but got ",
                                            solutionData[idx], ".");

                        } else {
                            str = wbString("The solution did not match the expected results at column ", jj,
                                            " and row ", ii, ". Expecting ", expectedData[idx], " but got ",
                                            solutionData[idx], ".");

                        }
                        _solution_correctQ = json_string(str.c_str());
                        res = wbFalse;
                        goto matrixCleanup;
                    }
                }
            }

            res = wbTrue;
        }
matrixCleanup:
        if (expectedData != NULL) {
            wbFree(expectedData);
        }
        return res;
    } else {
        wbAssert(wbFalse);
        return wbFalse;
    }
}