lib: partial valuation fix, more debug output for #1402
This commit is contained in:
		
							parent
							
								
									5eb69785e5
								
							
						
					
					
						commit
						d60c1f764d
					
				| @ -34,6 +34,7 @@ import Data.Graph.Inductive  (Gr, Node, NodeMap, mkMapGraph, mkNode, lab, out, s | |||||||
| import Data.List | import Data.List | ||||||
| import Data.List.Extra (nubSortBy) | import Data.List.Extra (nubSortBy) | ||||||
| import qualified Data.Map as M | import qualified Data.Map as M | ||||||
|  | import qualified Data.Set as S | ||||||
| import Data.Maybe | import Data.Maybe | ||||||
| import qualified Data.Text as T | import qualified Data.Text as T | ||||||
| import Data.Time.Calendar (Day, fromGregorian) | import Data.Time.Calendar (Day, fromGregorian) | ||||||
| @ -250,7 +251,7 @@ priceLookup makepricegraph d from mto = | |||||||
|           tonode = node m to |           tonode = node m to | ||||||
|           mindirectprice :: Maybe Quantity = |           mindirectprice :: Maybe Quantity = | ||||||
|             -- Find the shortest path, if any, between from and to. |             -- Find the shortest path, if any, between from and to. | ||||||
|             case sp fromnode tonode g :: Maybe [Node] of |             case dbg9 "shortest price path" $ sp fromnode tonode g :: Maybe [Node] of | ||||||
|               Nothing    -> Nothing |               Nothing    -> Nothing | ||||||
|               Just nodes -> |               Just nodes -> | ||||||
|                 dbg ("market price for "++intercalate " -> " (map T.unpack comms)) $ |                 dbg ("market price for "++intercalate " -> " (map T.unpack comms)) $ | ||||||
| @ -325,14 +326,17 @@ makePriceGraph alldeclaredprices allinferredprices d = | |||||||
|   PriceGraph{prGraph=g, prNodemap=m, prDefaultValuationCommodities=defaultdests} |   PriceGraph{prGraph=g, prNodemap=m, prDefaultValuationCommodities=defaultdests} | ||||||
|   where |   where | ||||||
|     -- prices in effect on date d, either declared or inferred |     -- prices in effect on date d, either declared or inferred | ||||||
|     visibledeclaredprices = filter ((<=d).mpdate) alldeclaredprices |     visibledeclaredprices = dbg2 "visibledeclaredprices" $ filter ((<=d).mpdate) alldeclaredprices | ||||||
|     visibleinferredprices = filter ((<=d).mpdate) allinferredprices |     visibleinferredprices = dbg2 "visibleinferredprices" $ filter ((<=d).mpdate) allinferredprices | ||||||
|     declaredandinferredprices = dbg2 "declaredandinferredprices" $ |     declaredandinferredprices = effectiveMarketPrices visibledeclaredprices visibleinferredprices | ||||||
|       effectiveMarketPrices visibledeclaredprices visibleinferredprices |  | ||||||
| 
 | 
 | ||||||
|     -- infer any additional reverse prices not already declared or inferred |     -- infer any additional reverse prices not already declared or inferred | ||||||
|     reverseprices = dbg2 "reverseprices" $ |     reverseprices = dbg2 "additional reverse prices" $ | ||||||
|       map marketPriceReverse declaredandinferredprices \\ declaredandinferredprices |       [p | p@MarketPrice{..} <- map marketPriceReverse declaredandinferredprices | ||||||
|  |          , not $ (mpfrom,mpto) `S.member` forwardpairs | ||||||
|  |       ] | ||||||
|  |       where | ||||||
|  |         forwardpairs = S.fromList [(mpfrom,mpto) | MarketPrice{..} <- declaredandinferredprices] | ||||||
| 
 | 
 | ||||||
|     -- build the graph and associated node map |     -- build the graph and associated node map | ||||||
|     (g, m) = |     (g, m) = | ||||||
| @ -341,7 +345,7 @@ makePriceGraph alldeclaredprices allinferredprices d = | |||||||
|       (dbg9 "price graph edges" $ [(mpfrom, mpto, mprate) | MarketPrice{..} <- prices]) |       (dbg9 "price graph edges" $ [(mpfrom, mpto, mprate) | MarketPrice{..} <- prices]) | ||||||
|       :: (Gr CommoditySymbol Quantity, NodeMap CommoditySymbol) |       :: (Gr CommoditySymbol Quantity, NodeMap CommoditySymbol) | ||||||
|       where |       where | ||||||
|         prices   = declaredandinferredprices ++ reverseprices |         prices   = dbg2 "prices used as price graph edges" $ declaredandinferredprices ++ reverseprices | ||||||
|         allcomms = map mpfrom prices |         allcomms = map mpfrom prices | ||||||
| 
 | 
 | ||||||
|     -- determine a default valuation commodity for each source commodity |     -- determine a default valuation commodity for each source commodity | ||||||
| @ -371,6 +375,7 @@ effectiveMarketPrices declaredprices inferredprices = | |||||||
|     declaredprices' = [(1, i, p) | (i,p) <- zip [1..] declaredprices] |     declaredprices' = [(1, i, p) | (i,p) <- zip [1..] declaredprices] | ||||||
|     inferredprices' = [(0, i, p) | (i,p) <- zip [1..] inferredprices] |     inferredprices' = [(0, i, p) | (i,p) <- zip [1..] inferredprices] | ||||||
|   in |   in | ||||||
|  |     dbg2 "effective forward prices" $ | ||||||
|     -- combine |     -- combine | ||||||
|     declaredprices' ++ inferredprices' |     declaredprices' ++ inferredprices' | ||||||
|     -- sort by decreasing date then decreasing precedence then decreasing parse order |     -- sort by decreasing date then decreasing precedence then decreasing parse order | ||||||
|  | |||||||
| @ -278,7 +278,19 @@ $ hledger -f- bal -N -V | |||||||
| $ hledger -f- bal -N -V --infer-value | $ hledger -f- bal -N -V --infer-value | ||||||
|                   D3  a |                   D3  a | ||||||
| 
 | 
 | ||||||
| # 28. #1402 It should pick the A 5 price for B here. | # 28. #1402 It should pick the direct (forward) A 3.00 price for B here, | ||||||
|  | # not the reverse price. | ||||||
|  | < | ||||||
|  | 2020-11-10  | ||||||
|  |     (a)  B 1.00 | ||||||
|  | 
 | ||||||
|  | P 2020-11-01 B A 3.00 | ||||||
|  | P 2020-11-02 A B 0.40 | ||||||
|  | 
 | ||||||
|  | $ hledger -f- bal -N -e 2020-11-20 -X A | ||||||
|  |               A 3.00  a | ||||||
|  | 
 | ||||||
|  | # 29. #1402 It should pick the direct B->A price here, not the indirect B->C->A price. | ||||||
| # < | # < | ||||||
| # 2020-11-10 | # 2020-11-10 | ||||||
| #     (a)  B 1.00 | #     (a)  B 1.00 | ||||||
| @ -287,6 +299,5 @@ $ hledger -f- bal -N -V --infer-value | |||||||
| # P 2020-11-02 C A 3 | # P 2020-11-02 C A 3 | ||||||
| # P 2020-11-03 B A 5 | # P 2020-11-03 B A 5 | ||||||
| 
 | 
 | ||||||
| # $ hledger -f- bal -N -X A | # $ hledger -f- bal -N -e 2020-11-20 -X A | ||||||
| #                  A 5  a | #                  A 5  a | ||||||
| 
 |  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user