@@ -105,6 +105,21 @@ HypergraphMatcher::OrderingSpec getOrderingSpec(WolframLibraryData libData, MTen
105105 return result;
106106}
107107
108+ // Seed is passed as two uint16_t because LibraryLink does not support unsigned ints, which becomes a problem on 32-bit
109+ // architectures
110+ uint32_t getSeed (WolframLibraryData libData, MTensor seedTensor) {
111+ mint tensorLength = libData->MTensor_getFlattenedLength (seedTensor);
112+ if (tensorLength != 2 ) throw LIBRARY_FUNCTION_ERROR ;
113+ mint* tensorData = libData->MTensor_getIntegerData (seedTensor);
114+ uint32_t result = 0 ;
115+ for (mint i = 0 ; i < tensorLength; ++i) {
116+ result = (1 << 16 ) * result + static_cast <uint32_t >(getData (tensorData, tensorLength, i));
117+ }
118+ return result;
119+ }
120+
121+ constexpr int64_t wlStepLimitDisabled = -1 ;
122+
108123HypergraphSubstitutionSystem::StepSpecification getStepSpec (WolframLibraryData libData, MTensor stepsTensor) {
109124 mint tensorLength = libData->MTensor_getFlattenedLength (stepsTensor);
110125 constexpr mint specLength = 5 ;
@@ -115,6 +130,9 @@ HypergraphSubstitutionSystem::StepSpecification getStepSpec(WolframLibraryData l
115130 std::vector<int64_t > stepSpecElements (specLength);
116131 for (mint k = 0 ; k < specLength; ++k) {
117132 stepSpecElements[k] = static_cast <int64_t >(getData (tensorData, specLength, k));
133+ if (stepSpecElements[k] == wlStepLimitDisabled) {
134+ stepSpecElements[k] = HypergraphSubstitutionSystem::stepLimitDisabled;
135+ }
118136 if (stepSpecElements[k] < 0 ) throw LIBRARY_FUNCTION_ERROR ;
119137 }
120138
@@ -230,6 +248,9 @@ int hypergraphSubstitutionSystemInitialize(WolframLibraryData libData,
230248 SystemID thisSystemID;
231249 std::vector<Rule> rules;
232250 std::vector<AtomsVector> initialTokens;
251+ // WL passes wlStepLimitDisabled (-1) instead of HypergraphSubstitutionSystem::stepLimitDisabled (max int64) for
252+ // infinity because passing 64-bit ints is not supported on 32-bit systems in LibraryLink
253+ int64_t wlMaxDestroyerEvents;
233254 uint64_t maxDestroyerEvents;
234255 HypergraphMatcher::OrderingSpec orderingSpec;
235256 HypergraphMatcher::EventDeduplication eventDeduplication;
@@ -238,10 +259,12 @@ int hypergraphSubstitutionSystemInitialize(WolframLibraryData libData,
238259 thisSystemID = MArgument_getInteger (argv[0 ]);
239260 rules = getRules (libData, MArgument_getMTensor (argv[1 ]), MArgument_getMTensor (argv[2 ]));
240261 initialTokens = getHypergraph (libData, MArgument_getMTensor (argv[3 ]));
241- maxDestroyerEvents = MArgument_getInteger (argv[4 ]);
262+ wlMaxDestroyerEvents = MArgument_getInteger (argv[4 ]);
263+ maxDestroyerEvents = wlMaxDestroyerEvents == wlStepLimitDisabled ? HypergraphSubstitutionSystem::stepLimitDisabled
264+ : wlMaxDestroyerEvents;
242265 orderingSpec = getOrderingSpec (libData, MArgument_getMTensor (argv[5 ]));
243266 eventDeduplication = static_cast <HypergraphMatcher::EventDeduplication>(MArgument_getInteger (argv[6 ]));
244- randomSeed = static_cast < unsigned int >( MArgument_getInteger (argv[7 ]));
267+ randomSeed = getSeed (libData, MArgument_getMTensor (argv[7 ]));
245268 } catch (...) {
246269 return LIBRARY_FUNCTION_ERROR ;
247270 }
0 commit comments