Skip to content

Commit

Permalink
Merge pull request #1417 from brian-team/deterministic_code
Browse files Browse the repository at this point in the history
Deterministic code generation
  • Loading branch information
mstimberg committed May 9, 2022
2 parents e673ace + b246fd8 commit 33dfd04
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 10 deletions.
2 changes: 1 addition & 1 deletion brian2/codegen/codeobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ def create_runner_codeobj(group, code, template_name,
needed_variables = []
# Resolve all variables (variables used in the code and variables needed by
# the template)
variables = group.resolve_all(identifiers | set(needed_variables) | set(template_variables),
variables = group.resolve_all(sorted(identifiers | set(needed_variables) | set(template_variables)),
# template variables are not known to the user:
user_identifiers=user_identifiers,
additional_variables=additional_variables,
Expand Down
6 changes: 3 additions & 3 deletions brian2/codegen/generators/cpp_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ def translate_statement(self, statement):
def translate_to_read_arrays(self, read, write, indices):
lines = []
# index and read arrays (index arrays first)
for varname in itertools.chain(indices, read):
for varname in itertools.chain(sorted(indices), sorted(read)):
index_var = self.variable_indices[varname]
var = self.variables[varname]
if varname not in write:
Expand All @@ -255,7 +255,7 @@ def translate_to_read_arrays(self, read, write, indices):
def translate_to_declarations(self, read, write, indices):
lines = []
# simply declare variables that will be written but not read
for varname in write:
for varname in sorted(write):
if varname not in read and varname not in indices:
var = self.variables[varname]
line = f"{self.c_data_type(var.dtype)} {varname};"
Expand All @@ -278,7 +278,7 @@ def translate_to_statements(self, statements, conditional_write_vars):
def translate_to_write_arrays(self, write):
lines = []
# write arrays
for varname in write:
for varname in sorted(write):
index_var = self.variable_indices[varname]
var = self.variables[varname]
line = f"{self.get_array_name(var)}[{index_var}] = {varname};"
Expand Down
4 changes: 2 additions & 2 deletions brian2/codegen/generators/cython_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ def translate_one_statement_sequence(self, statements, scalar=False):

def translate_to_read_arrays(self, read, indices):
lines = []
for varname in itertools.chain(indices, read):
for varname in itertools.chain(sorted(indices), sorted(read)):
var = self.variables[varname]
index = self.variable_indices[varname]
arrayname = self.get_array_name(var)
Expand All @@ -157,7 +157,7 @@ def translate_to_statements(self, statements, conditional_write_vars):

def translate_to_write_arrays(self, write):
lines = []
for varname in write:
for varname in sorted(write):
index_var = self.variable_indices[varname]
var = self.variables[varname]
line = f"{self.get_array_name(var, self.variables)}[{index_var}] = {varname}"
Expand Down
7 changes: 4 additions & 3 deletions brian2/devices/cpp_standalone/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import numbers
import tempfile
from distutils import ccompiler
import zlib

import numpy as np

Expand Down Expand Up @@ -325,8 +326,8 @@ def get_array_filename(self, var, basedir='results'):
-------
filename : str
A filename of the form
``'results/'+varname+'_'+str(hash(varname))``, where varname is the
name returned by `get_array_name`.
``'results/'+varname+'_'+str(zlib.crc32(varname))``, where varname
is the name returned by `get_array_name`.
Notes
-----
Expand All @@ -335,7 +336,7 @@ def get_array_filename(self, var, basedir='results'):
that are not case sensitive (e.g. on Windows).
"""
varname = self.get_array_name(var, access_data=False)
return os.path.join(basedir, f"{varname}_{str(hash(varname))}")
return os.path.join(basedir, f"{varname}_{str(zlib.crc32(varname.encode('utf-8')))}")

def add_array(self, var):
# Note that a dynamic array variable is added to both the arrays and
Expand Down
2 changes: 1 addition & 1 deletion brian2/monitors/spikemonitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def __init__(self, source, event, variables=None, record=True,
# Some dummy code so that code generation takes care of the indexing
# and subexpressions
code = [f'_to_record_{v} = _source_{v}'
for v in self.record_variables]
for v in sorted(self.record_variables)]
code = '\n'.join(code)

self.codeobj_class = codeobj_class
Expand Down

0 comments on commit 33dfd04

Please sign in to comment.