Code Samples - Using VDL to Create Custom Views
This appendix contains code samples relevant to the Using VDL to Create Custom Views chapter.
Start of chapter
The following files constitute an app to which modifications are applied as the chapter unfolds. They correspond to the state of the app at the end of the
Getting Started chapter, but without the Tableau view, which is not easily presented as source code. If you are using Xpress Workbench, organize and assemble them according to the following folder structure:
Folder Structure for this Chapter's Example
foliodata.vdl
<vdl version="4.1">
<vdl-page>
<vdl-section heading="Welcome to Portfolio Optimization"
heading-level="1">
<vdl-section heading="Return per share"
heading-level="2">
<vdl-form>
<vdl-field entity="changeShare"
options-set="SHARES"
label="Choose share">
</vdl-field>
<vdl-field entity="RET"
indices="=scenario.entities.changeShare.value"
label="Estimated ROI">
<vdl-validate pass="=value >= 0">ROI must be zero or greater.
</vdl-validate>
<vdl-tooltip title="Estimated ROI"
content="Specify the expected percentage return on investment">
</vdl-field>
</vdl-form>
<vdl-execute-button caption="Run scenario"></vdl-execute-button>
</vdl-section>
<vdl-section heading="Optimal result" heading-level="2">
<span vdl-text="Calculated optimal return: "></span>
<span vdl-text="=insight.Formatter.formatNumber(scenario.entities.Return.value, '.##')">
</span>
</vdl-section>
<vdl-section heading="Recommended share allocations"
heading-level="3">
<vdl-table page-mode="paged" page-size="5"
show-filter="true"
column-filter="true">
<vdl-table-column entity="frac"></vdl-table-column>
<vdl-table-column entity="RET"></vdl-table-column>
</vdl-table>
</vdl-section>
</vdl-section>
</vdl-page>
</vdl>
folio.dat
! Data file for `folio*.mos'
RET: [("treasury") 5 ("hardware") 17 ("theater") 26 ("telecom") 12
("brewery") 8 ("highways") 9 ("cars") 7 ("bank") 6
("software") 31 ("electronics") 21 ]
DEV: [("treasury") 0.1 ("hardware") 19 ("theater") 28 ("telecom") 22
("brewery") 4 ("highways") 3.5 ("cars") 5 ("bank") 0.5
("software") 25 ("electronics") 16 ]
NAMES: ["treasury" "hardware" "theater" "telecom" "brewery" "highways" "cars" "bank" "software" "electronics"]
COUNTRY: ["Canada" "USA" "USA" "USA" "UK" "France" "Germany" "Luxemburg" "India" "Japan"]
RISK: ["hardware" "theater" "telecom" "software" "electronics"]
NA: ["treasury" "hardware" "theater" "telecom"]
caution.txt
cautionText:"** Text to be replaced **"
foliodata.mos
model "Portfolio optimization with LP"
uses "mminsight" ! For Xpress Insight
uses "mmxprs" ! Use Xpress-Optimizer
parameters
DATAFILE= "folio.dat" ! File with problem data
OUTFILE= "result.dat" ! Output file
MAXRISK = 1/3 ! Max. investment into high-risk values
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
end-parameters
declarations
!@insight.manage input
!@insight.alias Set of all shares
SHARES: set of string ! Set of shares
!@insight.manage input
!@insight.alias Set of high risk shares
RISK: set of string ! Set of high-risk values among shares
!@insight.manage input
!@insight.alias Set of all North American shares
NA: set of string ! Set of shares issued in N.-America
!@insight.manage input
!@insight.alias ROI
RET: array(SHARES) of real ! Estimated return in investment
changeShare: string
end-declarations
forward procedure datainput
case insightgetmode of
INSIGHT_MODE_LOAD: do
datainput
exit(0)
end-do
INSIGHT_MODE_RUN:
insightpopulate
else
datainput
end-case
procedure datainput
initializations from DATAFILE
RISK RET NA
end-initializations
changeShare:="brewery"
end-procedure
declarations
!@insight.manage result
!@insight.alias Outcomes
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
! Objective: total return
Return:= sum(s in SHARES) RET(s)*frac(s)
! Limit the percentage of high-risk values
sum(s in RISK) frac(s) <= MAXRISK
! Minimum amount of North-American values
sum(s in NA) frac(s) >= MINAM
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= MAXVAL
! Solve the problem
insightmaximize(Return)
! Solution printing to a file
fopen(OUTFILE, F_OUTPUT)
writeln("Total return: ", getobjval)
forall(s in SHARES)
writeln(strfmt(s,-12), ": \t", strfmt(getsol(frac(s))*100,5,2), "%")
fclose(F_OUTPUT)
end-model
foliodata.xml
<?xml version="1.0" encoding="UTF-8"?>
<model-companion xmlns="http://www.fico.com/xpress/optimization-modeler/model-companion" version="3.0">
<client>
<view-group title="Portfolio Optimization">
<vdl-view title="Portfolio" path="foliodata.vdl"></vdl-view>
</view-group>
</client>
</model-companion>
