1919#include  <plugins/libplugin.h> 
2020#include  <stdint.h> 
2121
22+ 
23+ // FIXME: review this description still holds. 
2224/* # Optimal payments 
2325 * 
2426 * In this module we reduce the routing optimization problem to a linear 
4749 * 
4850 * 	fee_msat = base_msat + floor(millionths*x_msat / 10^6) 
4951 * 
50-  * We approximate this fee into a linear function by computing a slope `c_fee` such 
51-  * that: 
52+  * We approximate this fee into a linear function plus a constant term: 
53+  * 
54+  * 	cost(x) = (k*base_msat) + (k*A_msat*millionths/10^6) * x 
5255 * 
53-  * 	fee_microsat = c_fee * x_sat 
56+  * where A_msat is the accuracy of the flows, the smallest unit of flow, so that 
57+  * x_msat = x*A_msat, and k is an arbitrary constant. 
5458 * 
5559 * Function `linear_fee_cost` computes `c_fee` based on the base and 
5660 * proportional fees of a channel. 
159163 * 
160164 * */ 
161165
162- #define  PARTS_BITS  2
166+ /* Bits required to store all channel parts. */ 
167+ #define  PARTS_BITS  3
168+ /* How many parts have a proportional cost. */ 
169+ #define  N_LINEAR_PARTS  5
170+ /* The number of the channel part that holds the base fee. */ 
171+ #define  CHANNEL_BASE_PART  7
163172#define  CHANNEL_PARTS  (1 << PARTS_BITS)
164173
165174// These are the probability intervals we use to decompose a channel into linear 
166175// cost function arcs. 
167- static  const  double  CHANNEL_PIVOTS []= {0 ,0.5 ,0.8 ,0.95 };
176+ static  const  double  CHANNEL_PIVOTS []= {0 ,0.5 ,0.8 ,0.95 , 0.99 };
168177
169178static  const  s64  INFINITE  =  INT64_MAX ;
170179static  const  s64  MU_MAX  =  100 ;
@@ -237,7 +246,7 @@ static const struct amount_msat SINGLE_PATH_THRESHOLD = AMOUNT_MSAT(1000000);
237246 * we can't us a union, since bit order is implementation-defined and 
238247 * we want chanidx on the highest bits: 
239248 * 
240-  * [ 0       1 2     3             4  5 6 ... 31 ] 
249+  * [ 0       1 2 3    4             5 6 ... 31 ] 
241250 *   dual    part    chandir      chanidx 
242251 */ 
243252#define  ARC_DUAL_BITOFF  (0)
@@ -280,6 +289,13 @@ static inline struct arc arc_from_parts(u32 chanidx, int chandir, u32 part, bool
280289	return  arc ;
281290}
282291
292+ /* A fake node ID that we use to separate channel base costs from proportional 
293+  * costs. */ 
294+ static  u32  auxiliary_node (u32  chanidx , int  chandir , u32  auxiliary_node_offset )
295+ {
296+ 	return  auxiliary_node_offset  +  ((chanidx  +  1 ) | chandir );
297+ }
298+ 
283299#define  MAX (x , y ) (((x) > (y)) ? (x) : (y))
284300#define  MIN (x , y ) (((x) < (y)) ? (x) : (y))
285301
@@ -295,11 +311,18 @@ struct pay_parameters {
295311	struct  amount_msat  accuracy ;
296312
297313	// channel linearization parameters 
298- 	double  cap_fraction [CHANNEL_PARTS ],
299- 	       cost_fraction [CHANNEL_PARTS ];
314+ 	double  cap_fraction [N_LINEAR_PARTS ],
315+ 	       cost_fraction [N_LINEAR_PARTS ];
300316
301317	double  delay_feefactor ;
302318	double  base_fee_penalty ;
319+ 
320+ 	/* FIXME: set this */ 
321+ 	u32  auxiliary_node_offset ;
322+ 
323+ 	/* FIXME: our estimate of the constant probability of failure of any 
324+ 	 * randomly chosen channel. */ 
325+ 	double  constant_fail_probability ;
303326};
304327
305328/* Helper function. 
@@ -553,11 +576,14 @@ static void init_linear_network(const tal_t *ctx,
553576				s64  * * arc_fee_cost , s64  * * arc_capacity )
554577{
555578	const  struct  gossmap  * gossmap  =  params -> rq -> gossmap ;
556- 	const   size_t   max_num_chans   =   gossmap_max_chan_idx ( gossmap ); 
557- 	 const  size_t  max_num_arcs  =  max_num_chans   *   ARCS_PER_CHANNEL ;
579+ 	/* topology of the network */ 
580+          const  size_t  max_num_chans  =  gossmap_max_chan_idx ( gossmap ) ;
558581	const  size_t  max_num_nodes  =  gossmap_max_node_idx (gossmap );
582+         /* topology of the MCF problem */ 
583+ 	const  size_t  max_num_arcs  =  max_num_chans  *  ARCS_PER_CHANNEL ;
584+ 	const  size_t  max_num_edges  =  max_num_nodes  +  max_num_chans  *  2 ;
559585
560- 	* graph  =  graph_new (ctx , max_num_nodes , max_num_arcs , ARC_DUAL_BITOFF );
586+ 	* graph  =  graph_new (ctx , max_num_edges , max_num_arcs , ARC_DUAL_BITOFF );
561587	* arc_prob_cost  =  tal_arr (ctx , double , max_num_arcs );
562588	for  (size_t  i  =  0 ; i  <  max_num_arcs ; ++ i )
563589		(* arc_prob_cost )[i ] =  DBL_MAX ;
0 commit comments