Search code examples
netlogoprocedure

Netlogo : calling a procedure after opening a file


Here-below is the code for opening a file, reading it and writing it into a list (inspired from another discussion) :

to setup
  reset-timer
  ; first, we load the database file
  ; We check to make sure the file exists first
  ifelse ( file-exists? "AT_data.txt" )
  [
    ; We are saving the data into a list, so it only needs to be loaded once.
    set AT-data []
    file-open "AT_data.txt"
    while [ not file-at-end? ]
    [
      ; file-read gives variables stored in a double list
      ; Each iteration we append the next three-tuple to the current list: ID AT1 AT2
      set AT-data sentence AT-data (list (list file-read file-read file-read))
    ]
    user-message "File loading complete!"
    file-close
   ;; when adding this, the procedure is running endlessly, to be checked
   ;; ask patches [ assign-data ]

    ]
  [ user-message "There is no AT_data.txt file in current directory!" ]

  file-close-all

  print timer
end

As I wrote as a comment, when I call the next procedure [assign-data], the procedure [assign-data] runs endlessly. I setup a timer in the [assign-data] procedure and I see that it is running over and over again. When I run [assign-data] on its own, it is working appropriatly, only once.

I tried with a stop after [assign-data] but it is not working.

There must be something that I did not get yet about the use of Netlogo, do you know what it is ?

Here is the code of the assign-dataprocedure (there are 2 choices, the second is running faster)

to assign-farmers1
  reset-timer

  ask patches with [seed = 1] [
  set death last (first (filter [current-inner-list -> (item 0 current-inner-list = ID_farm)] AT-data))
  set age item 1  (first (filter [current-inner-list -> (item 0 current-inner-list = ID_farm)] AT-data))
  ]

  print timer

end


to assign-data2
  reset-timer
  ask patches with [seed = 1] [
    let i 1
    while [i < length AT-data] [
      let current-inner-list item i AT-data
      ifelse (ID_farm = item 0 current-inner-list)
        [ set age item 1 current-inner-list set death item 2 current-inner-list
          stop]
        [ set i i + 1 ]
      ]
      ]
  print timer
end

-> that lead me to another question : how to stop a simulation from running endlessly ? I tried with stop in the command center but it is not working.

Thanks for you time.


HERE IS A REPRODUCIBLE EXAMPLE (not sure if I should leave the beginning of the question) AT_data.txt is a file made of 3 col where the first goes from 1 to 100, second and third are just random numbers.

globals [
  AT-data
  ]

patches-own [
  ID
  AT1
  AT2
  seed
]

to setup
  ;; here I just create patches with different values that also appear in the list
  ca
  ask patches [ set seed random 10 set ID random 100
    ifelse (seed = 4)
    [ set pcolor orange] [set pcolor white]
  ]
end

to load
  reset-timer
  ; first, we load the database file
  ; We check to make sure the file exists first
  ifelse ( file-exists? "AT_data.txt" )
  [
    ; We are saving the data into a list, so it only needs to be loaded once.
    set AT-data []
    file-open "AT_data.txt"
    while [ not file-at-end? ]
    [
      ; file-read gives variables stored in a double list
      ; Each iteration we append the next three-tuple to the current list: ID AT1 AT2
      set AT-data sentence AT-data (list (list file-read file-read file-read))
    ]
    user-message "File loading complete!"
    file-close
   ;; when adding this, the procedure is running endlessly, to be checked
   ask patches [ assign-data ]
   stop
    ]
  [ user-message "There is no AT_data.txt file in current directory!" ]

  file-close-all

  print timer
end


to assign-data
  reset-timer
  ask patches with [seed = 4] [
    let i 1
    while [i < length AT-data] [
      let current-inner-list item i AT-data
      ifelse (ID = item 0 current-inner-list)
        [ set AT1 item 1 current-inner-list set AT2 item 2 current-inner-list
          stop]
        [ set i i + 1 ]
      ]
      ]
  print timer
end

Solution

  • Are you sure the run is endless and not exponential? You ask patches to assign-data and in assign-data you use ask patches again. That means that every single patch is checking every single patch and letting the qualified patch go through the loop, which can take a while.