Changes in / [8224d24:1ddb794] in sasmodels


Ignore:
Location:
sasmodels
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/autoc.py

    r1ddb794 r1ddb794  
    9292                    # not special: add function to translate stack 
    9393                    translate.append((name, obj)) 
    94             elif isinstance(obj, (int, float, list, tuple, np.ndarray)): 
     94            elif isinstance(obj, float): 
    9595                constants[name] = obj 
    96                 # Claim all constants are declared on line 1 
    97                 snippets.append('#line 1 "%s"'%escaped_filename) 
    98                 snippets.append(define_constant(name, obj)) 
     96                snippets.append('#line 1 "%s"' % escaped_filename) 
     97                snippets.append("const double %s = %.15g;"%(name, obj)) 
     98            elif isinstance(obj, int): 
     99                constants[name] = obj 
     100                snippets.append('#line 1 "%s"' % escaped_filename) 
     101                snippets.append("const int %s = %d;"%(name, obj)) 
     102            elif isinstance(obj, (list, tuple, np.ndarray)): 
     103                constants[name] = obj 
     104                # extend constant arrays to a multiple of 4; not sure if this 
     105                # is necessary, but some OpenCL targets broke if the number 
     106                # of parameters in the parameter table was not a multiple of 4, 
     107                # so do it for all constant arrays to be safe. 
     108                if len(obj)%4 != 0: 
     109                    obj = list(obj) + [0.]*(4-len(obj)) 
     110                vals = ", ".join("%.15g"%v for v in obj) 
     111                snippets.append('#line 1 "%s"' % escaped_filename) 
     112                snippets.append("const double %s[] = {%s};" %(name, vals)) 
    99113            elif isinstance(obj, special.Gauss): 
    100                 #constants["GAUSS_N"] = obj.n 
    101                 #constants["GAUSS_Z"] = obj.z 
    102                 #constants["GAUSS_W"] = obj.w 
     114                constants["GAUSS_N"] = obj.n 
     115                constants["GAUSS_Z"] = obj.z 
     116                constants["GAUSS_W"] = obj.w 
    103117                libs.append('lib/gauss%d.c'%obj.n) 
    104118                source = (source.replace(name+'.n', 'GAUSS_N') 
     
    128142    info.Iq = info.Iqxy = info.form_volume = None 
    129143 
    130 def define_constant(name, value): 
    131     if isinstance(value, int): 
    132         parts = ["int ", name, " = ", "%d"%value, ";"] 
    133     elif isinstance(value, float): 
    134         parts = ["double ", name, " = ", "%.15g"%value, ";"] 
    135     else: 
    136         # extend constant arrays to a multiple of 4; not sure if this 
    137         # is necessary, but some OpenCL targets broke if the number 
    138         # of parameters in the parameter table was not a multiple of 4, 
    139         # so do it for all constant arrays to be safe. 
    140         if len(value)%4 != 0: 
    141             value = list(value) + [0.]*(4 - len(value)%4) 
    142         elements = ["%.15g"%v for v in value] 
    143         parts = ["double ", name, "[]", " = ", 
    144                  "{\n   ", ", ".join(elements), "\n};"] 
    145     return "".join(parts) 
    146  
    147144 
    148145# Modified from the following: 
  • sasmodels/py2c.py

    rddfdb16 r1ddb794  
    575712/15/2017, OE: Precedence maintained by writing opening and closing 
    5858                parenthesesm '(',')', in procedure 'visit_BinOp'. 
    59 12/18/2017, OE: Added call to 'add_current_line()' at the beginning 
    60                 of visit_Return 
    61  
    6259""" 
    6360import ast 
     
    10299 
    103100 
    104 def to_source(node, func_name, constants=None): 
     101#def to_source(node, indent_with=' ' * 4, add_line_information=False): 
     102def to_source(node, func_name): 
    105103    """This function can convert a node tree back into python sourcecode. 
    106104    This is useful for debugging purposes, especially if you're dealing with 
     
    120118    number information of statement nodes. 
    121119    """ 
    122     generator = SourceGenerator(' ' * 4, False, constants) 
     120    generator = SourceGenerator(' ' * 4, False) 
     121#    generator.required_functions = func_name 
    123122    generator.visit(node) 
    124123 
     124#    return ''.join(generator.result) 
    125125    return ''.join(generator.c_proc) 
    126126 
     
    138138    """ 
    139139 
    140     def __init__(self, indent_with, add_line_information=False, constants=None): 
     140    def __init__(self, indent_with, add_line_information=False): 
    141141        self.result = [] 
    142142        self.indent_with = indent_with 
     
    160160        self.C_Functions = [] 
    161161        self.C_Vectors = [] 
    162         self.C_Constants = constants 
    163162        self.SubRef = False 
    164163        self.InSubscript = False 
     
    263262                         % arg_name, str(default.n)) 
    264263                self.warnings.append(w_str) 
     264#                self.write_python('=') 
     265#                self.visit(default) 
    265266 
    266267    def decorators(self, node): 
     
    320321        self.visit(node.value) 
    321322        self.add_semi_colon() 
     323#        self.write_c(';') 
    322324        self.add_current_line() 
    323325        for n, item in enumerate(self.Tuples): 
     
    345347        self.visit(node.value) 
    346348        self.add_semi_colon() 
     349#        self.write_c(';') 
    347350        self.add_current_line() 
    348351 
     
    405408            fLine = True 
    406409            start_var += 1 
     410#        if(len(self.C_IntVars) > 0): 
     411#            s = self.listToDeclare(self.C_IntVars) 
     412#            self.c_proc.insert(start_var, "    int " + s + ";\n") 
     413#            fLine = True 
     414#            start_var += 1 
    407415        if(len(self.C_Vectors) > 0): 
    408416            s = self.listToDeclare(self.C_Vectors) 
     
    438446 
    439447    def getMethodSignature(self): 
     448#        args_str = ListToString(self.arguments) 
    440449        args_str = '' 
    441450        for n in range(len(self.arguments)): 
     
    444453                args_str += ", " 
    445454        return(args_str) 
     455#        self.strMethodSignature = 'double ' + self.name + '(' + args_str + ")" 
    446456 
    447457    def InsertSignature(self): 
     
    463473        self.arguments = [] 
    464474        self.name = node.name 
     475#        if self.name not in self.required_functions[0]: 
     476#           return 
    465477        print("Parsing '" + self.name + "'") 
    466478        args_str = "" 
     
    468480        self.visit(node.args) 
    469481        self.getMethodSignature() 
     482# for C 
    470483        self.signature_line = len(self.c_proc) 
     484#        self.add_c_line(self.strMethodSignature) 
    471485        self.add_c_line("\n{") 
    472486        start_vars = len(self.c_proc) + 1 
     
    543557        if(hasattr(node,'value')): 
    544558            line_number = node.value.lineno 
    545         elif hasattr(node, 'iter'): 
    546             if hasattr(node.iter, 'lineno'): 
     559        elif hasattr(node,'iter'): 
     560            if hasattr(node.iter,'lineno'): 
    547561                line_number = node.iter.lineno 
    548562        return(line_number) 
     
    585599# Iterator name is in node.target.id. 
    586600        self.add_current_line() 
     601#        if(len(self.current_statement) > 0): 
     602#            self.add_c_line(self.current_statement) 
     603#            self.current_statement = '' 
    587604        fForDone = False 
    588605        self.current_statement = '' 
     
    684701 
    685702    def visit_Return(self, node): 
    686         self.add_current_line() 
     703        self.newline(node) 
    687704        if node.value is None: 
    688705            self.write_c('return') 
     
    785802            name = node.id 
    786803#       add variable to C_Vars if it ins't there yet, not an argument and not a number 
    787         if ((name not in self.C_Functions) and (name not in self.C_Vars) and \ 
     804        if((name not in self.C_Functions) and (name not in self.C_Vars) and \ 
    788805            (name not in self.C_IntVars) and (name not in self.arguments) and \ 
    789             (name not in self.C_Constants) and (name.isdigit() == False)): 
     806            (name.isdigit() == False)): 
    790807            if(self.InSubscript): 
    791808                self.C_IntVars.append(node.id) 
     
    930947 
    931948    def visit_Subscript(self, node): 
    932         if (node.value.id not in self.C_Constants): 
    933             if(node.value.id not in self.C_Pointers): 
    934                 self.C_Pointers.append(node.value.id) 
     949        if(node.value.id not in self.C_Pointers): 
     950            self.C_Pointers.append(node.value.id) 
    935951        self.SubRef = True 
    936952        self.visit(node.value) 
     
    10321048                self.visit(if_) 
    10331049 
     1050#    def visit_excepthandler(self, node): 
     1051#        self.newline(node) 
     1052#        self.write_python('except') 
     1053#        if node.type is not None: 
     1054#            self.write_python(' ') 
     1055#            self.visit(node.type) 
     1056#            if node.name is not None: 
     1057#                self.write_python(' as ') 
     1058#                self.visit(node.name) 
     1059#        self.body(node.body) 
     1060 
    10341061    def visit_arguments(self, node): 
    10351062        self.signature(node) 
     1063 
     1064def Iq1(q, porod_scale, porod_exp, lorentz_scale, lorentz_length, peak_pos, lorentz_exp=17): 
     1065    z1 = z2 = z = abs(q - peak_pos) * lorentz_length 
     1066    if(q > p): 
     1067        q = p + 17 
     1068        p = q - 5 
     1069    z3 = -8 
     1070    inten = (porod_scale / q ** porod_exp 
     1071                + lorentz_scale /(1 + z ** lorentz_exp)) 
     1072    return inten 
     1073 
     1074def Iq(q, porod_scale, porod_exp, lorentz_scale, lorentz_length, peak_pos, lorentz_exp=17): 
     1075    z1 = z2 = z = abs(q - peak_pos) * lorentz_length 
     1076    if(q > p): 
     1077        q = p + 17 
     1078        p = q - 5 
     1079    elif(q == p): 
     1080        q = p * q 
     1081        q *= z1 
     1082        p = z1 
     1083    elif(q == 17): 
     1084        q = p * q - 17 
     1085    else: 
     1086        q += 7 
     1087    z3 = -8 
     1088    inten = (porod_scale / q ** porod_exp 
     1089                + lorentz_scale /(1 + z ** lorentz_exp)) 
     1090    return inten 
    10361091 
    10371092def print_function(f=None): 
     
    10491104def translate(functions, constants=0): 
    10501105    snippets = [] 
    1051     #snippets.append("#include <math.h>") 
    1052     #snippets.append("") 
    10531106    for source, fname, line_no in functions: 
    1054         line_directive = '#line %d "%s"'%(line_no, fname.replace('\\', '\\\\')) 
     1107        line_directive = '#line %d "%s"'%(line_no, fname.replace('\\','\\\\')) 
    10551108        snippets.append(line_directive) 
    10561109        tree = ast.parse(source) 
    10571110        # in the future add filename, offset, constants 
    1058         c_code = to_source(tree, functions, constants) 
     1111        c_code = to_source(tree, functions) 
    10591112        snippets.append(c_code) 
    10601113    return snippets 
Note: See TracChangeset for help on using the changeset viewer.