View Javadoc

1   /*
2    * Copyright 2006 - 2012 Christina Bohk and Roland Ewald
3    *  
4    * Licensed under the Apache License, Version 2.0 (the "License"); 
5    * you may not use this file except in compliance with the License. 
6    * You may obtain a copy of the License at 
7    *  
8    *  http://www.apache.org/licenses/LICENSE-2.0
9    *  
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
13   * See the License for the specific language governing permissions and 
14   * limitations under the License. 
15   */
16  package p3j.pppm.parameters;
17  
18  import static p3j.pppm.parameters.ParameterType.FERTILITY;
19  import static p3j.pppm.parameters.ParameterType.JUMP_OFF;
20  import static p3j.pppm.parameters.ParameterType.MIGRATION;
21  import static p3j.pppm.parameters.ParameterType.MORTALITY;
22  import static p3j.pppm.parameters.ParameterType.PROP_INF_DEATHS_FIRST_6M;
23  import static p3j.pppm.parameters.ParameterType.PROP_MALE_LIVE_BIRTHS;
24  import static p3j.pppm.parameters.ParameterType.SURV_PROB_OPEN_END;
25  
26  import java.util.ArrayList;
27  import java.util.List;
28  
29  import org.jamesii.SimSystem;
30  
31  import p3j.database.DatabaseFactory;
32  import p3j.database.IP3MDatabase;
33  import p3j.misc.MatrixDimension;
34  import p3j.pppm.ProjectionModel;
35  import p3j.pppm.SubPopulation;
36  import p3j.pppm.SubPopulationModel;
37  
38  /**
39   * Specifies the {@link Parameter} definitions necessary for a
40   * {@link ProjectionModel} with a certain {@link SubPopulationModel}.
41   * 
42   * Created on August 7, 2006
43   * 
44   * @author Christina Bohk
45   * @author Roland Ewald
46   */
47  public class Parameters {
48  
49    /** List with all parameters. */
50    private final List<Parameter> params = new ArrayList<>();
51  
52    /**
53     * The counter for the sorting indices. See
54     * {@link Parameter#getSortingIndex()} etc.
55     */
56    private int sortIndexCounter = 0;
57  
58    /**
59     * Creates parameters for a given sub-population model.
60     * 
61     * @param subPopModel
62     *          the underlying sub-population model
63     */
64    public Parameters(SubPopulationModel subPopModel) {
65  
66      IP3MDatabase db = DatabaseFactory.getDatabaseSingleton();
67  
68      List<Parameter> paramsToRegister = createParamsForModel(subPopModel);
69  
70      // Set IDs
71      for (Parameter p : paramsToRegister) {
72        Parameter registeredParameter = null;
73        try {
74          registeredParameter = db.newParameter(p.getName(), p.getSortingIndex(),
75              p.isGenerationDependent(), p.getValueHeight(), p.getValueWidth(),
76              p.getPopulation());
77        } catch (Exception ex) {
78          SimSystem.report(ex);
79        }
80        if (registeredParameter == null)
81          throw new IllegalStateException("Could not register parameter: " + p);
82        params.add(registeredParameter);
83      }
84    }
85  
86    private List<Parameter> createParamsForModel(SubPopulationModel subPopModel) {
87      List<Parameter> parameters = new ArrayList<>();
88      for (SubPopulation subPop : subPopModel.getSubPopulations()) {
89        parameters.addAll(createParamsForSubPop(subPop));
90      }
91      return parameters;
92    }
93  
94    private List<Parameter> createParamsForSubPop(SubPopulation subPop) {
95      List<Parameter> parameters = new ArrayList<>();
96  
97      if (subPop.isJumpOffPopulation()) {
98        addMaleFemaleParameters(parameters, JUMP_OFF, subPop, false,
99            MatrixDimension.AGES, MatrixDimension.SINGLE);
100     } else {
101       addMaleFemaleParameters(parameters, MIGRATION, subPop, false,
102           MatrixDimension.AGES, MatrixDimension.YEARS);
103     }
104 
105     addMaleFemaleParameters(parameters, SURV_PROB_OPEN_END, subPop,
106         MatrixDimension.SINGLE, MatrixDimension.YEARS);
107 
108     addMaleFemaleParameters(parameters, PROP_INF_DEATHS_FIRST_6M, subPop,
109         MatrixDimension.SINGLE, MatrixDimension.YEARS);
110 
111     addParameter(parameters, PROP_MALE_LIVE_BIRTHS.getLabelFor(subPop),
112         subPop.isConsistingOfDescendantGenerations(), MatrixDimension.SINGLE,
113         MatrixDimension.YEARS);
114 
115     addMaleFemaleParameters(parameters, MORTALITY, subPop,
116         MatrixDimension.AGES, MatrixDimension.YEARS);
117 
118     addParameter(parameters, FERTILITY.getLabelFor(subPop),
119         subPop.isConsistingOfDescendantGenerations(), MatrixDimension.AGES,
120         MatrixDimension.YEARS);
121 
122     return parameters;
123   }
124 
125   private void addMaleFemaleParameters(List<Parameter> parameters,
126       ParameterType paramType, SubPopulation subPopulation,
127       MatrixDimension first, MatrixDimension second) {
128     addMaleFemaleParameters(parameters, paramType, subPopulation,
129         subPopulation.isConsistingOfDescendantGenerations(), first, second);
130   }
131 
132   private void addMaleFemaleParameters(List<Parameter> parameters,
133       ParameterType paramType, SubPopulation subPopulation,
134       boolean genDependent, MatrixDimension first, MatrixDimension second) {
135     addParameter(parameters, paramType.getMaleLabelFor(subPopulation),
136         genDependent, first, second);
137     addParameter(parameters, paramType.getFemaleLabelFor(subPopulation),
138         genDependent, first, second);
139   }
140 
141   private void addParameter(List<Parameter> parameters, String paramName,
142       boolean genDependent, MatrixDimension first, MatrixDimension second) {
143     parameters.add(new Parameter(nextSortingIndex(), genDependent, paramName,
144         first, second, Population.CUSTOM));
145   }
146 
147   /**
148    * Creates next sorting index.
149    * 
150    * @return the next sorting index to be used
151    */
152   private int nextSortingIndex() {
153     return ++sortIndexCounter;
154   }
155 
156   public List<Parameter> getParams() {
157     return params;
158   }
159 
160 }