Changeset 36948c92 in sasview for sansmodels


Ignore:
Timestamp:
Apr 15, 2008 8:08:40 AM (17 years ago)
Author:
Mathieu Doucet <doucetm@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
3de85b8
Parents:
5aa3bbd
Message:

Modified to testing and modified according to testing results

Location:
sansmodels/src/sans/models
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • sansmodels/src/sans/models/FractalModel.py

    rf629e346 r36948c92  
    4949        ## Parameter details [units, min, max] 
    5050        self.details = {} 
    51         self.details['scale']       = ['', None, None] 
    52         self.details['radius']      = ['A', None, None] 
    53         self.details['fractal_dim'] = ['', None, None] 
    54         self.details['corr_length'] = ['A', None, None] 
    55         self.details['block_sld']   = ['A-2', None, None] 
    56         self.details['solvent_sld'] = ['A-2', None, None] 
     51        self.details['scale']       = ['',     None, None] 
     52        self.details['radius']      = ['A',    None, None] 
     53        self.details['fractal_dim'] = ['',       0, None] 
     54        self.details['corr_length'] = ['A',    None, None] 
     55        self.details['block_sld']   = ['A-2',  None, None] 
     56        self.details['solvent_sld'] = ['A-2',  None, None] 
    5757        self.details['background']  = ['cm-1', None, None] 
    5858        
     
    6363            F(x) = p(x) * s(x) + bkd   
    6464        """ 
     65        if x<0 and self.params['fractal_dim']>0: 
     66            raise ValueError, "negative number cannot be raised to a fractional power" 
     67 
    6568        return self.params['background']+ self._scatterRanDom(x)* self._Block(x) 
     69 
    6670     
    6771    def _Block(self,x): 
    68          
    69          
    70          
    7172        return 1.0 + (math.sin((self.params['fractal_dim']-1.0) * math.atan(x * self.params['corr_length']))\ 
    7273             * self.params['fractal_dim'] * gamma(self.params['fractal_dim']-1.0))\ 
     
    9697        """ 
    9798        if x.__class__.__name__ == 'list': 
    98             return self._Fractal(x[0]*math.cos(x[1]))*self._Fractal(x[0]*math.sin(x[1])) 
     99            # Take absolute value of Q, since this model is really meant to 
     100            # be defined in 1D for a given length of Q 
     101            qx = math.fabs(x[0]*math.cos(x[1])) 
     102            qy = math.fabs(x[0]*math.sin(x[1])) 
     103             
     104            return self._Fractal(qx)*self._Fractal(qy) 
    99105        elif x.__class__.__name__ == 'tuple': 
    100106            raise ValueError, "Tuples are not allowed as input to BaseComponent models" 
  • sansmodels/src/sans/models/PorodModel.py

    r3db3895 r36948c92  
    2626        ## Define parameters 
    2727        self.params = {} 
    28         self.params['scale'] = 0.0 
     28        self.params['scale'] = 1.0 
     29        self.params['background'] = 0.0 
    2930         
    3031 
    3132        ## Parameter details [units, min, max] 
    3233        self.details = {} 
    33         self.details['scale'] = ['', None, None] 
     34        self.details['scale']      = ['', None, None] 
     35        self.details['background'] = ['', None, None] 
    3436       
    3537                
    3638    def _porod(self, x): 
    37         return self.params['scale']/x**4.0 
     39        return self.params['scale']/x**4.0 + self.params['background'] 
    3840    
    3941    def run(self, x = 0.0): 
  • sansmodels/src/sans/models/PowerLawModel.py

    r3db3895 r36948c92  
    3838        ## Parameter details [units, min, max] 
    3939        self.details = {} 
    40         self.details['m']           = ['', None, None ] 
     40        self.details['m']           = ['', 0,    None] 
    4141        self.details['scale']       = ['', None, None] 
    4242        self.details['background']  = ['', None, None] 
     
    4747            
    4848        """ 
    49         return self.params['scale']*math.pow(x ,-self.params['m'])\ 
     49        if x<0 and self.params['m']>0: 
     50            raise ValueError, "negative number cannot be raised to a fractional power" 
     51         
     52        return self.params['scale']*math.pow(x ,-1.0*self.params['m'])\ 
    5053                + self.params['background'] 
    5154        
    52     
    5355    def run(self, x = 0.0): 
    5456        """ Evaluate the model 
     
    5759        """ 
    5860        if x.__class__.__name__ == 'list': 
    59             return self._PowerLaw(x[0]*math.cos(x[1]))*self._PowerLaw(x[0]*math.sin(x[1])) 
     61            # Take absolute value of Q, since this model is really meant to 
     62            # be defined in 1D for a given length of Q 
     63            qx = math.fabs(x[0]*math.cos(x[1])) 
     64            qy = math.fabs(x[0]*math.sin(x[1])) 
     65            return self._PowerLaw(qx)*self._PowerLaw(qy) 
    6066        elif x.__class__.__name__ == 'tuple': 
    6167            raise ValueError, "Tuples are not allowed as input to BaseComponent models" 
  • sansmodels/src/sans/models/test/testcase_generator.py

    rae3ce4e r36948c92  
    344344         
    345345        if not self.passed: 
     346            print "\nFailure:" 
    346347            print report.trace 
    347348        return self.passed 
     
    353354        @return: True if passed, False otherwise 
    354355    """ 
    355     minval = 0 
    356     maxval = 20 
     356    minval = 0.001 
     357    maxval = 1.0 
    357358    # Call run with random input 
    358359    import random, math 
     
    368369            output = model.run([input_value, 2*math.pi*random.random()])             
    369370    except ZeroDivisionError: 
    370         output = -1 
     371        print "Error evaluating model %s: %g" % (model.name, input_value) 
     372        output = None 
    371373         
    372374    #print "Eval: %g" % output 
     
    374376    # Oracle bit - just check that we have a number... 
    375377    passed = False 
    376     if math.fabs(output) >= 0:  
    377         passed = True 
     378    try: 
     379        if output != None and math.fabs(output) >= 0:  
     380            passed = True 
     381    except: 
     382        print "---> Could not compute abs val", output, model.name 
     383         
    378384     
    379385    report = ReportCard() 
     
    382388        report.n_eval_pass = 1 
    383389    else: 
    384         report.log = "Eval: bad output value %g\n" % output 
    385          
    386     report.trace = "Eval(%g) = %g %i\n" % (input_value, output, passed)     
     390        report.log = "Eval: bad output value %s\n" % str(output) 
     391         
     392    report.trace = "Eval(%g) = %s %i\n" % (input_value, str(output), passed)     
    387393    return model, report 
    388394 
     
    395401    import random, math 
    396402    minval = 1 
    397     maxval = 50 
     403    maxval = 5 
    398404     
    399405    # Choose a parameter to change 
     
    407413    p_name  = keys[i_param] 
    408414     
    409     # Chose a value 
     415    # Choose a value 
     416    # Check for min/max 
     417    if hasattr(model, "details"): 
     418        if model.details.has_key(p_name): 
     419            if model.details[p_name][1] != None: 
     420                minval = model.details[p_name][1] 
     421            if model.details[p_name][2] != None: 
     422                maxval = model.details[p_name][2] 
     423        elif model.other.details.has_key(p_name): 
     424            if model.other.details[p_name][1] != None: 
     425                minval = model.other.details[p_name][1] 
     426            if model.other.details[p_name][2] != None: 
     427                maxval = model.other.details[p_name][2] 
     428        elif model.operateOn.details.has_key(p_name): 
     429            if model.operateOn.details[p_name][1] != None: 
     430                minval = model.operateOn.details[p_name][1] 
     431            if model.operateOn.details[p_name][2] != None: 
     432                maxval = model.operateOn.details[p_name][2] 
     433             
    410434    input_val = random.random()*(maxval-minval)+minval 
    411435    model.setParam(p_name, input_val) 
     
    613637     
    614638    try: 
    615         value2 = tmp.run(1) 
     639        value2 = tmp.run(1.1 * (1.0 + random())) 
    616640        value2 = float(value2) 
    617641    except: 
     642        value2 = None 
    618643        passed = False 
    619644     
     
    628653        report.log = "Sub: bad output from composite model\n" 
    629654 
    630     report.trace = "Sub %s (%g - %g = %g) %i\n" % \ 
     655    report.trace = "Sub %s (%g - %g = %s) %i\n" % \ 
    631656        (model.name, model.run(1), \ 
    632          sub_model.run(1), value2, passed)                 
     657         sub_model.run(1), str(value2), passed)                 
    633658    return tmp, report 
    634659 
     
    647672    # Oracle bit 
    648673    passed = False 
    649  
     674     
     675    from random import random 
     676    input_val = 1.1 * (1.0 + random()) 
     677    v1 = None 
     678    v2 = None 
    650679    try: 
    651         value2 = tmp.run(1) 
     680        v1 = mul_model.run(input_val) 
     681        v2 = model.run(input_val) 
     682        value2 = tmp.run(input_val) 
    652683        value2 = float(value2) 
    653     except: 
    654         passed = False 
     684    except ZeroDivisionError: 
     685        value2 = None 
    655686     
    656687    # If we made it this far, we have a float 
     
    664695        report.log = "Mul: bad output from composite model\n" 
    665696         
    666     report.trace = "Mul %s (%g * %g = %g) %i\n" % \ 
    667       (model.name, model.run(1), \ 
    668        mul_model.run(1), value2, passed)                 
     697    report.trace = "Mul %s (%s * %s = %s) %i\n" % \ 
     698      (model.name, str(v1), str(v2), str(value2), passed)                 
    669699    return tmp, report 
    670700 
     
    678708    #div_model = factory.getModel("SphereModel") 
    679709    #div_model = factory.getModel(randomModel()) 
    680     div_model = getRandomModelObject() 
    681      
     710 
     711    from random import random 
     712    input_val = 1.5 * random() 
     713     
     714    # Find a model that will not evaluate to zero 
     715    # at the input value 
     716    try_again = True 
     717    while try_again: 
     718        div_model = getRandomModelObject() 
     719        try: 
     720            v2 = div_model.run(input_val) 
     721            try_again = False 
     722        except: 
     723            pass 
     724         
    682725    tmp = model / div_model 
    683726     
     
    685728    passed = False 
    686729     
     730    v1 = None 
     731    v2 = None 
    687732    try: 
    688         from random import random 
    689         input_val = 1.5 * random() 
    690         if div_model.run(input_val)==0: 
    691             print "Skipped (DIV) because denominator evaluated to zero" 
    692         else: 
     733         
     734        # Check individual models against bad combinations, 
     735        # which happen from time to time given that all  
     736        # parameters are random 
     737        try: 
     738            v2 = div_model.run(input_val) 
     739            v1 = model.run(input_val) 
    693740            value2 = tmp.run(input_val) 
    694741            value2 = float(value2) 
     742        except ZeroDivisionError: 
     743            value2 = None 
    695744    except: 
    696745        passed = False 
     
    706755        report.log = "Div: bad output from composite model\n" 
    707756         
    708     report.trace = "Div %s (%g / %g = %g) %i\n" % \ 
    709         (model.name, model.run(1), \ 
    710          div_model.run(1), value2, passed)                 
     757    report.trace = "Div %s/%s (%g) = %s / %s = %s %i\n" % \ 
     758      (model.name, div_model.name, input_val, str(v1), str(v2), str(value2), passed)                 
    711759    return tmp, report 
    712760 
     
    715763    #print randomModel() 
    716764    g = TestCaseGenerator() 
    717     g.generateAndRun(2000) 
     765    g.generateAndRun(20000) 
    718766     
    719767    #t = TestCase(filename = "error_1.17721e+009.xml") 
Note: See TracChangeset for help on using the changeset viewer.