FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Working with reversible numbers

Description
Tracing the values of reversible numbers during tree search
  • Two model versions showing definition of callbacks via subroutine references or by name.
Further explanation of this example: 'Xpress Kalis Mosel User Guide', Section 4.5 Reversible numbers

tracereverse.zip[download all files]

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.
tracereverse.mos[download]
tracereverse2.mos[download]





tracereverse.mos

(!****************************************************************
   CP example problems
   ===================
   
   file tracereverse.mos
   `````````````````````
   Tracing the values of reversible numbers.

   (c) 2010 Artelys S.A. and Fair Isaac Corporation
       Creation: 2010, rev. Apr. 2022        
*****************************************************************!)
model "Tracing reversible numbers"
 uses "kalis", "mmsystem"
 
 forward procedure save_node_state
 forward procedure branch_up
 forward procedure branch_down

 declarations
   N = 5
   R = 1..N
   C: array(R) of integer

   x: array(R) of cpvar

   k,depth: cpreversible
   ka: cpreversiblearray
 end-declarations

 C::(1..5)[-7,15,-3,19,-45]

! Initialization: all reversible numbers at 0
 set_reversible_attributes(depth, 0)
 set_reversible_attributes(k, 0)
 set_reversible_attributes(ka, 1, N, 0)
 
! Decision variables and constraints
 forall(i in R) setdomain(x(i), 0, 1)
 sum(i in R) x(i) >= 3

 cp_set_node_callback(->save_node_state)
 cp_set_branch_callback(->branch_down, ->branch_up)

 cp_set_branching(assign_var(KALIS_SMALLEST_DOMAIN, KALIS_MAX_TO_MIN))
 setparam("KALIS_MAX_SOLUTIONS", 3)
 while (cp_find_next_sol) do
  writeln(" "*2*round(depth.val), "Solution: ", x)
 end-do    

!************ Callback functions ************
 procedure save_node_state 
  setval(depth, getval(depth)+1)
  k.val:= sum(i in R) if(is_fixed(x(i)), C(i)*x(i).val, 0)
  forall(i in R) setelt(ka,i, if(is_fixed(x(i)), C(i)*x(i).val, 0))   
 end-procedure

 procedure branch_up      
  writeln(textfmt(" "*2*round(depth.val)+ "up  ",-20), k, "\t", ka)    
 end-procedure

 procedure branch_down      
  writeln(textfmt(" "*2*round(depth.val)+ "down  ",-20), k, "\t", ka)    
 end-procedure
 
end-model

Back to examples browserPrevious exampleNext example