Changes in / [510277d:376b0ee] in sasmodels


Ignore:
Location:
sasmodels
Files:
4 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/details.py

    rce99754 r767dca8  
    193193    #print("off:",offset) 
    194194 
    195     # Check that we aren't using too many polydispersity loops 
     195    # Check that we arn't using too many polydispersity loops 
    196196    num_active = np.sum(length > 1) 
    197197    max_pd = model_info.parameters.max_pd 
     
    318318    parameter set in the vector. 
    319319    """ 
    320     _, dispersity, weight = zip(*mesh) 
     320    value, dispersity, weight = zip(*mesh) 
    321321    #weight = [w if len(w)>0 else [1.] for w in weight] 
    322322    weight = np.vstack([v.flatten() for v in meshgrid(*weight)]) 
  • sasmodels/kernel_iq.c

    r6aee3ab r4991048  
    1313// NOTE: the following macros are defined in generate.py: 
    1414// 
    15 //  MAX_PD : the maximum number of dispersity loops allowed for this model, 
    16 //      which will be at most modelinfo.MAX_PD. 
     15//  MAX_PD : the maximum number of dispersity loops allowed 
    1716//  NUM_PARS : the number of parameters in the parameter table 
    1817//  NUM_VALUES : the number of values to skip at the start of the 
     
    283282#endif 
    284283 
    285   // ** Fill in the local values table ** 
    286   // Storage for the current parameter values. 
    287   // These will be updated as we walk the dispersity mesh. 
     284  // Storage for the current parameter values.  These will be updated as we 
     285  // walk the dispersity mesh. 
    288286  ParameterBlock local_values; 
    289   //   values[0] is scale 
    290   //   values[1] is background 
    291   #ifdef USE_OPENMP 
    292   #pragma omp parallel for 
    293   #endif 
    294   for (int i=0; i < NUM_PARS; i++) { 
    295     local_values.vector[i] = values[2+i]; 
    296     //if (q_index==0) printf("p%d = %g\n",i, local_values.vector[i]); 
    297   } 
    298   //if (q_index==0) printf("NUM_VALUES:%d  NUM_PARS:%d  MAX_PD:%d\n", NUM_VALUES, NUM_PARS, MAX_PD); 
    299   //if (q_index==0) printf("start:%d  stop:%d\n", pd_start, pd_stop); 
    300  
    301   // ** Precompute magnatism values ** 
     287 
    302288#if defined(MAGNETIC) && NUM_MAGNETIC>0 
    303289  // Location of the sld parameters in the parameter vector. 
     
    316302#endif // MAGNETIC 
    317303 
    318   // ** Fill in the initial results ** 
     304  // Fill in the initial variables 
     305  //   values[0] is scale 
     306  //   values[1] is background 
     307  #ifdef USE_OPENMP 
     308  #pragma omp parallel for 
     309  #endif 
     310  for (int i=0; i < NUM_PARS; i++) { 
     311    local_values.vector[i] = values[2+i]; 
     312//if (q_index==0) printf("p%d = %g\n",i, local_values.vector[i]); 
     313  } 
     314//if (q_index==0) printf("NUM_VALUES:%d  NUM_PARS:%d  MAX_PD:%d\n", NUM_VALUES, NUM_PARS, MAX_PD); 
     315//if (q_index==0) printf("start:%d  stop:%d\n", pd_start, pd_stop); 
     316 
    319317  // If pd_start is zero that means that we are starting a new calculation, 
    320318  // and must initialize the result to zero.  Otherwise, we are restarting 
     
    338336      for (int q_index=0; q_index < nq; q_index++) result[q_index] = 0.0; 
    339337    } 
    340     //if (q_index==0) printf("start %d %g %g\n", pd_start, pd_norm, result[0]); 
     338//if (q_index==0) printf("start %d %g %g\n", pd_start, pd_norm, result[0]); 
    341339#endif // !USE_OPENCL 
    342340 
     
    392390      PD_OPEN(0,1) 
    393391 
    394       // ... main loop body ... 
    395       APPLY_PROJECTION    // convert jitter values to spherical coords 
    396       BUILD_ROTATION      // construct the rotation matrix qxy => qabc 
    397       for each q 
    398           FETCH_Q         // set qx,qy from the q input vector 
    399           APPLY_ROTATION  // convert qx,qy to qa,qb,qc 
    400           CALL_KERNEL     // scattering = Iqxy(qa, qb, qc, p1, p2, ...) 
     392      ... main loop body ... 
    401393 
    402394      ++step;  // increment counter representing position in dispersity mesh 
     
    420412*/ 
    421413 
    422  
    423 // ** prepare inner loops ** 
    424  
     414// Define looping variables 
     415#define PD_INIT(_LOOP) \ 
     416  const int n##_LOOP = details->pd_length[_LOOP]; \ 
     417  const int p##_LOOP = details->pd_par[_LOOP]; \ 
     418  global const double *v##_LOOP = pd_value + details->pd_offset[_LOOP]; \ 
     419  global const double *w##_LOOP = pd_weight + details->pd_offset[_LOOP]; \ 
     420  int i##_LOOP = (pd_start/details->pd_stride[_LOOP])%n##_LOOP; 
     421 
     422// Jump into the middle of the dispersity loop 
     423#define PD_OPEN(_LOOP,_OUTER) \ 
     424  while (i##_LOOP < n##_LOOP) { \ 
     425    local_values.vector[p##_LOOP] = v##_LOOP[i##_LOOP]; \ 
     426    const double weight##_LOOP = w##_LOOP[i##_LOOP] * weight##_OUTER; 
     427 
     428// create the variable "weight#=1.0" where # is the outermost level+1 (=MAX_PD). 
     429#define _PD_OUTERMOST_WEIGHT(_n) const double weight##_n = 1.0; 
     430#define PD_OUTERMOST_WEIGHT(_n) _PD_OUTERMOST_WEIGHT(_n) 
     431 
     432// Close out the loop 
     433#define PD_CLOSE(_LOOP) \ 
     434    if (step >= pd_stop) break; \ 
     435    ++i##_LOOP; \ 
     436  } \ 
     437  i##_LOOP = 0; 
     438 
     439// The main loop body is essentially: 
     440// 
     441//    BUILD_ROTATION      // construct the rotation matrix qxy => qabc 
     442//    for each q 
     443//        FETCH_Q         // set qx,qy from the q input vector 
     444//        APPLY_ROTATION  // convert qx,qy to qa,qb,qc 
     445//        CALL_KERNEL     // scattering = Iqxy(qa, qb, qc, p1, p2, ...) 
     446// 
    425447// Depending on the shape type (radial, axial, triaxial), the variables 
    426 // and calling parameters in the loop body will be slightly different. 
    427 // Macros capture the differences in one spot so the rest of the code 
    428 // is easier to read. The code below both declares variables for the 
    429 // inner loop and defines the macros that use them. 
     448// and calling parameters will be slightly different.  These macros 
     449// capture the differences in one spot so the rest of the code is easier 
     450// to read. 
    430451 
    431452#if defined(CALL_IQ) 
     
    465486  // psi and dpsi are only for IQ_ABC, so they are processed here. 
    466487  const double psi = values[details->theta_par+4]; 
    467   local_values.table.psi = 0.; 
    468488  #define BUILD_ROTATION() qabc_rotation(&rotation, theta, phi, psi, dtheta, dphi, local_values.table.psi) 
    469489  #define APPLY_ROTATION() qabc_apply(rotation, qx, qy, &qa, &qb, &qc) 
     
    481501  const double theta = values[details->theta_par+2]; 
    482502  const double phi = values[details->theta_par+3]; 
    483   // Make sure jitter angle defaults to zero if there is no jitter distribution 
    484   local_values.table.theta = 0.; 
    485   local_values.table.phi = 0.; 
    486503  // The "jitter" angles (dtheta, dphi, dpsi) are stored with the 
    487504  // dispersity values and copied to the local parameter table as 
     
    506523#endif // !spherosymmetric projection 
    507524 
    508 // ** define looping macros ** 
    509  
    510 // Define looping variables 
    511 #define PD_INIT(_LOOP) \ 
    512   const int n##_LOOP = details->pd_length[_LOOP]; \ 
    513   const int p##_LOOP = details->pd_par[_LOOP]; \ 
    514   global const double *v##_LOOP = pd_value + details->pd_offset[_LOOP]; \ 
    515   global const double *w##_LOOP = pd_weight + details->pd_offset[_LOOP]; \ 
    516   int i##_LOOP = (pd_start/details->pd_stride[_LOOP])%n##_LOOP; 
    517  
    518 // Jump into the middle of the dispersity loop 
    519 #define PD_OPEN(_LOOP,_OUTER) \ 
    520   while (i##_LOOP < n##_LOOP) { \ 
    521     local_values.vector[p##_LOOP] = v##_LOOP[i##_LOOP]; \ 
    522     const double weight##_LOOP = w##_LOOP[i##_LOOP] * weight##_OUTER; 
    523  
    524 // create the variable "weight#=1.0" where # is the outermost level+1 (=MAX_PD). 
    525 #define _PD_OUTERMOST_WEIGHT(_n) const double weight##_n = 1.0; 
    526 #define PD_OUTERMOST_WEIGHT(_n) _PD_OUTERMOST_WEIGHT(_n) 
    527  
    528 // Close out the loop 
    529 #define PD_CLOSE(_LOOP) \ 
    530     if (step >= pd_stop) break; \ 
    531     ++i##_LOOP; \ 
    532   } \ 
    533   i##_LOOP = 0; 
    534525 
    535526// ====== construct the loops ======= 
     
    546537int step = pd_start; 
    547538 
    548 // *** define loops for each of 0, 1, 2, ..., modelinfo.MAX_PD-1 *** 
    549  
    550539// define looping variables 
    551540#if MAX_PD>4 
     
    582571  PD_OPEN(0,1) 
    583572#endif 
     573 
    584574 
    585575//if (q_index==0) {printf("step:%d of %d, pars:",step,pd_stop); for (int i=0; i < NUM_PARS; i++) printf("p%d=%g ",i, local_values.vector[i]); printf("\n");} 
     
    682672#endif // !USE_OPENCL 
    683673 
    684 // ** clear the macros in preparation for the next kernel ** 
     674// clear the macros in preparation for the next kernel 
    685675#undef PD_INIT 
    686676#undef PD_OPEN 
  • sasmodels/modelinfo.py

    r6aee3ab re3571cb  
    3030    TestCondition = Tuple[ParameterSetUser, TestInput, TestValue] 
    3131 
    32 # If MAX_PD changes, need to change the loop macros in kernel_iq.c 
    33 MAX_PD = 5 #: Maximum number of simultaneously polydisperse parameters 
     32MAX_PD = 4 #: Maximum number of simultaneously polydisperse parameters 
    3433 
    3534# assumptions about common parameters exist throughout the code, such as: 
  • sasmodels/product.py

    rce99754 r1f35235  
    101101    model_info.composition = ('product', [p_info, s_info]) 
    102102    model_info.control = p_info.control 
    103     model_info.hidden = p_info.hidden 
    104     if getattr(p_info, 'profile', None) is not None: 
    105         profile_pars = set(p.id for p in p_info.parameters.kernel_parameters) 
    106         def profile(**kwargs): 
    107             # extract the profile args 
    108             kwargs = dict((k, v) for k, v in kwargs.items() if k in profile_pars) 
    109             return p_info.profile(**kwargs) 
    110     else: 
    111         profile = None 
    112     model_info.profile = profile 
    113     model_info.profile_axes = p_info.profile_axes 
    114  
    115103    # TODO: delegate random to p_info, s_info 
    116104    #model_info.random = lambda: {} 
     
    279267    weight = values[nvalues + call_details.num_weights: nvalues + 2*call_details.num_weights] 
    280268    npars = model_info.parameters.npars 
    281     # Note: changed from pairs ([v], [w]) to triples (p, [v], [w]), but the 
    282     # dispersion mesh code doesn't actually care about the nominal parameter 
    283     # value, p, so set it to None. 
    284     pairs = [(None, value[offset:offset+length], weight[offset:offset+length]) 
     269    pairs = [(value[offset:offset+length], weight[offset:offset+length]) 
    285270             for p, offset, length 
    286271             in zip(model_info.parameters.call_parameters[2:2+npars], 
  • sasmodels/sasview_model.py

    r17db833 ra9bc435  
    205205                                           structure_factor._model_info) 
    206206    ConstructedModel = make_model_from_info(model_info) 
    207     return ConstructedModel(form_factor.multiplicity) 
     207    return ConstructedModel(form_factor.multiplicity)     
    208208 
    209209 
     
    673673        #call_details.show() 
    674674        #print("pairs", pairs) 
    675         #for k, p in enumerate(self._model_info.parameters.call_parameters): 
    676         #    print(k, p.name, *pairs[k]) 
    677675        #print("params", self.params) 
    678676        #print("values", values) 
     
    680678        result = calculator(call_details, values, cutoff=self.cutoff, 
    681679                            magnetic=is_magnetic) 
    682         #print("result", result) 
    683680        self._intermediate_results = getattr(calculator, 'results', None) 
    684681        calculator.release() 
     
    764761                return self.multiplicity, [self.multiplicity], [1.0] 
    765762            else: 
    766                 # For hidden parameters use default values.  This sets 
    767                 # scale=1 and background=0 for structure factors 
     763                # For hidden parameters use the default value. 
    768764                default = self._model_info.parameters.defaults.get(par.name, np.NaN) 
    769                 return default, [default], [1.0] 
     765                return [default], [1.0] 
    770766        elif par.polydisperse: 
    771767            value = self.params[par.name] 
     
    780776        else: 
    781777            value = self.params[par.name] 
    782             return value, [value], [1.0] 
     778            return value, [value if par.relative_pd else 0.0], [1.0] 
    783779 
    784780def test_cylinder(): 
     
    798794    Model = _make_standard_model('hardsphere') 
    799795    model = Model() 
    800     value2d = model.evalDistribution([0.1, 0.1]) 
    801     value1d = model.evalDistribution(np.array([0.1*np.sqrt(2)])) 
    802     #print("hardsphere", value1d, value2d) 
    803     if np.isnan(value1d) or np.isnan(value2d): 
    804         raise ValueError("hardsphere returns nan") 
    805  
    806 def test_product(): 
    807     # type: () -> float 
    808     """ 
    809     Test that 2-D hardsphere model runs and doesn't produce NaN. 
    810     """ 
    811     S = _make_standard_model('hayter_msa')() 
    812     P = _make_standard_model('cylinder')() 
    813     model = MultiplicationModel(P, S) 
    814796    value = model.evalDistribution([0.1, 0.1]) 
    815797    if np.isnan(value): 
    816         raise ValueError("cylinder*hatyer_msa returns null") 
     798        raise ValueError("hardsphere returns null") 
    817799 
    818800def test_rpa(): 
     
    868850if __name__ == "__main__": 
    869851    print("cylinder(0.1,0.1)=%g"%test_cylinder()) 
    870     #test_product() 
    871     #test_structure_factor() 
    872     #print("rpa:", test_rpa()) 
    873852    #test_empty_distribution() 
Note: See TracChangeset for help on using the changeset viewer.