Beispiel #1
0
BICAPI void safe_compute_transform_from_tags(
    int                 npoints, 
    Real                **tag_list1, 
    Real                **tag_list2, 
    Trans_type          trans_type,
    General_transform   *transform )
{
#if !HAVE_FORK
        compute_transform_from_tags( npoints, tag_list1, tag_list2, trans_type,
                                     transform );
#else
    int                 fildes[2];
    FILE                *fpin, *fpout;
    Status              status;
    int                 statptr;
    General_transform   computed_transform;

    /* Create a pipe */

    if (pipe(fildes)) {
        create_linear_transform(transform, NULL);
        return;
    }

    /* Fork */
    if (fork()) {          /* Parent */
        (void) close(fildes[1]);
        fpin = fdopen(fildes[0], "r");
        status = input_transform(fpin, NULL, transform);
        (void) fclose(fpin);
        do {
            (void) wait(&statptr);
        } while (WIFSTOPPED(statptr));
        if (WEXITSTATUS(statptr) || status != OK) {
           if( status == OK )
               delete_general_transform( transform );
           create_linear_transform(transform, NULL);
           return;
        }
    }

    else {                 /* Child */
        (void) close(fildes[0]);
        fpout = fdopen(fildes[1], "w");
        compute_transform_from_tags(npoints, tag_list1, tag_list2, trans_type,
                                    &computed_transform);
        status = output_transform(fpout, NULL, NULL, NULL, &computed_transform);
        delete_general_transform( &computed_transform );
        (void) fclose(fpout);
        if (status != OK) {
            exit(EXIT_FAILURE);
        }
        else {
           exit(EXIT_SUCCESS);
        }
    }

    return;
#endif
}
int init_newton_transform(preprocessed *prep, float reqscale,
                          char *filename, int dimen)
/*
*/
{
  int  ii, jj;
  unsigned short matdim;
  double scale, onerow[MAX_DIMEN];
  PFile* dfpt;
  long foffset;
  double xfp;
  /* Open file
  */
  ASSERT(prep);
  ASSERT(filename);
  dfpt = file_must_open(NULL, filename, ("rb"), ESR_TRUE);
  prep->post_proc |= LIN_TRAN;
  prep->use_dim = dimen;
  pfread(&matdim, sizeof(short), 1, dfpt);
  if (matdim > MAX_DIMEN)
    SERVICE_ERROR(BAD_IMELDA);

  create_linear_transform(prep, matdim, 1);
  pfread(&scale, sizeof(double), 1, dfpt);

  if (reqscale != 0) scale = reqscale;
#if DEBUG
  PLogMessage("L: LDA Suggested scale is %.1f\n", scale);
#endif
  if (!prep->dim) prep->dim = matdim;
  else if (prep->dim != matdim)
  {
    log_report("Data (%d) and LDA (%d) dimensions don't match\n",
               prep->dim, matdim);
    SERVICE_ERROR(BAD_IMELDA);
  }

  /*  Eigenvalues, ignored
  */
  pfread(onerow, sizeof(double), matdim, dfpt);

  /*  Translation Vector
  */
  pfread(onerow, sizeof(double), matdim, dfpt);
  for (ii = 0; ii < matdim; ii++)
  {
    xfp = scale * (onerow[ii] - UTB_MEAN) + UTB_MEAN;
    if (xfp > 0.0)
      xfp += 0.5;
    else if (xfp < 0.0)
      xfp -= 0.5;

    prep->offset[ii] = (imeldata) xfp;
  }

  /*  The imelda matrix
  */
  for (ii = 0; ii < matdim; ii++)
  {
    pfread(onerow, sizeof(double), matdim, dfpt);
    for (jj = 0; jj < matdim; jj++)
      prep->imelda[ii][jj] = (covdata)(scale * onerow[jj]);
  }

  prep->imel_shift = scale_matrix_for_fixedpoint(prep->matrix,
                     prep->imelda, matdim);

  /* The inverse imelda matrix
   */
  foffset = pftell(dfpt);
  pfread(onerow, sizeof(double), matdim, dfpt);

  if (pfeof(dfpt) != 0)
  {
#ifdef SREC_ENGINE_VERBOSE_LOGGING
    PLogMessage("W: Inverting imelda matrix");
#endif
    invert_matrix(prep->imelda, prep->inverse, prep->dim);
  }
  else
  {
    pfseek(dfpt, foffset, SEEK_SET);

    for (ii = 0; ii < matdim; ii++)
    {
      pfread(onerow, sizeof(double), matdim, dfpt);
      for (jj = 0; jj < matdim; jj++)
        prep->inverse[ii][jj] = (covdata)(onerow[jj] / scale);
    }
  }

  prep->inv_shift = scale_matrix_for_fixedpoint(prep->invmat,
                    prep->inverse, matdim);

  pfclose(dfpt);
  return (0);
}