Class: Diagrams::Layout

Inherits:
Object show all
Defined in:
lib/maruku/ext/diagrams/layout.rb

Instance Method Summary collapse

Constructor Details

#initializeLayout

Returns a new instance of Layout.



158
159
160
161
162
163
164
# File 'lib/maruku/ext/diagrams/layout.rb', line 158

def initialize
	@hsystem = VarGraph.new
	@vsystem = VarGraph.new
	
	@hlink,@vlink = {},{}
	@hsprings,@vsprings={},{}
end

Instance Method Details

#add_con_h(var1, var2, hspring) ⇒ Object

var2-var1 = spring



190
191
192
193
194
195
196
# File 'lib/maruku/ext/diagrams/layout.rb', line 190

def add_con_h(var1,var2,hspring)
	add_var var1; add_var var2;
	@hlink[var1].push [var2, hspring]
	@hsprings[[var1,var2]] = hspring

	@hsystem.add_edge(var1, var2)
end

#add_con_v(var1, var2, vspring) ⇒ Object



198
199
200
201
202
203
204
# File 'lib/maruku/ext/diagrams/layout.rb', line 198

def add_con_v(var1,var2,vspring)
	add_var var1; add_var var2;
	@vlink[var1].push [var2, vspring]
	@vsprings[[var1,var2]] = vspring
	
	@vsystem.add_edge(var1, var2)
end

#add_var(s) ⇒ Object



184
185
186
187
# File 'lib/maruku/ext/diagrams/layout.rb', line 184

def add_var(s)
	@hlink[s]=[] if not @hlink[s]
	@vlink[s]=[] if not @vlink[s]
end

#algo2Object



344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# File 'lib/maruku/ext/diagrams/layout.rb', line 344

def algo2 
	@hsystem.compute_closure
	@hsystem.go!
=begin			
	def reduce(links, varA, varZ)
		paths = rec_paths(links, varA, varZ)
		
		puts "Found #{paths.size} paths:"
		paths.each_with_index do |path, i|
			puts "path #{i}: #{path.inspect}"
		end
		
		var2path = {}
		
		paths.each_with_index do |path, p|
			for i in 1..path.size-2
				var = path[i]
				var2path[var] ||= []
				var2path[var].push p
			end
		end
		
		var2path.each do |v, paths|
			puts "var #{v} -> #{paths.inspect}"
		end
	end
	
	reduce(@hlink, DIAG_TL, DIAG_BR)
=end
	
end

#compress(x) ⇒ Object



253
254
255
256
# File 'lib/maruku/ext/diagrams/layout.rb', line 253

def compress(x)
	t = x.map do |s| go_up_series(s) end
	final = go_up_parallel(t)
end

#get_preferred(var1, var2) ⇒ Object



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/maruku/ext/diagrams/layout.rb', line 206

def get_preferred(var1, var2)
	hpaths = rec_paths(@hlink, var1, var2)
	vpaths = rec_paths(@vlink, var1, var2)
	puts inspect
	hpaths.each do |h|
		puts "H: #{h.inspect}"
	end
	vpaths.each do |v|
		puts "V: #{v.inspect}"
	end
	
	hsprings = 
	hpaths.map do |h|
		ss = []
		for i in 0..(h.size-2)
			v1,v2 = h[i],h[i+1]
			ss.push  @hsprings[[v1,v2]]
		end
		ss
	end
	vsprings = 
	vpaths.map do |h|
		ss = []
		for i in 0..(h.size-2)
			v1,v2 = h[i],h[i+1]
			ss.push  @vsprings[[v1,v2]]
		end
		ss
	end
	
	
	def go_up_parallel(par)
		final = par[0]
		for i in 1..(par.size-1)
			final = Spring.parallel(final, par[i])
		end
		final
	end
	
	def go_up_series(series)
		tot = series[0]
		for i in 1..(series.size-1)
			tot = Spring.series(tot, series[i])
		end
		tot
	end
	
	def compress(x)
		t = x.map do |s| go_up_series(s) end
		final = go_up_parallel(t)
	end
	
	def sum_of_shrink(series)
		sum = 0
		series.each do |s| sum += s.shrink end 
		sum
	end
	
	def sum_of_stretch(series)
		sum = 0
		series.each do |s| sum += s.stretch  end
		sum
	end
	
	def go_back(imposed, series)
		pref = go_up_series(series)
		if pref.pref > imposed
			# must shrink
			shrink = pref.pref - imposed
			sum = sum_of_shrink(series)
			series.each do |s|
				its_shrink = (s.shrink / sum) * shrink
				its_imposed = s.pref - its_shrink
				if s.imposed
					s.imposed = (its_imposed+ s.imposed)*0.5
				else
					s.imposed = its_imposed
				end
				s.pref = s.pref*0.5 + s.imposed*0.5
			end
		else
			# must stretch
			stretch = imposed - pref.pref 
			sum = sum_of_stretch(series)
			series.each do |s|
				its_stretch = (s.stretch / sum) * stretch
				its_imposed = s.pref + its_stretch
				if s.imposed
					s.imposed = (its_imposed+ s.imposed)*0.5
				else
					s.imposed = its_imposed
				end
				s.pref = s.pref*0.5 + s.imposed*0.5
			end
		end
	end
	
	for i in 0..100
		hpref = compress(hsprings)
		vpref = compress(vsprings)

		width = hpref.pref
		height = vpref.pref
	
		hsprings.each do |series| go_back(height, series) end
		vsprings.each do |series| go_back(width, series) end
	end

	hpaths.each do |h|
		ss = []
		len = 0
		for i in 0..(h.size-2)
			v1,v2 = h[i],h[i+1]
			this = @hsprings[[v1,v2]].imposed
			puts "#{v1} - #{v2}   | "+  ("%0.2f" % this)
			len += this
		end
		puts "LEN: #{len}"
		ss
	end
	
	return hpref,vpref
end

#go_back(imposed, series) ⇒ Object



270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# File 'lib/maruku/ext/diagrams/layout.rb', line 270

def go_back(imposed, series)
	pref = go_up_series(series)
	if pref.pref > imposed
		# must shrink
		shrink = pref.pref - imposed
		sum = sum_of_shrink(series)
		series.each do |s|
			its_shrink = (s.shrink / sum) * shrink
			its_imposed = s.pref - its_shrink
			if s.imposed
				s.imposed = (its_imposed+ s.imposed)*0.5
			else
				s.imposed = its_imposed
			end
			s.pref = s.pref*0.5 + s.imposed*0.5
		end
	else
		# must stretch
		stretch = imposed - pref.pref 
		sum = sum_of_stretch(series)
		series.each do |s|
			its_stretch = (s.stretch / sum) * stretch
			its_imposed = s.pref + its_stretch
			if s.imposed
				s.imposed = (its_imposed+ s.imposed)*0.5
			else
				s.imposed = its_imposed
			end
			s.pref = s.pref*0.5 + s.imposed*0.5
		end
	end
end

#go_up_parallel(par) ⇒ Object



237
238
239
240
241
242
243
# File 'lib/maruku/ext/diagrams/layout.rb', line 237

def go_up_parallel(par)
	final = par[0]
	for i in 1..(par.size-1)
		final = Spring.parallel(final, par[i])
	end
	final
end

#go_up_series(series) ⇒ Object



245
246
247
248
249
250
251
# File 'lib/maruku/ext/diagrams/layout.rb', line 245

def go_up_series(series)
	tot = series[0]
	for i in 1..(series.size-1)
		tot = Spring.series(tot, series[i])
	end
	tot
end

#inspectObject



376
377
378
379
380
381
382
383
384
# File 'lib/maruku/ext/diagrams/layout.rb', line 376

def inspect
	s = ""
	@hlink.each do |v1,a|
		a.each do |v2, spring|
			s += "#{v1.inspect} -> #{v2.inspect} (#{spring.inspect})\n"
		end
	end
	s
end

#rec_paths(links, var1, var2) ⇒ Object

returns [] if there isn’t one



331
332
333
334
335
336
337
338
339
340
341
# File 'lib/maruku/ext/diagrams/layout.rb', line 331

def rec_paths(links, var1, var2)
	all_paths = []
	(links[var1] || []).each do |v, spring|
		if v == var2
			all_paths.push [var2]
		else
			all_paths = all_paths + rec_paths(links, v, var2)
		end
	end
	all_paths.map{|x| [var1]+x}
end

#sum_of_shrink(series) ⇒ Object



258
259
260
261
262
# File 'lib/maruku/ext/diagrams/layout.rb', line 258

def sum_of_shrink(series)
	sum = 0
	series.each do |s| sum += s.shrink end 
	sum
end

#sum_of_stretch(series) ⇒ Object



264
265
266
267
268
# File 'lib/maruku/ext/diagrams/layout.rb', line 264

def sum_of_stretch(series)
	sum = 0
	series.each do |s| sum += s.stretch  end
	sum
end

#to_dotObject



166
167
168
# File 'lib/maruku/ext/diagrams/layout.rb', line 166

def to_dot()
	return to_dot_links(@hlink,@hsprings), to_dot_links(@vlink,@vsprings)
end


170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/maruku/ext/diagrams/layout.rb', line 170

def to_dot_links(links, springs)
	s = "digraph diagram {\n"
	links.each do |var, to_other|
		if not to_other.empty?
			var_ = var.gsub(/^[^_]+_/,'')
			s += "\t#{var} [label = \"#{var_}\" ];\n"
			to_other.each do |v2, spring|
				s += "\t #{var} -> #{v2} [ label = \"#{spring.inspect}\"];\n"
			end
		end
	end
	s += "}\n"
end