Skip to content

Commit

Permalink
InvestmentAllocation: finish importer
Browse files Browse the repository at this point in the history
  • Loading branch information
ge0ffrey committed May 29, 2015
1 parent c5be03d commit 83342a0
Show file tree
Hide file tree
Showing 3 changed files with 247 additions and 41 deletions.
234 changes: 208 additions & 26 deletions optaplanner-examples/data/investmentallocation/unsolved/irrinki_1.xml
Expand Up @@ -6,36 +6,218 @@
<name>UK Equities</name> <name>UK Equities</name>
<expectedReturnNanos>100000000</expectedReturnNanos> <expectedReturnNanos>100000000</expectedReturnNanos>
<standardDeviationRiskNanos>150000000</standardDeviationRiskNanos> <standardDeviationRiskNanos>150000000</standardDeviationRiskNanos>
<correlationNanosMap class="linked-hash-map" id="4">
<entry>
<IaAssetClass reference="3"/>
<long>1000000000</long>
</entry>
<entry>
<IaAssetClass id="5">
<id>2</id>
<name>Ex-UK Equities</name>
<expectedReturnNanos>80000000</expectedReturnNanos>
<standardDeviationRiskNanos>120000000</standardDeviationRiskNanos>
<correlationNanosMap class="linked-hash-map" id="6">
<entry>
<IaAssetClass reference="3"/>
<long>760000000</long>
</entry>
<entry>
<IaAssetClass reference="5"/>
<long>1000000000</long>
</entry>
<entry>
<IaAssetClass id="7">
<id>3</id>
<name>Intermediate Bond</name>
<expectedReturnNanos>40000000</expectedReturnNanos>
<standardDeviationRiskNanos>70000000</standardDeviationRiskNanos>
<correlationNanosMap class="linked-hash-map" id="8">
<entry>
<IaAssetClass reference="3"/>
<long>350000000</long>
</entry>
<entry>
<IaAssetClass reference="5"/>
<long>40000000</long>
</entry>
<entry>
<IaAssetClass reference="7"/>
<long>1000000000</long>
</entry>
<entry>
<IaAssetClass id="9">
<id>4</id>
<name>Long-Term Bonds</name>
<expectedReturnNanos>45000000</expectedReturnNanos>
<standardDeviationRiskNanos>80000000</standardDeviationRiskNanos>
<correlationNanosMap class="linked-hash-map" id="10">
<entry>
<IaAssetClass reference="3"/>
<long>500000000</long>
</entry>
<entry>
<IaAssetClass reference="5"/>
<long>300000000</long>
</entry>
<entry>
<IaAssetClass reference="7"/>
<long>870000000</long>
</entry>
<entry>
<IaAssetClass reference="9"/>
<long>1000000000</long>
</entry>
<entry>
<IaAssetClass id="11">
<id>5</id>
<name>Intermediate Bond</name>
<expectedReturnNanos>50000000</expectedReturnNanos>
<standardDeviationRiskNanos>90000000</standardDeviationRiskNanos>
<correlationNanosMap class="linked-hash-map" id="12">
<entry>
<IaAssetClass reference="3"/>
<long>240000000</long>
</entry>
<entry>
<IaAssetClass reference="5"/>
<long>360000000</long>
</entry>
<entry>
<IaAssetClass reference="7"/>
<long>620000000</long>
</entry>
<entry>
<IaAssetClass reference="9"/>
<long>520000000</long>
</entry>
<entry>
<IaAssetClass reference="11"/>
<long>1000000000</long>
</entry>
<entry>
<IaAssetClass id="13">
<id>6</id>
<name>Real Estate</name>
<expectedReturnNanos>70000000</expectedReturnNanos>
<standardDeviationRiskNanos>100000000</standardDeviationRiskNanos>
<correlationNanosMap class="linked-hash-map" id="14">
<entry>
<IaAssetClass reference="3"/>
<long>300000000</long>
</entry>
<entry>
<IaAssetClass reference="5"/>
<long>250000000</long>
</entry>
<entry>
<IaAssetClass reference="7"/>
<long>-50000000</long>
</entry>
<entry>
<IaAssetClass reference="9"/>
<long>-20000000</long>
</entry>
<entry>
<IaAssetClass reference="11"/>
<long>200000000</long>
</entry>
<entry>
<IaAssetClass reference="13"/>
<long>1000000000</long>
</entry>
</correlationNanosMap>
</IaAssetClass>
<long>200000000</long>
</entry>
</correlationNanosMap>
</IaAssetClass>
<long>520000000</long>
</entry>
<entry>
<IaAssetClass reference="13"/>
<long>-20000000</long>
</entry>
</correlationNanosMap>
</IaAssetClass>
<long>870000000</long>
</entry>
<entry>
<IaAssetClass reference="11"/>
<long>620000000</long>
</entry>
<entry>
<IaAssetClass reference="13"/>
<long>-50000000</long>
</entry>
</correlationNanosMap>
</IaAssetClass>
<long>40000000</long>
</entry>
<entry>
<IaAssetClass reference="9"/>
<long>300000000</long>
</entry>
<entry>
<IaAssetClass reference="11"/>
<long>360000000</long>
</entry>
<entry>
<IaAssetClass reference="13"/>
<long>250000000</long>
</entry>
</correlationNanosMap>
</IaAssetClass>
<long>760000000</long>
</entry>
<entry>
<IaAssetClass reference="7"/>
<long>350000000</long>
</entry>
<entry>
<IaAssetClass reference="9"/>
<long>500000000</long>
</entry>
<entry>
<IaAssetClass reference="11"/>
<long>240000000</long>
</entry>
<entry>
<IaAssetClass reference="13"/>
<long>300000000</long>
</entry>
</correlationNanosMap>
</IaAssetClass> </IaAssetClass>
<IaAssetClass id="4"> <IaAssetClass reference="5"/>
<IaAssetClass reference="7"/>
<IaAssetClass reference="9"/>
<IaAssetClass reference="11"/>
<IaAssetClass reference="13"/>
</assetClassList>
<assetClassAllocationList id="15">
<IaAssetClassAllocation id="16">
<id>1</id>
<assetClass reference="3"/>
</IaAssetClassAllocation>
<IaAssetClassAllocation id="17">
<id>2</id> <id>2</id>
<name>Ex-UK Equities</name> <assetClass reference="5"/>
<expectedReturnNanos>80000000</expectedReturnNanos> </IaAssetClassAllocation>
<standardDeviationRiskNanos>120000000</standardDeviationRiskNanos> <IaAssetClassAllocation id="18">
</IaAssetClass>
<IaAssetClass id="5">
<id>3</id> <id>3</id>
<name>Intermediate Bond</name> <assetClass reference="7"/>
<expectedReturnNanos>40000000</expectedReturnNanos> </IaAssetClassAllocation>
<standardDeviationRiskNanos>70000000</standardDeviationRiskNanos> <IaAssetClassAllocation id="19">
</IaAssetClass>
<IaAssetClass id="6">
<id>4</id> <id>4</id>
<name>Long-Term Bonds</name> <assetClass reference="9"/>
<expectedReturnNanos>45000000</expectedReturnNanos> </IaAssetClassAllocation>
<standardDeviationRiskNanos>80000000</standardDeviationRiskNanos> <IaAssetClassAllocation id="20">
</IaAssetClass>
<IaAssetClass id="7">
<id>5</id> <id>5</id>
<name>Intermediate Bond</name> <assetClass reference="11"/>
<expectedReturnNanos>50000000</expectedReturnNanos> </IaAssetClassAllocation>
<standardDeviationRiskNanos>90000000</standardDeviationRiskNanos> <IaAssetClassAllocation id="21">
</IaAssetClass>
<IaAssetClass id="8">
<id>6</id> <id>6</id>
<name>Real Estate</name> <assetClass reference="13"/>
<expectedReturnNanos>70000000</expectedReturnNanos> </IaAssetClassAllocation>
<standardDeviationRiskNanos>100000000</standardDeviationRiskNanos> </assetClassAllocationList>
</IaAssetClass>
</assetClassList>
</IaInvestmentAllocationSolution> </IaInvestmentAllocationSolution>
Expand Up @@ -29,7 +29,7 @@ public class AssetClass extends AbstractPersistable {
private long expectedReturnNanos; // In nano's (so multiplied by 10^9) private long expectedReturnNanos; // In nano's (so multiplied by 10^9)
private long standardDeviationRiskNanos; // In nano's (so multiplied by 10^9) private long standardDeviationRiskNanos; // In nano's (so multiplied by 10^9)


private Map<AssetClass, Integer> correlationNanosMap; private Map<AssetClass, Long> correlationNanosMap;


public String getName() { public String getName() {
return name; return name;
Expand All @@ -55,11 +55,11 @@ public void setStandardDeviationRiskNanos(long standardDeviationRiskNanos) {
this.standardDeviationRiskNanos = standardDeviationRiskNanos; this.standardDeviationRiskNanos = standardDeviationRiskNanos;
} }


public Map<AssetClass, Integer> getCorrelationNanosMap() { public Map<AssetClass, Long> getCorrelationNanosMap() {
return correlationNanosMap; return correlationNanosMap;
} }


public void setCorrelationNanosMap(Map<AssetClass, Integer> correlationNanosMap) { public void setCorrelationNanosMap(Map<AssetClass, Long> correlationNanosMap) {
this.correlationNanosMap = correlationNanosMap; this.correlationNanosMap = correlationNanosMap;
} }


Expand Down
Expand Up @@ -33,6 +33,7 @@
import org.optaplanner.core.api.domain.solution.Solution; import org.optaplanner.core.api.domain.solution.Solution;
import org.optaplanner.examples.common.persistence.AbstractTxtSolutionImporter; import org.optaplanner.examples.common.persistence.AbstractTxtSolutionImporter;
import org.optaplanner.examples.investmentallocation.domain.AssetClass; import org.optaplanner.examples.investmentallocation.domain.AssetClass;
import org.optaplanner.examples.investmentallocation.domain.AssetClassAllocation;
import org.optaplanner.examples.investmentallocation.domain.InvestmentAllocationSolution; import org.optaplanner.examples.investmentallocation.domain.InvestmentAllocationSolution;


public class InvestmentAllocationImporter extends AbstractTxtSolutionImporter { public class InvestmentAllocationImporter extends AbstractTxtSolutionImporter {
Expand Down Expand Up @@ -62,6 +63,7 @@ public Solution readSolution() throws IOException {
solution = new InvestmentAllocationSolution(); solution = new InvestmentAllocationSolution();
solution.setId(0L); solution.setId(0L);
readAssetClassList(); readAssetClassList();
createAssetClassAllocationList();


logger.info("InvestmentAllocation {} has {} asset classes.", logger.info("InvestmentAllocation {} has {} asset classes.",
getInputId(), solution.getAssetClassList().size()); getInputId(), solution.getAssetClassList().size());
Expand All @@ -78,28 +80,50 @@ private void readAssetClassList() throws IOException {
throw new IllegalArgumentException("Read line (" + headerLine + ") is expected to be a constant regex (" throw new IllegalArgumentException("Read line (" + headerLine + ") is expected to be a constant regex ("
+ headerRegex + ")."); + headerRegex + ").");
} }
int assetClassListSize = headerTokens.length - 4; final int ASSET_CLASS_PROPERTIES_COUNT = 4;
int assetClassListSize = headerTokens.length - ASSET_CLASS_PROPERTIES_COUNT;
List<AssetClass> assetClassList = new ArrayList<AssetClass>(assetClassListSize); List<AssetClass> assetClassList = new ArrayList<AssetClass>(assetClassListSize);
Map<Long, AssetClass> idToAssetClassMap = new HashMap<Long, AssetClass>(assetClassListSize); Map<Long, AssetClass> idToAssetClassMap = new HashMap<Long, AssetClass>(assetClassListSize);
for (String line = bufferedReader.readLine(); line != null; line = bufferedReader.readLine()) { for (int i = 0; i < assetClassListSize; i++) {
String[] tokens = splitBySemicolonSeparatedValue(line, 4 + assetClassListSize);
AssetClass assetClass = new AssetClass(); AssetClass assetClass = new AssetClass();
assetClass.setId(Long.parseLong(tokens[0])); assetClass.setId(Long.parseLong(headerTokens[ASSET_CLASS_PROPERTIES_COUNT + i]));
assetClass.setName(tokens[1]);
assetClass.setExpectedReturnNanos(parsePercentageNanos(tokens[2]));
assetClass.setStandardDeviationRiskNanos(parsePercentageNanos(tokens[3]));

assetClassList.add(assetClass); assetClassList.add(assetClass);
idToAssetClassMap.put(assetClass.getId(), assetClass); idToAssetClassMap.put(assetClass.getId(), assetClass);
} }
if (assetClassList.size() != assetClassListSize) { for (String line = bufferedReader.readLine(); line != null; line = bufferedReader.readLine()) {
throw new IllegalStateException("The assetClassList size (" + assetClassList.size() String[] tokens = splitBySemicolonSeparatedValue(line, ASSET_CLASS_PROPERTIES_COUNT + assetClassListSize);
+ ") is expected to be the same as the header's assetClassListSize (" long id = Long.parseLong(tokens[0]);
+ assetClassListSize + ")"); AssetClass assetClass = idToAssetClassMap.get(id);
if (assetClass == null) {
throw new IllegalStateException("The assetClass line (" + line
+ ") has an assetClass id (" + id + ") that is not in the headerLine (" + headerLine + ")");
}
assetClass.setName(tokens[1]);
assetClass.setExpectedReturnNanos(parsePercentageNanos(tokens[2]));
assetClass.setStandardDeviationRiskNanos(parsePercentageNanos(tokens[3]));
Map<AssetClass, Long> correlationNanosMap = new LinkedHashMap<AssetClass, Long>(assetClassListSize);
for (int i = 0; i < assetClassListSize; i++) {
AssetClass other = assetClassList.get(i);
long correlationNanos = parsePercentageNanos(tokens[ASSET_CLASS_PROPERTIES_COUNT + i]);
correlationNanosMap.put(other, correlationNanos);
}
assetClass.setCorrelationNanosMap(correlationNanosMap);
} }
solution.setAssetClassList(assetClassList); solution.setAssetClassList(assetClassList);
} }


private void createAssetClassAllocationList() {
List<AssetClass> assetClassList = solution.getAssetClassList();
List<AssetClassAllocation> assetClassAllocationList = new ArrayList<AssetClassAllocation>(assetClassList.size());
for (AssetClass assetClass : assetClassList) {
AssetClassAllocation allocation = new AssetClassAllocation();
allocation.setId(assetClass.getId());
allocation.setAssetClass(assetClass);
assetClassAllocationList.add(allocation);
}
solution.setAssetClassAllocationList(assetClassAllocationList);
}

protected long parsePercentageNanos(String token) { protected long parsePercentageNanos(String token) {
BigDecimal nanos; BigDecimal nanos;
if (token.endsWith("%")) { if (token.endsWith("%")) {
Expand Down

0 comments on commit 83342a0

Please sign in to comment.