The Matrix module allows power users to set up 'fuzzy logic' rules in QBO. At it's core, given a bunch of inputs ('dimensions'), a matrix will return the best matches based on weighted criteria.
Use Case: Worklist AssignmentEach Smart Worklist Template may optionally specify a Matrix to determine outputs (measures):
for each item in the worklist.
For example, a QBO client chose to distribute foreclosure work based on the following inputs (dimensions):
Use Case: Product PricingA client with several dozen service offerings ("products") tiers pricing by State, Client, Investor, and Loan UPB Range. In the table below, Product, Sttae, Client, Investor and UPB Range are 'inputs' (dimensions), while Cost and Price are 'outputs' (measures):
In this use case, the blue columns are dimensions, and the green columns are measurements. The cost of a BPO is:
Pricing is more complicated:
Part of the challenge is determining which row wins if there are 'ties'. For example, should a BPO done in CA for Wells Fargo be priced at $90 or $120. The answer can be configured by applying weights to dimensions. For example, dimensional weights in this example are:
For a BPO where the state is CA, client is Wells Fargo, investor is Chase, and UPB is 200K, each row is weighted as follows:
Note that row 3 has a weight of 10, beating row 2 with a weight of 5, and row 2 beats row 1 with a weight of 0. Rows 4 and 5 are not eligible, since they require criteria that the subject BPO does not contain. Dimension XPath HintsDimensions based on repeatable values often should select the most recent item. The pattern for this is:
(//MyXPath)[position()=last()] Third Party IntegrationMatrix functionality can be invoke in several ways. The Matrix/Lookup operation will return results in either JSON or XML format, with the best-matched row returned first. In most use cases, third party systems will elect to treat the first row as the 'best result' and ignore all subsequent rows. There are use cases, however, where a third party system may wish to take some action based on more than the first row. For this reason, the Lookup operation will return the top 25 rows by default.When returning these 'rows', there are 3 columns that reflect the relevance of the row to the input columns:
Storing Matrix ResultsThe output of a matrix can be stored as a Score, by using the Matrix Scoring Engine. To do this:
Score/Score.ashx/Calculate?Template={Matrix}&{Dimension}={Value}... Score/Score.ashx/Calculate?Template=Product Pricing&Product=BPO&State=CA&Client=Wells Fargo One can upload a spreadsheet of items to evaluate, and view the results in a Score Analysis tab as follows:
Bulk LookupMatrix/BulkLookup supports "batch" lookup operations. Assume we have a Matrix called 'Required Docs' like this:
One can call Matrix.ashx/BulkLookup?Matrix=Required Docs passing a payload like this: <Batch> <Input> <Loan>123</Loan> <AppType>HAMP Loan Mod</AppType> <PropertyState>WA</PropertyState> </Input> <Input> <Loan>234</Loan> <AppType>Liquidation</AppType> <PropertyState>MA</PropertyType> </Input> </Batch> and you will get back something like this: <MatrixBulkLookup> <Output> <Loan>123</Loan> <AppType>HAMP Loan Mod</AppType> <PropertyState>WA</PropertyState> <Package>HAMP Package</Package> </Output > <Output > <Loan>234</Loan> <AppType>Liquidation</AppType> <PropertyState>MA</PropertyType> <Package>MA Closeout</Package> </Output > </MatrixBulkLookup> Note the Loan node in there for human eyes; it will be regurgitated in the output, but is useless to the Matrix unless you have a Loan dimension. The reasons for using BulkLookup include:
Application/Matrix.ashx/AsyncLookup?Matrix= Required Docs This will save the XML input payload to imaging, and queue the job for processing asynchronously. The output payload will be saved to imaging, and made available for retrieval. A call to Matrix/AsyncLookup will return an ImportFile XML node:<?xml version="1.0" encoding="utf-8"?> <ImportFileItem xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Object>Matrix</Object> <ObjectID>225</ObjectID> <ImportFile>Matrix Async Lookup</ImportFile> <ImportFileID>5035</ImportFileID> <ImportFileTemplateID>36</ImportFileTemplateID> <Items /> <PreTransformID>117557</PreTransformID> </ImportFileItem> You can then poll for results via: Import/ImportFile.ashx/Select?ID={ImportFileID}&Output=Xml looking for a Status node of 'Complete':<?xml version="1.0" encoding="utf-8"?> <ImportFileItem xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Status>Complete</Status> <Object>Matrix</Object> <ObjectID>225</ObjectID> <ImportComplete>2014-06-17T11:46:35.077</ImportComplete> <ImportFile>Matrix Async Lookup</ImportFile> <ImportFileID>5035</ImportFileID> <ImportFileTemplateID>36</ImportFileTemplateID> <ImportResultID>117558</ImportResultID> <ImportStart>2014-06-17T11:43:02.183</ImportStart> <Items /> <PreTransformID>117557</PreTransformID> </ImportFileItem> Nested MatriciesSome matrices may become very complex, particularly if they're being used to field requirements from multiple business units. For example:
Creating a single matrix to field all these requirements gets a bit unweildy:
In such cases, you may instead configure a nested matrix: a matrix that calls other matrices. For the example above:
This allows the breach letter power users to maintain the breach matrix independently of the default workflow power users. When calling Matrix/Lookup?ID={Delinquent Choose}&State=CA&UPB=127522.78&DaysDelinquent=35 , assuming this matches a breach row, the output will include:
When calling Matrix/Lookup?ID={Delinquent Choose}&State=NY&UPB=127522.78&DaysDelinquent=62 , assuming this matches a default row, the output will include:
To leverage nested matrices, the output of the master matrix must: The AbstractObject/UpdateFromMatrix method can be used to change the properties of any QBO object by evaluating it against a Matrix. Examples include:
To leverage this feature, create a Matrix with:
Parameters:
As with all standard methods, this can be used from a workflow step. Loan Assignment Example
Thinking Like a Business Analyst - Not a ProgrammerA QBO Client tasked their IT department with creating a matrix to assess whether breach letters should not be sent on eligible loan. The rules were:
Their IT department create a 300 row matrix, covering all possible permutations of the rules; that is a row for every state, investor, and signing authority. Running against their entire breach-eligible loan portfolio took hours. When their business unit reviewed the matrix, a business analyst redesigned the matrix to be 5 rows, with a row matching each bullet point listed in the requirements. Running against their entire breach-eligible loan portfolio took 6 minutes. The Matrix module is intended to be configured in a manner that makes sense to a business analyst! Programmers often tend to think in procedural manner, a mindset that frequently does not map "naturally" to business requirements. All too often, we let the inmates run the asylum. In this case, programmers genuinely did not think to use pattern matching and weights. Because they did not, their procedural trained minds looked at 5 bullet points of requirements, and came up with 300 lines of all possible permutations. |