#include #include "ampl/ampl_c.h" int main(int argc, char** argv) { AMPL_DATAFRAME *df1; const char *const index1[] = {"NUTR", "n_min", "n_max"}; // Create first dataframe (for data indexed over NUTR) AMPL_CALL(AMPL_DataFrameCreate(&df1, 1, 2, index1)); // Add data row by row const char *nutrients[] = {"A", "B1", "B2", "C", "CAL", "NA"}; double n_mins[] = {700, 700, 700, 700, 16000, 0}; double n_maxs[] = {20000, 20000, 20000, 20000, 24000, 50000}; for (size_t i = 0; i < 6; i++) { AMPL_VARIANT *variants[3]; AMPL_TUPLE *tuple; AMPL_VariantCreateString(&variants[0], nutrients[i]); AMPL_VariantCreateNumeric(&variants[1], n_mins[i]); AMPL_VariantCreateNumeric(&variants[2], n_maxs[i]); AMPL_TupleCreate(&tuple, 3, variants); AMPL_CALL(AMPL_DataFrameAddRow(df1, tuple)); for (size_t j = 0; j < 3; j++) AMPL_VariantFree(&variants[j]); AMPL_TupleFree(&tuple); } AMPL_DATAFRAME *df2; const char *const index2[] = {"FOOD"}; // Create second dataframe (for data indexed over FOOD) AMPL_CALL(AMPL_DataFrameCreate(&df2, 1, 0, index2)); const char* const foods[] = {"BEEF", "CHK", "FISH", "HAM", "MCH", "MTL", "SPG", "TUR"}; const double f_mins[] = {2, 2, 2, 2, 2, 2, 2, 2}; const double f_maxs[] = {10, 10, 10, 10, 10, 10, 10, 10}; double costs[] = {3.19, 2.59, 2.29, 2.89, 1.89, 1.99, 1.99, 2.49}; // Add column by column AMPL_CALL(AMPL_DataFrameSetColumnArgString(df2, "FOOD", foods, 8)); AMPL_CALL(AMPL_DataFrameAddColumnDouble(df2, "f_min", f_mins)); AMPL_CALL(AMPL_DataFrameAddColumnDouble(df2, "f_max", f_maxs)); AMPL_CALL(AMPL_DataFrameAddColumnDouble(df2, "cost", costs)); AMPL_DATAFRAME *df3; const char *const index3[] = {"NUTR", "FOOD"}; // Create third dataframe, to assign data to the AMPL entity // param amt{NUTR, FOOD}; AMPL_CALL(AMPL_DataFrameCreate(&df3, 2, 0, index3)); // Populate the set columns const char *nutrWithMultiplicity[48]; const char *foodWithMultiplicity[48]; size_t i = 0; for (int n = 0; n < 6; n++) { for (int f = 0; f < 8; f++) { AMPL_VARIANT *v; AMPL_CALL(AMPL_DataFrameElement(df1, n, 0, &v)); char *nutr = (char*)nutrWithMultiplicity[i]; AMPL_VariantGetStringValue(v, &nutr); foodWithMultiplicity[i] = foods[f]; //AMPL_VariantFree(&v); i++; } } AMPL_CALL(AMPL_DataFrameSetColumnArgString(df3, "NUTR", nutrWithMultiplicity, 48)); AMPL_CALL(AMPL_DataFrameSetColumnArgString(df3, "FOOD", foodWithMultiplicity, 48)); // Populate with all these values double values[] = {60, 8, 8, 40, 15, 70, 25, 60, 10, 20, 15, 35, 15, 15, 25, 15, 15, 20, 10, 10, 15, 15, 15, 10, 20, 0, 10, 40, 35, 30, 50, 20, 295, 770, 440, 430, 315, 400, 370, 450, 968, 2180, 945, 278, 1182, 896, 1329, 1397}; AMPL_CALL(AMPL_DataFrameAddColumnDouble(df3, "amt", values)); // Create an AMPL instance AMPL *ampl; AMPL_CALL(AMPL_Create(&l)); /* // If the AMPL installation directory is not in the system search path: AMPL_ENVIRONMENT *env; AMPL_EnvironmentCreate(&env, "full path to the AMPL installation directory", ""); AMPL_CreateWithEnv(&l, env); */ if (argc > 1) AMPL_CALL(AMPL_SetOption(ampl, "solver", argv[1])); // Read the model file const char *modelDirectory = argc == 3 ? argv[2] : "../../models"; char dir[256]; sprintf(dir, "%s%s", modelDirectory, "/diet/diet.mod"); AMPL_CALL(AMPL_Read(ampl, dir)); // Assign data to NUTR, n_min and n_max AMPL_CALL(AMPL_SetData(ampl, df1, "NUTR")); AMPL_DataFrameFree(&df1); // Assign data to FOOD, f_min, f_max and cost AMPL_CALL(AMPL_SetData(ampl, df2, "FOOD")); AMPL_DataFrameFree(&df2); // Assign data to amt AMPL_CALL(AMPL_SetData(ampl, df3, "")); AMPL_DataFrameFree(&df3); // Solve the model AMPL_CALL(AMPL_Solve(ampl, "", "")); // Print out the result double value; AMPL_CALL(AMPL_GetValueNumeric(ampl, "Total_Cost", &value)); printf("Objective function value: %f\n", value); // Get the values of the variable Buy in a dataframe AMPL_DATAFRAME *results; //AMPL_DataFrameCreate(&results, 0, 0, NULL); AMPL_CALL(AMPL_EntityGetValues(ampl, "Buy", NULL, 0, &results)); // Print char *output; AMPL_CALL(AMPL_DataFrameToString(results, &output)); AMPL_DataFrameFree(&results); printf("%s\n", output); AMPL_StringFree(&output); //AMPL_EnvironmentFree(&env); AMPL_Free(&l); return 0; }