Changeset c01ed3e in sasmodels for sasmodels/autoc.py
- Timestamp:
- Dec 22, 2017 4:48:12 PM (6 years ago)
- Children:
- 15be191
- Parents:
- 2694cb8
- git-author:
- Paul Kienzle <pkienzle@…> (12/22/17 16:46:46)
- git-committer:
- Paul Kienzle <pkienzle@…> (12/22/17 16:48:12)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/autoc.py
r67cc0ff rc01ed3e 4 4 from __future__ import print_function 5 5 6 import ast7 6 import inspect 8 from functools import reduce9 7 10 8 import numpy as np … … 96 94 # Claim all constants are declared on line 1 97 95 snippets.append('#line 1 "%s"'%escaped_filename) 98 snippets.append( define_constant(name, obj))96 snippets.append(py2c.define_constant(name, obj)) 99 97 elif isinstance(obj, special.Gauss): 100 98 for var, value in zip(("N", "Z", "W"), (obj.n, obj.z, obj.w)): … … 102 100 constants[var] = value 103 101 snippets.append('#line 1 "%s"'%escaped_filename) 104 snippets.append( define_constant(var, value))102 snippets.append(py2c.define_constant(var, value)) 105 103 #libs.append('lib/gauss%d.c'%obj.n) 106 104 source = (source.replace(name+'.n', 'GAUSS_N') … … 121 119 122 120 # translate source 123 ordered_code = [code[name] for name in ordered_dag(depends) if name in code]121 ordered_code = [code[name] for name in py2c.ordered_dag(depends) if name in code] 124 122 functions = py2c.translate(ordered_code, constants) 125 123 snippets.extend(functions) … … 129 127 info.c_code = "\n".join(snippets) 130 128 info.Iq = info.Iqac = info.Iqabc = info.Iqxy = info.form_volume = None 131 132 def define_constant(name, value):133 if isinstance(value, int):134 parts = ["int ", name, " = ", "%d"%value, ";"]135 elif isinstance(value, float):136 parts = ["double ", name, " = ", "%.15g"%value, ";"]137 else:138 # extend constant arrays to a multiple of 4; not sure if this139 # is necessary, but some OpenCL targets broke if the number140 # of parameters in the parameter table was not a multiple of 4,141 # so do it for all constant arrays to be safe.142 if len(value)%4 != 0:143 value = list(value) + [0.]*(4 - len(value)%4)144 elements = ["%.15g"%v for v in value]145 parts = ["double ", name, "[]", " = ",146 "{\n ", ", ".join(elements), "\n};"]147 return "".join(parts)148 149 150 # Modified from the following:151 #152 # http://code.activestate.com/recipes/578272-topological-sort/153 # Copyright (C) 2012 Sam Denton154 # License: MIT155 def ordered_dag(dag):156 # type: (Dict[T, Set[T]]) -> Iterator[T]157 dag = dag.copy()158 159 # make leaves depend on the empty set160 leaves = reduce(set.union, dag.values()) - set(dag.keys())161 dag.update({node: set() for node in leaves})162 while True:163 leaves = set(node for node, links in dag.items() if not links)164 if not leaves:165 break166 for node in leaves:167 yield node168 dag = {node: (links-leaves)169 for node, links in dag.items() if node not in leaves}170 if dag:171 raise ValueError("Cyclic dependes exists amongst these items:\n%s"172 % ", ".join(str(node) for node in dag.keys()))
Note: See TracChangeset
for help on using the changeset viewer.