From: Paul
Subject: issue with defstruct access
Date: 
Message-ID: <cb5ohs$41n$1@kestrel.csrv.uidaho.edu>
Hi;

I have a function rosenbrock: List -> Real and a structure particle.

I seem to force the result of rosenbrock into value when I call 
generate-particle.

What is going on here?

I have no clue how to deal with this issue.

Thank you much,
Paul

(defstruct particle
            position          ;position
            velocity            ;velocity
            rosennumber;the rosenbrock number
            localbest        ;local best so far
            localfitbest)    ;local best rosennumber



  ;generates a random particle
(defun generateparticle ()
   (setq value (make-particle))
   (setf (particle-position value) (randlist 30 -30 30))
   (setf (particle-velocity value) (randlist 30 -30 30))

   (setf (particle-rosennumber value)
		(rosenbrock (particle-position value)))

   (setf (particle-localbest value) (particle-position value))

   (setf (particle-localfitbest value) (particle-rosennumber value))
   value)

From: Barry Margolin
Subject: Re: issue with defstruct access
Date: 
Message-ID: <barmar-032A77.02091121062004@comcast.dca.giganews.com>
In article <············@kestrel.csrv.uidaho.edu>,
 Paul <········@uidaho.edu> wrote:

> Hi;
> 
> I have a function rosenbrock: List -> Real and a structure particle.
> 
> I seem to force the result of rosenbrock into value when I call 
> generate-particle.

Why are you using the global variable named "value" in generateparticle, 
instead of a local variable?

Is it possible that rosenbrock also similarly misuses the global 
variable?

> 
> What is going on here?
> 
> I have no clue how to deal with this issue.
> 
> Thank you much,
> Paul
> 
> (defstruct particle
>             position          ;position
>             velocity            ;velocity
>             rosennumber;the rosenbrock number
>             localbest        ;local best so far
>             localfitbest)    ;local best rosennumber
> 
> 
> 
>   ;generates a random particle
> (defun generateparticle ()
>    (setq value (make-particle))
>    (setf (particle-position value) (randlist 30 -30 30))
>    (setf (particle-velocity value) (randlist 30 -30 30))
> 
>    (setf (particle-rosennumber value)
> 		(rosenbrock (particle-position value)))
> 
>    (setf (particle-localbest value) (particle-position value))
> 
>    (setf (particle-localfitbest value) (particle-rosennumber value))
>    value)

-- 
Barry Margolin, ······@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
From: Marco Antoniotti
Subject: Re: issue with defstruct access
Date: 
Message-ID: <25DBc.20$2i5.20942@typhoon.nyu.edu>
Paul wrote:

> Hi;
> 
> I have a function rosenbrock: List -> Real and a structure particle.
> 
> I seem to force the result of rosenbrock into value when I call 
> generate-particle.
> 
> What is going on here?
> 
> I have no clue how to deal with this issue.
> 
> Thank you much,
> Paul
> 
> (defstruct particle
>            position          ;position
>            velocity            ;velocity
>            rosennumber;the rosenbrock number
>            localbest        ;local best so far
>            localfitbest)    ;local best rosennumber
> 
> 
> 
>  ;generates a random particle
> (defun generateparticle ()
>   (setq value (make-particle))
>   (setf (particle-position value) (randlist 30 -30 30))
>   (setf (particle-velocity value) (randlist 30 -30 30))
> 
>   (setf (particle-rosennumber value)
>         (rosenbrock (particle-position value)))
> 
>   (setf (particle-localbest value) (particle-position value))
> 
>   (setf (particle-localfitbest value) (particle-rosennumber value))
>   value)

(defun generate-particle ()
    (let ((new-particle
            (make-particle :position (randlist 30 -30 30)
                           :velocity (randlist 30 -30 30))))
       (setf (particle-rosennumber new-particle)
             (rosenbrock (particle-position new-particle)))
       (setf (particle-localbest new-particle)
             (particle-position new-particle)
       (setf (particle-localfitbest new-particle)
             (particle-rosennumber new-particle))
       new-particle))

That should do it.  I'd bet your use of the global "value" messed things up.

Cheers
--
Marco
From: paul
Subject: Re: issue with defstruct access
Date: 
Message-ID: <cb7cd0$lk$1@kestrel.csrv.uidaho.edu>
Yea, rosenbrock was messing with the passed in value.
:-(

Thanks.
-paul

Paul wrote:
> Hi;
> 
> I have a function rosenbrock: List -> Real and a structure particle.
> 
> I seem to force the result of rosenbrock into value when I call 
> generate-particle.
> 
> What is going on here?
> 
> I have no clue how to deal with this issue.
> 
> Thank you much,
> Paul
> 
> (defstruct particle
>            position          ;position
>            velocity            ;velocity
>            rosennumber;the rosenbrock number
>            localbest        ;local best so far
>            localfitbest)    ;local best rosennumber
> 
> 
> 
>  ;generates a random particle
> (defun generateparticle ()
>   (setq value (make-particle))
>   (setf (particle-position value) (randlist 30 -30 30))
>   (setf (particle-velocity value) (randlist 30 -30 30))
> 
>   (setf (particle-rosennumber value)
>         (rosenbrock (particle-position value)))
> 
>   (setf (particle-localbest value) (particle-position value))
> 
>   (setf (particle-localfitbest value) (particle-rosennumber value))
>   value)
From: Björn Lindberg
Subject: Re: issue with defstruct access
Date: 
Message-ID: <hcs8yehtb8r.fsf@knatte.nada.kth.se>
Paul <········@uidaho.edu> writes:

> Hi;
> 
> I have a function rosenbrock: List -> Real and a structure particle.
> 
> I seem to force the result of rosenbrock into value when I call
> generate-particle.
> 
> What is going on here?
> 
> I have no clue how to deal with this issue.
> 
> Thank you much,
> Paul
> 
> (defstruct particle
>             position          ;position
>             velocity            ;velocity
>             rosennumber;the rosenbrock number
>             localbest        ;local best so far
>             localfitbest)    ;local best rosennumber
> 
> 
> 
>   ;generates a random particle
> (defun generateparticle ()
>    (setq value (make-particle))
>    (setf (particle-position value) (randlist 30 -30 30))
>    (setf (particle-velocity value) (randlist 30 -30 30))
> 
>    (setf (particle-rosennumber value)
> 		(rosenbrock (particle-position value)))
> 
>    (setf (particle-localbest value) (particle-position value))
> 
>    (setf (particle-localfitbest value) (particle-rosennumber value))
>    value)

First of all, if you do not already have a global variable called
`value' you get undefined behaviour already in the first line of the
function. You need to introduce a new variable with LET before you can
mutate it. Perhaps something like this:

(defun generate-particle ()
  (let* ((value (make-particle))
         (position (randlist 30 -30 30))
         (rosen-number (rosenbrock (position))))
    (setf (particle-position value) ...)
    ...
    value))

But secondly, why not use keyword arguments to make-particle instead?

(defun generate-particle ()
  (let* ((position (randlist 30 -30 30))
         (rosen-number (rosenbrock (position))))
    (make-particle :position position
                   :velocity ...
                   :rosennumber rosen-number
                   ...)))


Bj�rn
From: Frederic Brunel
Subject: Re: issue with defstruct access
Date: 
Message-ID: <87r7s7iafq.fsf@free.fr>
Paul <········@uidaho.edu> writes:

> Hi;
>
> I have a function rosenbrock: List -> Real and a structure particle.
>
> I seem to force the result of rosenbrock into value when I call
> generate-particle.
>
> What is going on here?
[...]

  Just talking about style. You'll avoid mistake by correctly indenting
  your code. For example:

  (defstruct particle
    position
    velocity
    rosen-number
    local-best
    local-fit-best)

  (defun generate-particle ()
    (let* ((pos (randlist 30 -30 30))
           (vel (randlist 30 -30 30))
           (rosen-number (rosenbrok position)))
      (make-particle :position position
                     :velocity velocity
                     :rosen-number rosen-number
                     :local-best position
                     :local-fit-best rosen-number)))

  Since the LOCAL-BEST and LOCAL-FIT-BEST can be initialized from some
  given values, think about writing a constructor that would take a
  position and a velocity as arguments--note that you can specify your
  own constructor with structures or with classes, look at the spec.

  Regards.

-- 
Frederic Brunel