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.Extra (nubSortBy) | ||||
| import qualified Data.Map as M | ||||
| import qualified Data.Set as S | ||||
| import Data.Maybe | ||||
| import qualified Data.Text as T | ||||
| import Data.Time.Calendar (Day, fromGregorian) | ||||
| @ -250,7 +251,7 @@ priceLookup makepricegraph d from mto = | ||||
|           tonode = node m to | ||||
|           mindirectprice :: Maybe Quantity = | ||||
|             -- 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 | ||||
|               Just nodes -> | ||||
|                 dbg ("market price for "++intercalate " -> " (map T.unpack comms)) $ | ||||
| @ -325,14 +326,17 @@ makePriceGraph alldeclaredprices allinferredprices d = | ||||
|   PriceGraph{prGraph=g, prNodemap=m, prDefaultValuationCommodities=defaultdests} | ||||
|   where | ||||
|     -- prices in effect on date d, either declared or inferred | ||||
|     visibledeclaredprices = filter ((<=d).mpdate) alldeclaredprices | ||||
|     visibleinferredprices = filter ((<=d).mpdate) allinferredprices | ||||
|     declaredandinferredprices = dbg2 "declaredandinferredprices" $ | ||||
|       effectiveMarketPrices visibledeclaredprices visibleinferredprices | ||||
|     visibledeclaredprices = dbg2 "visibledeclaredprices" $ filter ((<=d).mpdate) alldeclaredprices | ||||
|     visibleinferredprices = dbg2 "visibleinferredprices" $ filter ((<=d).mpdate) allinferredprices | ||||
|     declaredandinferredprices = effectiveMarketPrices visibledeclaredprices visibleinferredprices | ||||
| 
 | ||||
|     -- infer any additional reverse prices not already declared or inferred | ||||
|     reverseprices = dbg2 "reverseprices" $ | ||||
|       map marketPriceReverse declaredandinferredprices \\ declaredandinferredprices | ||||
|     reverseprices = dbg2 "additional reverse prices" $ | ||||
|       [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 | ||||
|     (g, m) = | ||||
| @ -341,7 +345,7 @@ makePriceGraph alldeclaredprices allinferredprices d = | ||||
|       (dbg9 "price graph edges" $ [(mpfrom, mpto, mprate) | MarketPrice{..} <- prices]) | ||||
|       :: (Gr CommoditySymbol Quantity, NodeMap CommoditySymbol) | ||||
|       where | ||||
|         prices   = declaredandinferredprices ++ reverseprices | ||||
|         prices   = dbg2 "prices used as price graph edges" $ declaredandinferredprices ++ reverseprices | ||||
|         allcomms = map mpfrom prices | ||||
| 
 | ||||
|     -- 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] | ||||
|     inferredprices' = [(0, i, p) | (i,p) <- zip [1..] inferredprices] | ||||
|   in | ||||
|     dbg2 "effective forward prices" $ | ||||
|     -- combine | ||||
|     declaredprices' ++ inferredprices' | ||||
|     -- 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 | ||||
|                   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 | ||||
| #     (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-03 B A 5 | ||||
| 
 | ||||
| # $ hledger -f- bal -N -X A | ||||
| # $ hledger -f- bal -N -e 2020-11-20 -X A | ||||
| #                  A 5  a | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user