33// SPDX-License-Identifier: BSD-3-Clause
44
55use oxmpl:: base:: {
6- space:: { RealVectorStateSpace , StateSpace } ,
6+ space:: { RealVectorStateSpace as OxmplRealVectorStateSpace , StateSpace } ,
77 state:: RealVectorState ,
88} ;
99use rand:: rng;
10- use std:: sync:: Arc ;
10+ use std:: sync:: { Arc , Mutex } ;
1111use wasm_bindgen:: prelude:: * ;
1212
13+ use crate :: base:: JsRealVectorState ;
14+
1315#[ wasm_bindgen( js_name = RealVectorStateSpace ) ]
1416pub struct JsRealVectorStateSpace {
1517 #[ wasm_bindgen( skip) ]
16- pub inner : Arc < RealVectorStateSpace > ,
18+ pub inner : Arc < Mutex < OxmplRealVectorStateSpace > > ,
1719}
1820
1921#[ wasm_bindgen( js_class = RealVectorStateSpace ) ]
@@ -39,30 +41,40 @@ impl JsRealVectorStateSpace {
3941 None
4042 } ;
4143
42- match RealVectorStateSpace :: new ( dimension, bounds_vec) {
44+ match OxmplRealVectorStateSpace :: new ( dimension, bounds_vec) {
4345 Ok ( space) => Ok ( Self {
44- inner : Arc :: new ( space) ,
46+ inner : Arc :: new ( Mutex :: new ( space) ) ,
4547 } ) ,
4648 Err ( e) => Err ( e. to_string ( ) ) ,
4749 }
4850 }
4951
50- pub fn sample ( & self ) -> Result < Vec < f64 > , String > {
52+ #[ wasm_bindgen( js_name = sample) ]
53+ pub fn sample ( & self ) -> Result < JsRealVectorState , String > {
5154 let mut rng = rng ( ) ;
52- match self . inner . sample_uniform ( & mut rng) {
53- Ok ( state) => Ok ( state. values ) ,
55+ match self . inner . lock ( ) . unwrap ( ) . sample_uniform ( & mut rng) {
56+ Ok ( state) => Ok ( JsRealVectorState :: new ( state. values ) ) ,
5457 Err ( e) => Err ( e. to_string ( ) ) ,
5558 }
5659 }
5760
58- pub fn distance ( & self , state1 : Vec < f64 > , state2 : Vec < f64 > ) -> f64 {
59- let s1 = RealVectorState :: new ( state1) ;
60- let s2 = RealVectorState :: new ( state2) ;
61- self . inner . distance ( & s1, & s2)
61+ #[ wasm_bindgen( js_name = distance) ]
62+ pub fn distance ( & self , state1 : & JsRealVectorState , state2 : & JsRealVectorState ) -> f64 {
63+ let s1 = RealVectorState :: new ( state1. inner . values . clone ( ) ) ;
64+ let s2 = RealVectorState :: new ( state2. inner . values . clone ( ) ) ;
65+ self . inner . lock ( ) . unwrap ( ) . distance ( & s1, & s2)
6266 }
6367
6468 #[ wasm_bindgen( js_name = getDimension) ]
6569 pub fn get_dimension ( & self ) -> usize {
66- self . inner . dimension
70+ self . inner . lock ( ) . unwrap ( ) . dimension
71+ }
72+
73+ #[ wasm_bindgen( js_name = setLongestValidLineSegmentFraction) ]
74+ pub fn set_longest_valid_segment_fraction ( & mut self , fraction : f64 ) {
75+ self . inner
76+ . lock ( )
77+ . unwrap ( )
78+ . set_longest_valid_segment_fraction ( fraction) ;
6779 }
6880}
0 commit comments