Scippy

    SCIP

    Solving Constraint Integer Programs

    datatree.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
    7/* */
    8/* Licensed under the Apache License, Version 2.0 (the "License"); */
    9/* you may not use this file except in compliance with the License. */
    10/* You may obtain a copy of the License at */
    11/* */
    12/* http://www.apache.org/licenses/LICENSE-2.0 */
    13/* */
    14/* Unless required by applicable law or agreed to in writing, software */
    15/* distributed under the License is distributed on an "AS IS" BASIS, */
    16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
    17/* See the License for the specific language governing permissions and */
    18/* limitations under the License. */
    19/* */
    20/* You should have received a copy of the Apache-2.0 license */
    21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
    22/* */
    23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    24
    25/**@file datatree.c
    26 * @ingroup OTHER_CFILES
    27 * @brief methods for managing data trees
    28 * @author Mohammed Ghannam
    29 */
    30
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    33#include <stdio.h>
    34#include <assert.h>
    35#include <string.h>
    36
    37#include "scip/datatree.h"
    38#include "scip/def.h"
    40#include "scip/set.h"
    41#include "scip/stat.h"
    42#include "scip/pub_datatree.h"
    43#include "scip/pub_message.h"
    44#include "scip/pub_misc.h"
    45#include "scip/syncstore.h"
    47
    48
    49/** default capacity of a table store */
    50#define DATATREE_DEFAULT_CAPACITY 4
    51
    52/** ensure a SCIP_DATATREE object can store an additional item
    53 *
    54 * This function ensures that a SCIP_DATATREE object can store an additional item
    55 * by increasing the itemssize, if necessary.
    56 */
    57static
    59 SCIP_DATATREE* datatree, /**< data tree */
    60 SCIP_SET* set, /**< global SCIP settings */
    61 BMS_BLKMEM* blkmem /**< block memory */
    62 )
    63{
    64 int newsize;
    65
    66 assert(datatree != NULL);
    67 assert(datatree->nitems <= datatree->itemssize);
    68
    69 if( datatree->nitems < datatree->itemssize )
    70 return SCIP_OKAY;
    71
    72 newsize = SCIPsetCalcMemGrowSize(set, datatree->itemssize + 1);
    73
    74 SCIP_ALLOC( BMSreallocBlockMemoryArray(blkmem, &datatree->items, datatree->itemssize, newsize) );
    75 datatree->itemssize = newsize;
    76
    77 return SCIP_OKAY;
    78}
    79
    80/** gives name to table valuetype enum */
    81static
    84 )
    85{
    86 switch( type )
    87 {
    89 return "bool";
    91 return "long";
    93 return "real";
    95 return "string";
    97 return "boolarray";
    99 return "longarray";
    101 return "realarray";
    103 return "stringarray";
    105 return "datatree";
    106 default:
    107 return "unknown";
    108 }
    109}
    110
    111/** creates a new SCIP_DATATREE with a given capacity for items */
    113 SCIP_DATATREE** datatree, /**< buffer to store pointer to created datatree */
    114 BMS_BLKMEM* blkmem, /**< block memory */
    115 int capacity /**< initial capacity */
    116 )
    117{
    118 assert(datatree != NULL);
    119 assert(blkmem != NULL);
    120 assert(capacity == -1 || capacity > 0);
    121
    122 if( capacity == -1 )
    123 capacity = DATATREE_DEFAULT_CAPACITY;
    124
    125 SCIP_ALLOC( BMSallocBlockMemory(blkmem, datatree) );
    126 (*datatree)->nitems = 0;
    127 (*datatree)->itemssize = capacity;
    128
    129 SCIP_ALLOC( BMSallocBlockMemoryArray(blkmem, &(*datatree)->items, capacity) );
    130
    131 return SCIP_OKAY;
    132}
    133
    134/** frees a SCIP_DATATREE object */
    136 SCIP_DATATREE** datatree, /**< pointer to datatree to free */
    137 BMS_BLKMEM* blkmem /**< block memory */
    138 )
    139{
    140 int i;
    141
    142 assert(datatree != NULL);
    143 assert(*datatree != NULL);
    144
    145 for( i = 0; i < (*datatree)->nitems; ++i )
    146 {
    147 SCIP_DATATREEITEM* item = &(*datatree)->items[i];
    148 switch( item->value.type )
    149 {
    153 break;
    155 BMSfreeBlockMemoryArray(blkmem, &item->value.data.as_string, strlen(item->value.data.as_string) + 1);
    156 break;
    159 break;
    162 break;
    165 break;
    167 {
    168 int j;
    169 for( j = 0; j < item->value.nvalues; ++j )
    170 {
    171 assert(item->value.data.as_stringarray[j] != NULL);
    172 BMSfreeBlockMemoryArray(blkmem, &item->value.data.as_stringarray[j], strlen(item->value.data.as_stringarray[j]) + 1);
    173 }
    175 break;
    176 }
    178 SCIPdatatreeFree(&item->value.data.as_dtree, blkmem);
    179 break;
    180 default:
    181 SCIPerrorMessage("Unknown type\n");
    182 SCIPABORT();
    183 }
    184 BMSfreeBlockMemoryArray(blkmem, &item->name, strlen(item->name) + 1);
    185 }
    186
    187 BMSfreeBlockMemoryArray(blkmem, &(*datatree)->items, (*datatree)->itemssize);
    188 BMSfreeBlockMemory(blkmem, datatree);
    189}
    190
    191/** inserts a SCIP_Bool value into a SCIP_DATATREE object */
    193 SCIP_DATATREE* datatree, /**< data tree */
    194 SCIP_SET* set, /**< global SCIP settings */
    195 BMS_BLKMEM* blkmem, /**< block memory */
    196 const char* name, /**< name of entry */
    197 SCIP_Bool value /**< value of entry */
    198 )
    199{
    200 SCIP_DATATREEITEM* item;
    201
    202 assert(datatree != NULL);
    203 assert(name != NULL);
    204
    205 /* allocate memory for the new item */
    206 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    207
    208 item = &datatree->items[datatree->nitems];
    209
    210 /* copy the name */
    211 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    212
    213 /* set the value */
    215 item->value.data.as_bool = value;
    216
    217 datatree->nitems++;
    218
    219 return SCIP_OKAY;
    220}
    221
    222/** inserts a long value into a SCIP_DATATREE object */
    224 SCIP_DATATREE* datatree, /**< data tree */
    225 SCIP_SET* set, /**< global SCIP settings */
    226 BMS_BLKMEM* blkmem, /**< block memory */
    227 const char* name, /**< name of entry */
    228 SCIP_Longint value /**< value of entry */
    229 )
    230{
    231 SCIP_DATATREEITEM* item;
    232
    233 assert(datatree != NULL);
    234 assert(name != NULL);
    235
    236 /* allocate memory for the new item */
    237 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    238
    239 item = &datatree->items[datatree->nitems];
    240
    241 /* copy the name */
    242 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    243
    244 /* set the value */
    246 item->value.data.as_long = value;
    247
    248 datatree->nitems++;
    249
    250 return SCIP_OKAY;
    251}
    252
    253/** inserts a SCIP_Real value into a SCIP_DATATREE object */
    255 SCIP_DATATREE* datatree, /**< data tree */
    256 SCIP_SET* set, /**< global SCIP settings */
    257 BMS_BLKMEM* blkmem, /**< block memory */
    258 const char* name, /**< name of entry */
    259 SCIP_Real value /**< value of entry */
    260 )
    261{
    262 SCIP_DATATREEITEM* item;
    263
    264 assert(datatree != NULL);
    265 assert(name != NULL);
    266
    267 /* allocate memory for the new item */
    268 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    269
    270 item = &datatree->items[datatree->nitems];
    271
    272 /* copy the name */
    273 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    274
    275 /* set the value */
    277 item->value.data.as_real = value;
    278
    279 datatree->nitems++;
    280
    281 return SCIP_OKAY;
    282}
    283
    284/** inserts a string value into a SCIP_DATATREE object */
    286 SCIP_DATATREE* datatree, /**< data tree */
    287 SCIP_SET* set, /**< global SCIP settings */
    288 BMS_BLKMEM* blkmem, /**< block memory */
    289 const char* name, /**< name of entry */
    290 const char* value /**< value of entry */
    291 )
    292{
    293 SCIP_DATATREEITEM* item;
    294
    295 assert(datatree != NULL);
    296 assert(name != NULL);
    297
    298 /* allocate memory for the new item */
    299 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    300
    301 item = &datatree->items[datatree->nitems];
    302
    303 /* copy the name */
    304 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    305
    306 /* set the value */
    308 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->value.data.as_string, value, strlen(value) + 1) );
    309
    310 datatree->nitems++;
    311
    312 return SCIP_OKAY;
    313}
    314
    315/** inserts a SCIP_Bool array into a SCIP_DATATREE object */
    317 SCIP_DATATREE* datatree, /**< data tree */
    318 SCIP_SET* set, /**< global SCIP settings */
    319 BMS_BLKMEM* blkmem, /**< block memory */
    320 const char* name, /**< name of entry */
    321 const SCIP_Bool* values, /**< values of entry */
    322 int nvalues /**< number of values */
    323 )
    324{
    325 SCIP_DATATREEITEM* item;
    326
    327 assert(datatree != NULL);
    328 assert(name != NULL);
    329 assert(values != NULL);
    330 assert(nvalues > 0);
    331
    332 /* allocate memory for the new item */
    333 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    334
    335 item = &datatree->items[datatree->nitems];
    336
    337 /* copy the name */
    338 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    339
    340 /* set the value */
    341 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->value.data.as_boolarray, values, nvalues) );
    342 item->value.nvalues = nvalues;
    344
    345 datatree->nitems++;
    346
    347 return SCIP_OKAY;
    348}
    349
    350/** inserts a SCIP_Longint array into a SCIP_DATATREE object */
    352 SCIP_DATATREE* datatree, /**< data tree */
    353 SCIP_SET* set, /**< global SCIP settings */
    354 BMS_BLKMEM* blkmem, /**< block memory */
    355 const char* name, /**< name of entry */
    356 const SCIP_Longint* values, /**< values of entry */
    357 int nvalues /**< number of values */
    358 )
    359{
    360 SCIP_DATATREEITEM* item;
    361
    362 assert(datatree != NULL);
    363 assert(name != NULL);
    364 assert(values != NULL);
    365 assert(nvalues > 0);
    366
    367 /* allocate memory for the new item */
    368 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    369
    370 item = &datatree->items[datatree->nitems];
    371
    372 /* copy the name */
    373 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    374
    375 /* set the value */
    376 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->value.data.as_longarray, values, nvalues) );
    377 item->value.nvalues = nvalues;
    379
    380 datatree->nitems++;
    381
    382 return SCIP_OKAY;
    383}
    384
    385/** inserts a SCIP_Real array into a SCIP_DATATREE object */
    387 SCIP_DATATREE* datatree, /**< data tree */
    388 SCIP_SET* set, /**< global SCIP settings */
    389 BMS_BLKMEM* blkmem, /**< block memory */
    390 const char* name, /**< name of entry */
    391 const SCIP_Real* values, /**< values of entry */
    392 int nvalues /**< number of values */
    393 )
    394{
    395 SCIP_DATATREEITEM* item;
    396
    397 assert(datatree != NULL);
    398 assert(name != NULL);
    399 assert(values != NULL);
    400 assert(nvalues > 0);
    401
    402 /* allocate memory for the new item */
    403 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    404
    405 item = &datatree->items[datatree->nitems];
    406
    407 /* copy the name */
    408 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    409
    410 /* set the value */
    411 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->value.data.as_realarray, values, nvalues) );
    412 item->value.nvalues = nvalues;
    414
    415 datatree->nitems++;
    416
    417 return SCIP_OKAY;
    418}
    419
    420/** inserts a string array into a SCIP_DATATREE object */
    422 SCIP_DATATREE* datatree, /**< data tree */
    423 SCIP_SET* set, /**< global SCIP settings */
    424 BMS_BLKMEM* blkmem, /**< block memory */
    425 const char* name, /**< name of entry */
    426 const char* const* values, /**< values of entry */
    427 int nvalues /**< number of values */
    428 )
    429{
    430 SCIP_DATATREEITEM* item;
    431 int i;
    432
    433 assert(datatree != NULL);
    434 assert(name != NULL);
    435 assert(values != NULL);
    436 assert(nvalues > 0);
    437
    438 /* allocate memory for the new item */
    439 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    440
    441 item = &datatree->items[datatree->nitems];
    442
    443 /* copy the name */
    444 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    445
    446 /* set the value */
    447 SCIP_ALLOC( BMSallocBlockMemoryArray(blkmem, &item->value.data.as_stringarray, nvalues) );
    448 for( i = 0; i < nvalues; ++i )
    449 {
    450 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->value.data.as_stringarray[i], values[i], strlen(values[i]) + 1) );
    451 }
    452 item->value.nvalues = nvalues;
    454
    455 datatree->nitems++;
    456
    457 return SCIP_OKAY;
    458}
    459
    460/** inserts a datatree value into a SCIP_DATATREE object */
    462 SCIP_DATATREE* datatree, /**< data tree */
    463 SCIP_SET* set, /**< global SCIP settings */
    464 BMS_BLKMEM* blkmem, /**< block memory */
    465 const char* name, /**< name of entry */
    466 SCIP_DATATREE* value /**< value of entry */
    467 )
    468{
    469 SCIP_DATATREEITEM* item;
    470
    471 assert(datatree != NULL);
    472 assert(name != NULL);
    473
    474 /* allocate memory for the new item */
    475 SCIP_CALL( datatreeExpand(datatree, set, blkmem) );
    476
    477 item = &datatree->items[datatree->nitems];
    478
    479 /* copy the name */
    480 SCIP_ALLOC( BMSduplicateBlockMemoryArray(blkmem, &item->name, name, strlen(name) + 1) );
    481
    482 /* set the value */
    484 item->value.data.as_dtree = value;
    485
    486 datatree->nitems++;
    487
    488 return SCIP_OKAY;
    489}
    490
    491/** writes a SCIP_DATATREE object as JSON to file */
    493 SCIP_DATATREE* datatree, /**< data tree */
    494 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    495 FILE* file /**< file to write to, or NULL for stdout */
    496 )
    497{
    498 int i;
    499
    500 assert(datatree != NULL);
    501
    502 SCIPmessageFPrintInfo(messagehdlr, file, "{");
    503 for( i = 0; i < datatree->nitems; ++i )
    504 {
    505 SCIPmessageFPrintInfo(messagehdlr, file, "\"%s\": ", datatree->items[i].name);
    506
    507 switch( datatree->items[i].value.type )
    508 {
    510 {
    511 SCIPmessageFPrintInfo(messagehdlr, file, "%s", datatree->items[i].value.data.as_bool ? "true" : "false");
    512 break;
    513 }
    515 {
    516 SCIPmessageFPrintInfo(messagehdlr, file, "%" SCIP_LONGINT_FORMAT, datatree->items[i].value.data.as_long);
    517 break;
    518 }
    520 {
    521 SCIPmessageFPrintInfo(messagehdlr, file, "%f", datatree->items[i].value.data.as_real);
    522 break;
    523 }
    525 {
    526 SCIPmessageFPrintInfo(messagehdlr, file, "\"%s\"", datatree->items[i].value.data.as_string);
    527 break;
    528 }
    530 {
    531 SCIP_CALL( SCIPdatatreeWriteJson( datatree->items[i].value.data.as_dtree, messagehdlr, file) );
    532 break;
    533 }
    538 {
    539 SCIPmessageFPrintInfo(messagehdlr, file, "[");
    540 for( int j = 0; j < datatree->items[i].value.nvalues; ++j )
    541 {
    542 switch( datatree->items[i].value.type )
    543 {
    545 {
    546 SCIPmessageFPrintInfo(messagehdlr, file, "%s", datatree->items[i].value.data.as_boolarray[j] ? "true" : "false");
    547 break;
    548 }
    549
    551 {
    552 SCIPmessageFPrintInfo(messagehdlr, file, "%" SCIP_LONGINT_FORMAT, datatree->items[i].value.data.as_longarray[j]);
    553 break;
    554 }
    555
    557 {
    558 SCIPmessageFPrintInfo(messagehdlr, file, "%f", datatree->items[i].value.data.as_realarray[j]);
    559 break;
    560 }
    561
    563 {
    564 SCIPmessageFPrintInfo(messagehdlr, file, "\"%s\"", datatree->items[i].value.data.as_stringarray[j]);
    565 break;
    566 }
    567
    568 default:
    569 {
    570 SCIPABORT();
    571 return SCIP_ERROR;
    572 }
    573 }
    574 if( j < datatree->items[i].value.nvalues - 1 )
    575 {
    576 SCIPmessageFPrintInfo(messagehdlr, file, ", ");
    577 }
    578 }
    579 SCIPmessageFPrintInfo(messagehdlr, file, "]");
    580 break;
    581 }
    582 default:
    583 {
    584 SCIPerrorMessage("Unknown SCIP_TABLEVALUETYPE\n");
    585 return SCIP_ERROR;
    586 }
    587 }
    588
    589 if( i < datatree->nitems - 1 )
    590 {
    591 SCIPmessageFPrintInfo(messagehdlr, file, ", ");
    592 }
    593 }
    594 SCIPmessageFPrintInfo(messagehdlr, file, "}");
    595
    596 return SCIP_OKAY;
    597}
    598
    599/** gets a bool value from a SCIP_DATATREE object */
    601 SCIP_DATATREE* datatree, /**< data tree */
    602 const char* name, /**< name to look up */
    603 SCIP_Bool* value /**< buffer to store value */
    604 )
    605{
    606 int i;
    607
    608 assert(datatree != NULL);
    609
    610 for( i = 0; i < datatree->nitems; ++i )
    611 {
    612 if( strcmp(datatree->items[i].name, name) == 0 )
    613 {
    614 if( datatree->items[i].value.type != SCIP_DATATREE_BOOL )
    615 {
    616 SCIPerrorMessage("Value for key %s is not of type bool, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    617 return SCIP_ERROR;
    618 }
    619 *value = datatree->items[i].value.data.as_bool;
    620 return SCIP_OKAY;
    621 }
    622 }
    623
    624 SCIPerrorMessage("Key %s not found\n", name);
    625 return SCIP_ERROR;
    626}
    627
    628/** gets a long value from a SCIP_DATATREE object */
    630 SCIP_DATATREE* datatree, /**< data tree */
    631 const char* name, /**< name to look up */
    632 SCIP_Longint* value /**< buffer to store value */
    633 )
    634{
    635 int i;
    636
    637 assert(datatree != NULL);
    638
    639 for( i = 0; i < datatree->nitems; ++i )
    640 {
    641 if( strcmp(datatree->items[i].name, name) == 0 )
    642 {
    643 if( datatree->items[i].value.type != SCIP_DATATREE_LONG )
    644 {
    645 SCIPerrorMessage("Value for key %s is not of type long, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    646 return SCIP_ERROR;
    647 }
    648 *value = datatree->items[i].value.data.as_long;
    649 return SCIP_OKAY;
    650 }
    651 }
    652
    653 SCIPerrorMessage("Key %s not found\n", name);
    654 return SCIP_ERROR;
    655}
    656
    657/** gets a SCIP_Real value from a SCIP_DATATREE object */
    659 SCIP_DATATREE* datatree, /**< data tree */
    660 const char* name, /**< name to look up */
    661 SCIP_Real* value /**< buffer to store value */
    662 )
    663{
    664 int i;
    665
    666 assert(datatree != NULL);
    667
    668 for( i = 0; i < datatree->nitems; ++i )
    669 {
    670 if( strcmp(datatree->items[i].name, name) == 0 )
    671 {
    672 if( datatree->items[i].value.type != SCIP_DATATREE_REAL )
    673 {
    674 SCIPerrorMessage("Value for key %s is not of type real, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    675 return SCIP_ERROR;
    676 }
    677 *value = datatree->items[i].value.data.as_real;
    678 return SCIP_OKAY;
    679 }
    680 }
    681
    682 SCIPerrorMessage("Key %s not found\n", name);
    683 return SCIP_ERROR;
    684}
    685
    686/** gets a string value from a SCIP_DATATREE object */
    688 SCIP_DATATREE* datatree, /**< data tree */
    689 const char* name, /**< name to look up */
    690 const char** value /**< buffer to store pointer to string */
    691 )
    692{
    693 int i;
    694
    695 assert(datatree != NULL);
    696
    697 for( i = 0; i < datatree->nitems; ++i )
    698 {
    699 if( strcmp(datatree->items[i].name, name) == 0 )
    700 {
    701 if( datatree->items[i].value.type != SCIP_DATATREE_STRING )
    702 {
    703 SCIPerrorMessage("Value for key %s is not of type string, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    704 return SCIP_ERROR;
    705 }
    706 *value = datatree->items[i].value.data.as_string;
    707 return SCIP_OKAY;
    708 }
    709 }
    710
    711 SCIPerrorMessage("Key %s not found\n", name);
    712 return SCIP_ERROR;
    713}
    714
    715/** gets a bool array from a SCIP_DATATREE object */
    717 SCIP_DATATREE* datatree, /**< data tree */
    718 const char* name, /**< name to look up */
    719 SCIP_Bool** values, /**< buffer to store pointer to values */
    720 int* nvalues /**< buffer to store number of values */
    721 )
    722{
    723 int i;
    724
    725 assert(datatree != NULL);
    726 assert(name != NULL);
    727 assert(values != NULL);
    728 assert(nvalues != NULL);
    729
    730 for( i = 0; i < datatree->nitems; ++i )
    731 {
    732 if( strcmp(datatree->items[i].name, name) == 0 )
    733 {
    734 if( datatree->items[i].value.type != SCIP_DATATREE_BOOLARRAY )
    735 {
    736 SCIPerrorMessage("Value for key %s is not of type bool array, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    737 return SCIP_ERROR;
    738 }
    739
    740 *values = datatree->items[i].value.data.as_boolarray;
    741 *nvalues = datatree->items[i].value.nvalues;
    742
    743 return SCIP_OKAY;
    744 }
    745 }
    746
    747 SCIPerrorMessage("Key %s not found\n", name);
    748 return SCIP_ERROR;
    749}
    750
    751/** gets a SCIP_Longint array from a SCIP_DATATREE object */
    753 SCIP_DATATREE* datatree, /**< data tree */
    754 const char* name, /**< name to look up */
    755 SCIP_Longint** values, /**< buffer to store pointer to values */
    756 int* nvalues /**< buffer to store number of values */
    757 )
    758{
    759 int i;
    760
    761 assert(datatree != NULL);
    762 assert(name != NULL);
    763 assert(values != NULL);
    764 assert(nvalues != NULL);
    765
    766 for( i = 0; i < datatree->nitems; ++i )
    767 {
    768 if( strcmp(datatree->items[i].name, name) == 0 )
    769 {
    770 if( datatree->items[i].value.type != SCIP_DATATREE_LONGARRAY )
    771 {
    772 SCIPerrorMessage("Value for key %s is not of type long array, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    773 return SCIP_ERROR;
    774 }
    775
    776 *values = datatree->items[i].value.data.as_longarray;
    777 *nvalues = datatree->items[i].value.nvalues;
    778
    779 return SCIP_OKAY;
    780 }
    781 }
    782
    783 SCIPerrorMessage("Key %s not found\n", name);
    784 return SCIP_ERROR;
    785}
    786
    787/** gets a SCIP_Real array from a SCIP_DATATREE object */
    789 SCIP_DATATREE* datatree, /**< data tree */
    790 const char* name, /**< name to look up */
    791 SCIP_Real** values, /**< buffer to store pointer to values */
    792 int* nvalues /**< buffer to store number of values */
    793 )
    794{
    795 int i;
    796
    797 assert(datatree != NULL);
    798 assert(name != NULL);
    799 assert(values != NULL);
    800 assert(nvalues != NULL);
    801
    802 for( i = 0; i < datatree->nitems; ++i )
    803 {
    804 if( strcmp(datatree->items[i].name, name) == 0 )
    805 {
    806 if( datatree->items[i].value.type != SCIP_DATATREE_REALARRAY )
    807 {
    808 SCIPerrorMessage("Value for key %s is not of type real array, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    809 return SCIP_ERROR;
    810 }
    811
    812 *values = datatree->items[i].value.data.as_realarray;
    813 *nvalues = datatree->items[i].value.nvalues;
    814
    815 return SCIP_OKAY;
    816 }
    817 }
    818
    819 SCIPerrorMessage("Key %s not found\n", name);
    820 return SCIP_ERROR;
    821}
    822
    823
    824/** gets a string array from a SCIP_DATATREE object */
    826 SCIP_DATATREE* datatree, /**< data tree */
    827 const char* name, /**< name to look up */
    828 char*** values, /**< buffer to store pointer to values */
    829 int* nvalues /**< buffer to store number of values */
    830 )
    831{
    832 int i;
    833
    834 assert(datatree != NULL);
    835 assert(name != NULL);
    836 assert(values != NULL);
    837 assert(nvalues != NULL);
    838
    839 for( i = 0; i < datatree->nitems; ++i )
    840 {
    841 if( strcmp(datatree->items[i].name, name) == 0 )
    842 {
    843 if( datatree->items[i].value.type != SCIP_DATATREE_STRINGARRAY )
    844 {
    845 SCIPerrorMessage("Value for key %s is not of type string array, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    846 return SCIP_ERROR;
    847 }
    848
    849 *values = datatree->items[i].value.data.as_stringarray;
    850 *nvalues = datatree->items[i].value.nvalues;
    851
    852 return SCIP_OKAY;
    853 }
    854 }
    855
    856 SCIPerrorMessage("Key %s not found\n", name);
    857 return SCIP_ERROR;
    858}
    859
    860/** gets a datatree value from a SCIP_DATATREE object */
    862 SCIP_DATATREE* datatree, /**< data tree */
    863 const char* name, /**< name to look up */
    864 SCIP_DATATREE** value /**< buffer to store pointer to datatree */
    865 )
    866{
    867 int i;
    868
    869 assert(datatree != NULL);
    870
    871 for( i = 0; i < datatree->nitems; ++i )
    872 {
    873 if( strcmp(datatree->items[i].name, name) == 0 )
    874 {
    875 if( datatree->items[i].value.type != SCIP_DATATREE_DATATREE )
    876 {
    877 SCIPerrorMessage("Value for key %s is not of type datatree, but of type %s\n", name, datatreeValueTypeToString(datatree->items[i].value.type));
    878 return SCIP_ERROR;
    879 }
    880 *value = datatree->items[i].value.data.as_dtree;
    881 return SCIP_OKAY;
    882 }
    883 }
    884
    885 SCIPerrorMessage("Key %s not found\n", name);
    886 return SCIP_ERROR;
    887}
    SCIP_RETCODE SCIPdatatreeInsertBoolArray(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, const SCIP_Bool *values, int nvalues)
    Definition: datatree.c:316
    SCIP_RETCODE SCIPdatatreeInsertTree(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, SCIP_DATATREE *value)
    Definition: datatree.c:461
    SCIP_RETCODE SCIPdatatreeInsertStringArray(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, const char *const *values, int nvalues)
    Definition: datatree.c:421
    SCIP_RETCODE SCIPdatatreeInsertLongArray(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, const SCIP_Longint *values, int nvalues)
    Definition: datatree.c:351
    SCIP_RETCODE SCIPdatatreeCreate(SCIP_DATATREE **datatree, BMS_BLKMEM *blkmem, int capacity)
    Definition: datatree.c:112
    void SCIPdatatreeFree(SCIP_DATATREE **datatree, BMS_BLKMEM *blkmem)
    Definition: datatree.c:135
    #define DATATREE_DEFAULT_CAPACITY
    Definition: datatree.c:50
    static SCIP_RETCODE datatreeExpand(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem)
    Definition: datatree.c:58
    SCIP_RETCODE SCIPdatatreeInsertLong(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, SCIP_Longint value)
    Definition: datatree.c:223
    SCIP_RETCODE SCIPdatatreeWriteJson(SCIP_DATATREE *datatree, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
    Definition: datatree.c:492
    SCIP_RETCODE SCIPdatatreeInsertString(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, const char *value)
    Definition: datatree.c:285
    SCIP_RETCODE SCIPdatatreeInsertRealArray(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, const SCIP_Real *values, int nvalues)
    Definition: datatree.c:386
    SCIP_RETCODE SCIPdatatreeInsertBool(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, SCIP_Bool value)
    Definition: datatree.c:192
    static const char * datatreeValueTypeToString(SCIP_DATATREE_VALUETYPE type)
    Definition: datatree.c:82
    SCIP_RETCODE SCIPdatatreeInsertReal(SCIP_DATATREE *datatree, SCIP_SET *set, BMS_BLKMEM *blkmem, const char *name, SCIP_Real value)
    Definition: datatree.c:254
    internal methods for handling data trees
    common defines and data types used in all packages of SCIP
    #define NULL
    Definition: def.h:248
    #define SCIP_Longint
    Definition: def.h:141
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_ALLOC(x)
    Definition: def.h:366
    #define SCIP_Real
    Definition: def.h:156
    #define SCIP_LONGINT_FORMAT
    Definition: def.h:148
    #define SCIPABORT()
    Definition: def.h:327
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_RETCODE SCIPdatatreeGetBoolArray(SCIP_DATATREE *datatree, const char *name, SCIP_Bool **values, int *nvalues)
    Definition: datatree.c:716
    SCIP_RETCODE SCIPdatatreeGetStringArray(SCIP_DATATREE *datatree, const char *name, char ***values, int *nvalues)
    Definition: datatree.c:825
    SCIP_RETCODE SCIPdatatreeGetLong(SCIP_DATATREE *datatree, const char *name, SCIP_Longint *value)
    Definition: datatree.c:629
    SCIP_RETCODE SCIPdatatreeGetTree(SCIP_DATATREE *datatree, const char *name, SCIP_DATATREE **value)
    Definition: datatree.c:861
    SCIP_RETCODE SCIPdatatreeGetReal(SCIP_DATATREE *datatree, const char *name, SCIP_Real *value)
    Definition: datatree.c:658
    SCIP_RETCODE SCIPdatatreeGetString(SCIP_DATATREE *datatree, const char *name, const char **value)
    Definition: datatree.c:687
    SCIP_RETCODE SCIPdatatreeGetBool(SCIP_DATATREE *datatree, const char *name, SCIP_Bool *value)
    Definition: datatree.c:600
    SCIP_RETCODE SCIPdatatreeGetRealArray(SCIP_DATATREE *datatree, const char *name, SCIP_Real **values, int *nvalues)
    Definition: datatree.c:788
    SCIP_RETCODE SCIPdatatreeGetLongArray(SCIP_DATATREE *datatree, const char *name, SCIP_Longint **values, int *nvalues)
    Definition: datatree.c:752
    memory allocation routines
    #define BMSduplicateBlockMemoryArray(mem, ptr, source, num)
    Definition: memory.h:462
    #define BMSfreeBlockMemory(mem, ptr)
    Definition: memory.h:465
    #define BMSallocBlockMemory(mem, ptr)
    Definition: memory.h:451
    #define BMSallocBlockMemoryArray(mem, ptr, num)
    Definition: memory.h:454
    #define BMSfreeBlockMemoryArray(mem, ptr, num)
    Definition: memory.h:467
    #define BMSreallocBlockMemoryArray(mem, ptr, oldnum, newnum)
    Definition: memory.h:458
    struct BMS_BlkMem BMS_BLKMEM
    Definition: memory.h:437
    void SCIPmessageFPrintInfo(SCIP_MESSAGEHDLR *messagehdlr, FILE *file, const char *formatstr,...)
    Definition: message.c:618
    public methods for managing data trees
    public methods for message output
    #define SCIPerrorMessage
    Definition: pub_message.h:64
    public data structures and miscellaneous methods
    int SCIPsetCalcMemGrowSize(SCIP_SET *set, int num)
    Definition: set.c:6080
    internal methods for global SCIP settings
    internal methods for problem statistics
    SCIP_DATATREEVALUE value
    SCIP_DATATREEVALUEUNION data
    SCIP_DATATREE_VALUETYPE type
    SCIP_DATATREEITEM * items
    data structures for data trees
    Definition: heur_padm.c:135
    the function declarations for the synchronization store
    @ SCIP_DATATREE_REALARRAY
    Definition: type_datatree.h:49
    @ SCIP_DATATREE_LONGARRAY
    Definition: type_datatree.h:48
    @ SCIP_DATATREE_BOOLARRAY
    Definition: type_datatree.h:47
    @ SCIP_DATATREE_LONG
    Definition: type_datatree.h:44
    @ SCIP_DATATREE_REAL
    Definition: type_datatree.h:45
    @ SCIP_DATATREE_DATATREE
    Definition: type_datatree.h:51
    @ SCIP_DATATREE_STRING
    Definition: type_datatree.h:46
    @ SCIP_DATATREE_BOOL
    Definition: type_datatree.h:43
    @ SCIP_DATATREE_STRINGARRAY
    Definition: type_datatree.h:50
    enum SCIP_Datatree_Valuetype SCIP_DATATREE_VALUETYPE
    Definition: type_datatree.h:55
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_ERROR
    Definition: type_retcode.h:43
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    SCIP_DATATREE * as_dtree
    SCIP_Longint * as_longarray