Skip to content

Apparent bug when reading multiple nl files with different external function libraries #13

@Robbybp

Description

@Robbybp

First, thank you for maintaining this library. I am using ASL with a couple libraries of external functions. In a common workflow, I send several nl files to ASL in a sequence, each with its own set of libraries for external functions, which I communicate via the -i argument in the argv array passed to getstops. When an nl file's libraries include more libraries than the previous nl file, I get a function not available error message.

I have attached two nl files that can be used to produce this error: nlfiles.zip. The following code produces the error:

// asl_issue.cpp
#include <stdio.h>
#include <assert.h>
#include "asl_pfgh.h"
#include "getstub.h"

struct ASL_pfgh;
struct Option_Info;

int instantiate_asl(char *nlfile, char *amplfunc){
  printf("Instantiating ASL with file %s and amplfunc %s\n", nlfile, amplfunc);

  ASL_pfgh *asl = (ASL_pfgh *) ASL_alloc(ASL_read_pfgh);
  assert(asl);

  Option_Info* oi = new Option_Info;

  char *argv[] = { 
    (char *)"program_name",
    (char *)"-i",
    amplfunc,
    nlfile,
    NULL,
  };  
  char *stub = getstops(argv, oi);

  FILE *nl = jac0dim(stub, (int)strlen(stub));
  assert(nl);

  int ret = pfgh_read(nl, ASL_findgroups);

  delete oi; 

  return 0;
}

int main(){
  char nlfile1[] = "file1.nl";
  char amplfunc1[] = "/PATH/TO/.idaes/bin/cubic_roots.dylib";
  char nlfile2[] = "file2.nl";
  char amplfunc2[] = ( 
    "/PATH/TO/.idaes/bin/cubic_roots.dylib"
    "\n/PATH/TO/.idaes/bin/functions.dylib"
  );  

  int ret;
  ret = instantiate_asl(nlfile1, amplfunc1);
  ret = instantiate_asl(nlfile2, amplfunc2);

  return 0;
}

which is compiled with the following:

clang++ -o asl_issue \
    -I/PATH/TO/asl/src/solvers/sys.arm64.Darwin \
    asl_issue.cpp \
    /PATH/TO/asl/src/solvers/sys.arm64.Darwin/amplsolver.a

Here, amplsolver.a is compiled by running $ ./configure && make CFLAGS=-fPIC in the asl/src/solvers directory.

As the above suggests, I have prepared this example using Mac with Apple silicon. However, I have noticed this behavior on Linux as well (but have not tested the above example on Linux).
When I change the above code so that the first instantiate_asl call uses both function libraries, i.e.:

  int ret;
  ret = instantiate_asl(nlfile1, amplfunc2);
  ret = instantiate_asl(nlfile2, amplfunc2);

the program runs without error.

The nl files attached depend on libraries distributed by IDAES. They are typically downloaded by the idaes-pse Python package and put in the $HOME/.idaes/bin directory, via:

$ pip install idaes-pse
$ idaes get-extensions

Let me know if this is in fact a bug. I believe I am using the -i argument correctly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions