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