1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 2 /* */ 3 /* This file is part of the program and library */ 4 /* SCIP --- Solving Constraint Integer Programs */ 5 /* */ 6 /* Copyright (c) 2002-2023 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 scip_randnumgen.c 26 * @ingroup OTHER_CFILES 27 * @brief public methods for random numbers 28 * @author Tobias Achterberg 29 * @author Timo Berthold 30 * @author Gerald Gamrath 31 * @author Leona Gottwald 32 * @author Stefan Heinz 33 * @author Gregor Hendel 34 * @author Thorsten Koch 35 * @author Alexander Martin 36 * @author Marc Pfetsch 37 * @author Michael Winkler 38 * @author Kati Wolter 39 * 40 * @todo check all SCIP_STAGE_* switches, and include the new stages TRANSFORMED and INITSOLVE 41 */ 42 43 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/ 44 45 #include "scip/misc.h" 46 #include "scip/pub_message.h" 47 #include "scip/scip_mem.h" 48 #include "scip/scip_randnumgen.h" 49 #include "scip/set.h" 50 #include "scip/struct_scip.h" 51 52 /** creates and initializes a random number generator 53 * 54 * @note The initial seed is changed using SCIPinitializeRandomSeed() 55 */ 56 SCIP_RETCODE SCIPcreateRandom( 57 SCIP* scip, /**< SCIP data structure */ 58 SCIP_RANDNUMGEN** randnumgen, /**< random number generator */ 59 unsigned int initialseed, /**< initial random seed */ 60 SCIP_Bool useglobalseed /**< should the supplied seed be initialized by SCIP's global seed shift? */ 61 ) 62 { 63 unsigned int modifiedseed; 64 65 assert(scip != NULL); 66 assert(randnumgen != NULL); 67 68 if( useglobalseed ) 69 modifiedseed = SCIPinitializeRandomSeed(scip, initialseed); 70 else 71 modifiedseed = initialseed; 72 73 SCIP_CALL( SCIPrandomCreate(randnumgen, SCIPblkmem(scip), modifiedseed) ); 74 75 return SCIP_OKAY; 76 } 77 78 /** frees a random number generator */ 79 void SCIPfreeRandom( 80 SCIP* scip, /**< SCIP data structure */ 81 SCIP_RANDNUMGEN** randnumgen /**< random number generator */ 82 ) 83 { 84 assert(scip != NULL); 85 assert(randnumgen != NULL); 86 87 SCIPrandomFree(randnumgen, SCIPblkmem(scip)); 88 } 89 90 /** initializes a random number generator with a given start seed 91 * 92 * @note The seed is changed using SCIPinitializeRandomSeed() 93 */ 94 void SCIPsetRandomSeed( 95 SCIP* scip, /**< SCIP data structure */ 96 SCIP_RANDNUMGEN* randnumgen, /**< random number generator */ 97 unsigned int seed /**< new random seed */ 98 ) 99 { 100 unsigned int modifiedseed; 101 102 assert(scip != NULL); 103 assert(randnumgen != NULL); 104 105 modifiedseed = SCIPinitializeRandomSeed(scip, seed); 106 107 SCIPrandomSetSeed(randnumgen, modifiedseed); 108 } 109 110 /** modifies an initial seed value with the global shift of random seeds */ 111 unsigned int SCIPinitializeRandomSeed( 112 SCIP* scip, /**< SCIP data structure */ 113 unsigned int initialseedvalue /**< initial seed value to be modified */ 114 ) 115 { 116 assert(scip != NULL); 117 118 return SCIPsetInitializeRandomSeed(scip->set, initialseedvalue); 119 } 120